【面经】腾讯后端软件开发工程师一面面经

一 Linux常用命令

1.文件和目录操作

  • ls:列出当前目录中的文件和子目录。
  • pwd:显示当前工作目录的路径。
  • cd:切换工作目录,例如cd /path/to/directory
  • mkdir:创建新目录,如mkdir directory_name
  • rmdir:删除空目录,如rmdir directory_name
  • rm:删除文件或目录,如rm file_namerm -r directory_name
  • cp:复制文件或目录,支持递归复制,如cp source_file destinationcp -r source_directory destination
  • mv:移动或重命名文件或目录,如mv old_name new_name
  • touch:创建空文件或更新文件的时间戳,如touch file_name

2.系统信息和性能监控

  • arch:显示机器的处理器架构。
  • uname:显示系统和内核版本信息,如uname -m(显示处理器架构)和uname -r(显示内核版本)。
  • top:实时显示系统中进程的信息,如CPU和内存使用率。
  • ps:显示当前运行的进程,如ps aux
  • kill:终止进程,如kill process_id
  • df:显示磁盘空间使用情况,如df -h
  • du:显示目录的磁盘使用情况,如du -h directory_name。3

3.文本处理和编辑

  • cat:连接和显示文件内容,如cat file_name
  • more/less:逐页显示文本文件内容,如more file_nameless file_name
  • head/tail:显示文件的前几行或后几行,如head -n 10 file_nametail -n 20 file_name
  • grep:在文件中搜索指定文本,如grep search_term file_name
  • sed:流编辑器,用于文本处理和替换,如sed 's/old_text/new_text/' file_name
  • awk:文本处理工具,用于文本处理和数据提取,如awk '{print $1}' file_name

4.网络和远程访问

  • ifconfig/ip:查看和配置网络接口信息,如ifconfigip addr show
  • ping:测试与主机的连通性,如ping host_name_or_ip
  • wget/curl:从网络下载文件,如wget URLcurl -O URL
  • ssh:远程登录到其他计算机,如ssh username@remote_host
  • scp:安全地将文件从本地复制到远程主机,或从远程主机复制到本地,如scp local_file remote_user@remote_host:/remote/directory

5.文件查找和压缩

find:在文件系统中查找文件和目录,如find /path/to/search -name "file_pattern"

mount/umount:挂载和卸载文件系统,如mount /dev/sdX1 /mntumount /mnt

tar:用于文件归档和压缩,如tar -czvf archive_name.tar.gz directory_to_archive

6.数据库和系统管理

psql/mysql:与PostgreSQL或MySQL数据库交互的命令行工具,如psql -U username -d database_namemysql -u username -p

shutdown:关闭或重启系统,如shutdown -h nowshutdown -r now

useradd/userdel:添加或删除系统用户,如useradd usernameuserdel username

7.系统安全和性能

sudo:以管理员权限执行命令,如sudo command

sestatus:查看或设置SELinux的运行状态,如getenforcesetenforce Permissive

top/htop:显示系统资源的实时使用情况和进程信息,如tophtop

二 awk命令

        awk是一种强大的文本分析工具,主要用于处理和分析具有表格结构或格式严格的文本文件。作为一个数据驱动的脚本语言,它提供了丰富的编程功能,如变量、数学运算、字符串处理等,使得文本分析和操作变得高效灵活。其名称来源于三位创始人Alfred Aho、Peter Weinberger和Brian Kernighan的首字母。

基本语法:

语法结构:awk的基本语法结构为awk 'pattern {action}' file,其中pattern部分是用于匹配输入数据的模式,action部分则定义了对匹配数据进行处理的操作。如果没有指定模式,awk会处理所有行。

选项参数:awk支持多种选项参数,例如-F用于指定字段分隔符,-v用于设置变量,-f用于指定脚本文件。

示例

awk '{print $1, $2}' file 打印每行的第一和第二个字段。

awk -F',' '{print $1, $2}' file 使用逗号作为分隔符来打印第一和第二个字段。

