面试公司:腾讯科技
面试岗位:后端软件开发工程师
面试过程:一面(50min)
面试总结:
算法题占了很多时间,后面基本上全是问八股,项目方面鲜有涉及。
面试官还是挺好的,中间会给一点引导,但自己操作系统和Linux命令部分准备的不够充分,回答的稀烂。
问八股文问到我头晕,真正工作上用得到这些八股文么?
自我介绍(5 min)
手撕两道算法题(30 min)
a. 旋转字符串
b. 删除链表中重复元素
Linux常用命令有哪些
awk命令有了解过嘛
平时怎么查看日志
有没有用过命令查看程序运行的栈信息
netstat命令怎么使用?用来干啥?
Linux网络抓包用什么命令来实现?
top命令用过嘛?如何查看僵死进程?
进程,线程和协程有什么区别?
进程和线程的区别在哪里?
进程之间的通信方式有哪些?
除了管道还有什么通信方式?
前端发起请求之后到达后端,中间过程是什么?
public String rotateString(String s, int k) {
int n = s.length();
k = k % n; // 处理k大于字符串长度的情况
return s.substring(n - k) + s.substring(0, n - k);
}
public ListNode deleteDuplicates(ListNode head) {
ListNode current = head;
while (current != null && current.next != null) {
if (current.val == current.next.val) {
current.next = current.next.next;
} else {
current = current.next;
}
}
return head;
}
常用的Linux命令有:ls
、cd
、pwd
、cp
、mv
、rm
、mkdir
、rmdir
、cat
、less
、grep
、find
、chmod
、chown
等。这些命令可以帮助我们完成文件和目录管理、权限设置等操作。
ls -l
显示详细信息cd /home/user/Documents
切换到Documents目录pwd
输出 /home/user
cp source.txt destination.txt
复制source.txt到destination.txtmv file.txt /home/user/
移动文件到指定目录mv oldname.txt newname.txt
重命名文件rm file.txt
删除文件rm -r /home/user/old_directory
递归删除目录及其内容mkdir new_directory
创建名为new_directory的目录rmdir empty_directory
删除名为empty_directory的目录cat file.txt
显示file.txt的内容less file.txt
分页查看file.txt的内容(使用 q
退出)grep "pattern" file.txt
在file.txt中搜索"pattern"find /home/user -name "*.txt"
在/home/user目录下查找所有扩展名为.txt的文件chmod 755 script.sh
将script.sh的权限设置为-rwxr-xr-xchown user:group file.txt
更改file.txt的所有者为user,所属组为group有了解过,awk
是一种强大的文本处理工具,它的主要作用是对文本文件中的数据进行筛选、提取和处理。
基本格式:
awk 'pattern { action }' file
pattern
:要匹配的模式(可以是正则表达式)action
:对匹配行执行的操作,用大括号括起来file
:输入文件简单打印每行
awk '{ print }' file.txt
打印文件file.txt的每一行。
打印某个字段
awk '{ print $1 }' file.txt
打印file.txt每一行的第一个字段。
字段定界符
awk -F, '{ print $1 }' file.csv
指定字段分隔符为逗号,打印file.csv每一行的第一个字段。
模式匹配
awk '/pattern/ { print }' file.txt
打印file.txt中包含指定模式pattern
的行。
条件处理
awk '$3 > 100 { print $1, $3 }' file.txt
打印文件file.txt中第三个字段大于100的行的第一个和第三个字段。
计算总和
awk '{sum += $1} END {print sum}' file.txt
计算file.txt中第一个字段的总和。
cat:显示整个日志文件内容
cat /var/log/syslog
适用于小型日志文件,但对于大型日志文件,可能会一次性输出太多内容。
tac:反向显示整个日志文件内容
tac /var/log/syslog
适用于查看最新的日志条目,因为它从文件的末尾开始显示。
more 和 less:分页显示日志文件
more /var/log/syslog
less /var/log/syslog
less
更为强大,允许你在文件中前后移动,q
退出查看。
tail:查看日志文件的最后几行
tail /var/log/syslog
tail -n 50 /var/log/syslog # 查看最后50行
tail -f /var/log/syslog # 实时查看(跟踪)日志的新增行
tail -f
对于监控服务实时输出非常有用。
head:查看日志文件的前几行
head /var/log/syslog
head -n 20 /var/log/syslog # 查看前20行
grep:搜索日志文件中的特定模式
grep "ERROR" /var/log/syslog
grep -i "error" /var/log/syslog # 忽略大小写
grep "ERROR" /var/log/syslog | less # 分页查看搜索结果
awk:筛选和处理日志文件中的特定字段
awk '/ERROR/ {print $0}' /var/log/syslog # 搜索含“ERROR”的行
awk '{print $1, $2, $3}' /var/log/syslog # 打印前3个字段
logrotate:管理日志文件的轮替
有,用过gdb
和pstack
来查看程序的栈信息。gdb
是一个强大的调试工具,而pstack
可以直接输出运行进程的栈信息。
gdb
调试器GNU Debugger(gdb
)是一个强大的工具,可以用来查看正在运行的程序的栈信息。以下是使用 gdb
查看栈信息的步骤:
找到进程ID(PID): 使用 ps
命令找到要调试的进程的PID。
ps aux | grep program_name
附加到正在运行的进程: 使用 gdb
附加到进程。
sudo gdb -p PID
显示栈回溯: 在 gdb
提示符下,输入 bt
(backtrace)命令来查看栈信息。
(gdb) bt
退出gdb:
(gdb) quit
pstack
命令pstack
用于显示给定 PID 的栈回溯信息。
安装: 在大多数Linux发行版中,你可以通过包管理器安装 pstack
。
sudo apt-get install psmisc # Ubuntu/Debian
sudo yum install psmisc # CentOS/RHEL
使用 pstack
:
sudo pstack PID
/proc
文件系统你可以通过 /proc
文件系统手动查看进程的栈信息。
找到进程ID(PID): 使用 ps
命令找到要调试的进程的PID。
ps aux | grep program_name
查看栈内容: 使用 cat
或 hexdump
查看 /proc/[PID]/stack
文件。
cat /proc/PID/stack
该文件也可以通过 hexdump
以更易读的方式查看:
hexdump -C /proc/PID/stack
netstat
命令用于显示网络相关信息,例如网络连接、路由表、接口状态等。常用参数包括netstat -an
查看所有网络连接,netstat -tuln
查看所有监听端口。
可以使用tcpdump
或wireshark
来实现网络抓包。tcpdump
是一个命令行工具,而wireshark
提供图形界面,更加直观。
用过,top
命令用于显示系统的资源使用情况。
在top
界面中可以按z
来高亮显示僵死进程,或直接使用ps -aux | grep Z
命令来查看。
进程是资源分配的基本单位,线程是CPU调度的基本单位,而协程是一种用户态的轻量级线程。进程之间相互独立,线程共享进程的资源,而协程通过用户程序自己来调度,通常比线程更加高效。
使用场景
使用场景
使用场景
内存独立性 | 独立 | 共享 | 共享 |
创建销毁开销 | 大 | 较小 | 最小 |
上下文切换开销 | 大 | 较小 | 最小 |
调度方式 | 操作系统调度,抢占式 | 操作系统调度,抢占式 | 用户态调度,协作式 |
编程复杂度 | 独立性高,易管理,不需同步 | 需处理同步和锁,复杂度较高 | 需显式挂起和恢复,代码可读性好 |
使用场景 | 多个独立的任务,需隔离的任务 | 单个应用的并发任务,如Web服务器 | 高并发I/O密集型任务,如网络编程 |
进程间通信(IPC)方式有:管道(Pipe)、消息队列(Message Queue)、共享内存(Shared Memory)、信号量(Semaphore)、套接字(Socket)等。
只能在有亲缘关系的进程(如父子进程)之间通信。
可以在任何无亲缘关系的进程之间通信。
1.客户端发起请求
2.DNS解析
3.建立TCP连接
4.发送HTTP请求
5.网络传输
6.服务器接收请求
7.应用服务器处理请求
8.业务逻辑处理
9.数据库及外部系统交互
10.构建响应
11.发送响应
12.客户端接收响应
13.处理和渲染
14.关闭连接
#面经##腾讯##软件开发2024笔面经##面试##后端#