工作方式:

        awk逐行读取文本,默认以空格或制表符为分隔符进行字段分隔,并将分隔得到的字段保存在内建变量中,然后按照给定的模式和条件执行对应的操作。与sed不同,awk倾向于将一行分成多个字段进行处理。

        在处理过程中,可以使用逻辑操作符(如&&表示“与”,||表示“或”,!表示“非”)和简单的数学运算符(如+-*/%^)。

三 怎么查看日志

1.使用日志框架

  SLF4J与Logback结合:在Java项目中,SLF4J常与Logback结合使用,Spring Boot默认也是使用这种组合。具体实现方式是在项目中添加slf4j-api依赖,并绑定具体的日志实现框架如logback-classic。通过logback.xml配置文件,可以设定日志的输出格式、级别和存储路径。

异步日志记录:为了不影响应用性能,可以采用异步日志记录。在Spring Boot中使用@Async注解或者通过线程池进行异步打印日志。

日志 存储数据库:特定场景下,可以将日志直接存储至数据库中,方便后续数据分析。例如,通过Spring AOP自定义注解实现日志的解耦打印,减少对业务代码的侵入。 

2.实时追踪日志

tail -f命令:使用tail -f命令可以实时追踪日志文件的更新。这种方式适合长时间监控日志变化,以便及时发现和解决问题。

日志回滚:当日志文件过大时,可以使用日志回滚策略,如Logback提供的按时间和文件大小回滚,保持日志文件的可管理性。

3.日志筛选

结合grep工具:通过grep过滤特定关键字或正则表达式,可以从大量日志中快速定位到需要的信息,例如tail -f server.log | grep 'ERROR'

日志级别控制:合理设置日志级别(Trace, Debug, Info, Warn, Error, Fatal),可以在不同开发阶段或问题排查时提供合适详尽程度的日志信息。

4.集中日志管理

ELK Stack:对于分布式系统或大规模项目开发,可以使用ELK Stack(Elasticsearch, Logstash, Kibana)进行集中日志管理。Logstash负责收集和过滤日志,Elasticsearch存储日志,而Kibana提供可视化查询界面。

Filebeat:在ELK架构中,Filebeat作为轻量级日志采集器,部署在各个服务节点上,将日志汇总传输给Logstash,是大规模日志管理的优化选择。

5.第三方工具

Android日志查看:在Android开发中,使用Android Studio的Logcat工具可以实时查看和过滤应用日志,便于调试和定位问题。

第三方日志插件:例如Logview和Spy-js等,这些工具可以直接嵌入开发环境中,提供更直观便捷的日志查看和搜索功能。

6.日志分析与报表

自动化日志分析:借助如ELK Stack中的Kibana等工具,可以定时生成日志分析和报表,帮助开发团队了解系统的运行状态和趋势。

自定义日志分析脚本:根据项目需求,可以编写自定义的日志分析脚本,例如使用Python等语言处理日志文件,提取关键指标。

四 如何使用命令查看程序运行的栈信息

1.gstack命令

使用方法:gstack pid,这会打印出进程中每个线程的堆栈跟踪。如果进程是多线程的,gstack将输出每个线程的详细堆栈信息。

gstack可以直接连接到命令行中指定的pid的活性进程,并打印执行堆栈跟踪。如果ELF符号存在于二进制文件中,gstack会打印出更详细的堆栈跟踪信息。

2.使用strace查看堆栈信息

使用方法:strace -p pid,其中pid是目标程序的进程ID。这会显示程序运行时的系统调用信息,对于排查程序行为特别有帮助。

四 netstat命令

        netstat命令是Linux系统中一个非常重要的网络工具,用于查询和统计网络连接的状态和数据传输情况。netstat命令能够显示网络连接的详细信息,比如连接状态、使用的协议、本地和远程地址以及端口号等。此命令对于网络故障排除和性能调优至关重要。

五 Linux网络抓包用什么命令实现

        在Linux系统中,通常使用tcpdump命令来实现网络抓包。tcpdump是一个功能强大的网络抓包工具,它可以通过命令行来捕获和显示网络数据包的内容,支持对数据包的过滤和分析,适用于各种网络故障诊断和安全监控场景。

六 top命令如何查看僵死进程

        僵死进程是指那些已经结束但其父进程尚未回收的进程,它们在系统中占用了一定的系统资源但不再执行任何操作。这些进程在top命令的输出中通常显示为"zombie"状态。具体方法如下:

        1.使用top命令查看僵尸进程:运行top命令后,在界面中可以找到标记为"Zombie"的进程,这些就是僵死进程。在top命令的默认输出中,可以看到各个进程的状态,其中"Zombie"表示的就是僵死进程。

        2.结合ps命令查找僵尸进程的详细信息:使用ps命令结合grep可以更精确地定位和分析僵尸进程及其父进程的信息。命令ps -A -ostat,ppid,pid,cmd | grep -e '[Zz]'会列出所有状态为"Zombie"的进程及其父进程ID、命令名称等详细信息。

        3.处理僵尸进程的方法:通常情况下,杀死僵尸进程的父进程是解决僵尸进程的主要方法,因为僵尸进程已经结束,不能直接被杀死。首先使用ps -o ppid= -p <child_id>找到僵尸进程的父进程ID,然后使用kill -9 <parent_process_ID>命令结束父进程,从而释放僵尸进程所占用的系统资源。

七 进程,线程和协程有什么区别

1.定义

  • 进程:一个独立的执行环境,它包括一个程序计数器、一组CPU寄存器、一个堆栈、一组环境变量以及至少一个打开文件的集合等。它是系统进行资源分配和调度的一个独立单位,可以看作应用程序的一次动态执行过程。
  • 线程:运行在进程上下文中的逻辑流,是程序执行流的最小单元。线程包括线程ID、当前指令指针、寄存器和堆栈等。一个进程可以包含多个线程,这些线程共享进程的资源,如内存空间和文件描述符。
  • 协程:一种用户级的轻量级线程,完全由用户控制。协程拥有自己的寄存器上下文和栈,在调度切换时保存和恢复这些上下文,避免内核切换的开销,因此比线程更加高效。

2.资源分配

  • 进程:独立拥有系统资源,每个进程有独立的地址空间,互不影响。进程间的资源隔离增加了安全性,但同时也增加了资源消耗。
  • 线程:共享其所属进程的资源,如内存地址空间和文件描述符。这种资源共享减少了资源消耗,但也带来了线程间数据同步的挑战。
  • 协程:不直接操作或持有操作系统资源,而是通过运行时库在用户模式下进行调度。协程使用的资源远少于线程和进程,因此在高并发场景下性能优势明显。

3.上下文切换

  • 进程:上下文切换时需要保存和恢复较多的状态信息,包括内存空间、全局变量和打开的文件描述符等,因此切换成本较高。
  • 线程:虽然共享一些进程资源,但仍需保存和恢复线程局部存储(如堆栈)、寄存器等状态,切换成本低于进程但高于协程。
  • 协程:只需保存和恢复寄存器上下文和栈,且完全在用户态进行,避免了内核态的切换,因此上下文切换非常快。

4.并发与并行

  • 进程:在多核处理器上支持真正的并行执行。多个进程可以同时在不同的处理器核心上运行,充分利用多核系统的并行能力。
  • 线程:同样支持多核并行执行,但由于共享资源,线程间的调度和同步比进程复杂。
  • 协程:主要实现的是并发而非并行,适用于IO密集型任务。通过在一个线程内切换协程,可以有效利用等待IO操作的时间。

5.适用场景

  • 进程:适用于需要独立资源空间和强隔离性的应用场景,如不同的用户请求处理。
  • 线程:适合于同一进程内部需要并行执行多个子任务的场景,如多线程下载。
  • 协程:适用于IO密集型和高并发应用,如网络服务器的请求处理,能有效提

         综合考虑,进程提供了完整的资源隔离和安全性,但资源消耗较大;线程在共享资源的同时降低了资源消耗,提高了执行效率,但同步和数据一致性成为新的挑战;协程则以最小的资源占用实现了高效的并发操作,特别适用于处理IO密集型任务,但其应用范围受限于编程语言和平台的支持。

九 进程之间的通信方式有哪些?

        进程之间的通信方式主要包括:管道、命名管道、消息队列、共享存储、信号量、套接字和信号。

        管道:管道分为匿名管道和命名管道。匿名管道主要用于父子进程或兄弟进程之间的通信,它是半双工的,数据只能单向流动,且只能在具有亲缘关系的进程间使用。命名管道(FIFO)则允许无亲缘关系的进程间进行通信,它同样采用半双工方式,但通过一个磁盘节点实现,使得任何有适当权限的进程都可以对其进行访问。

        消息队列:消息队列是一种在内核中存储消息链表的方式。与管道相比,消息队列能够承载更丰富的信息,并且可以按消息类型进行读取,不必按照先进先出的顺序。发送和接收进程通过队列实现异步通信,发送方将消息放入队列后即可继续执行其他任务,接收方在需要时从队列中获取消息。

        共享内存:共享内存是映射一段内存区域,让多个进程可以直接对其读写。这种方式是最快的 IPC 机制,因为它避免了数据在内核和用户空间之间的拷贝。共享内存通常与其他同步机制如信号量配合使用,以控制多个进程对共享资源的访问。

        信号量:信号量是一个计数器,用于控制多个进程对共享资源的访问。它常作为一种锁机制来防止同时访问共享资源。信号量不仅用于进程间的同步,也广泛用于线程间的同步操作。

        套接字:套接字是一种通用的进程间通信机制,支持不同主机之间的进程通信。套接字可用于实现同一台机器上的进程通信,也可以用于网络通信。套接字提供了可靠的数据传输,并支持多种网络协议。

        信号:信号是一种较为复杂的通信方式,用于通知进程某个事件已经发生。信号可以在任何时候发送给进程,而无须知道其状态。如果信号被设置为阻塞,它的传递会被延迟,直到阻塞解除。

十 前端发起请求之后到达后端中间过程是什么

        当前端发起一个HTTP请求时,通常使用AJAX技术或现代前端框架提供的API(如fetch API或axios库)来发送请求。请求中包含了URL、HTTP方法以及其他请求头和数据等信息。这些信息会被封装成一个HTTP请求报文,通过网络发送到指定的服务器。

        接下来,请求报文通过互联网到达目标服务器。这个过程中可能涉及到DNS解析,以将域名转换为服务器的实际IP地址。在TCP/IP协议族的支持下,建立起客户端与服务器之间的网络连接,通常是通过三次握手来完成连接的建立。

        一旦网络连接建立成功,服务器便开始接收并处理请求。在Java应用中,常用的Web服务器如Tomcat会将请求报文转发给相应的Servlet容器,具体处理流程如下:

  1. 服务器接收:服务器通过Connector接收来自客户端的请求,并将其封装成Request和Response对象。
  2. 分发请求:请求对象被传递给Container(即Servlet容器),然后继续传递给具体的Servlet处理。
  3. 控制器处理:在Spring Boot应用中,DispatcherServlet作为前端控制器,负责将请求分发给相应的Controller进行处理。
  4. 业务逻辑处理:Controller中的业务逻辑通常会调用Service层的方法来处理请求,这可能涉及数据库访问或其他外部资源的调用。
  5. 生成响应数据:完成业务逻辑处理后,Controller会生成响应数据,比如JSON格式的响应体。
  6. 返回响应:最终,服务器通过Connector将响应数据返回给客户端。   响应数据通常包括HTTP状态码、响应头和响应体等信息,前端收到响应后会根据内容进行页面更新或数据展示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值