面试题总结 ---Linux篇

1.return、exit、_exit三者的区别(最标准,写在你的面试文档标题)

2.fopen和open的区别是什么

open是系统调用(内核提供);fopen是 C 标准库函数,在用户层封装了 open。

①层级:open属于系统调用,直接和内核交互;fopen是库函数,底层内部调用 open,并且在用户态增加了文件缓冲区。

②返回值:open 返回文件描述符 fd(int 整型);fopen 返回FILE*文件指针。

③缓冲区:fopen自带用户态 IO 缓冲区,减少系统调用次数,读写效率更高;open没有用户态缓冲区,每次 read/write 都会直接陷入内核。

④适用场景:

fopen:普通文本读写、日志这类上层业务,简单文件操作。

open:需要底层控制文件(修改文件属性、非阻塞 IO、epoll 多路复用),网络 / 底层开发常用。

⑤关闭接口:open 用close(fd);fopen 用fclose(fp)。

补充:fclose 会自动刷新用户缓冲区再调用 close;直接 close (fd) 不会。

3.语言级缓冲区和系统级缓冲区的区别是什么?

语言级缓冲区 ,是 C 标准库的用户态缓冲区,存放在应用程序内存。数据先暂存在这里,不会直接进入内核。如果程序直接_exit粗暴退出,不会自动刷新,数据会丢失,所以会出现刷新不及时。

系统级缓冲区是操作系统内核的页缓存。只要数据写入内核缓冲区,就算进程退出,操作系统依然会负责把缓冲区的数据写到磁盘,自动处理。

4.exit和_exit 对对用户态缓冲区和系统级缓冲区分别会做什么操作?

5.什么是行缓冲

行缓冲是 stdio 用户缓冲区的一种缓冲策略,标准输出 stdout 默认是行缓冲模式 。 规则就是:当往缓冲区写入换行符\n的时候,就自动调用 fflush,把缓冲区里所有数据刷到内核。 设计这个的目的,是为了终端交互场景。比如我们在控制台打印日志,一行结束加换行,用户就能立刻看到这一行的输出,不用等缓冲区填满。

6.怎么理解Linux中的重定向?

7.三种缓冲类型分别是什么?

8.什么是ELF

ELF 是 Linux 下的可执行与可链接格式,是目标文件、可执行程序、动态库的标准文件格式。 里面包含 section(段,用于编译链接,readelf -S 查看)和 segment(程序段,操作系统加载程序到内存时使用)。

9.execl和execv的区别是什么

10.什么是虚拟文件系统?(VFS)

虚拟文件系统是 Linux 内核里的一层抽象软件层,位于用户态和底层真实文件系统(ext4、xfs、tmpfs 等)中间。 它屏蔽了不同文件系统之间的差异,向上给应用程序提供统一的一套系统调用接口(open/read/write/close);向下对接各种不同的文件系统。

  1. super_block 超级块:描述整个文件系统的整体信息
  2. inode 索引节点 :描述一个文件,记录文件大小、权限、磁盘块,不存文件名
  3. dentry 目录项:保存文件名、目录层级,用于快速路径查找(目录缓存)
  4. file 文件对象:进程打开一个文件后,在内核中创建的实例,记录文件当前读写偏移等信息

11.虚拟文件系统和文件描述符表的关系是什么?

open系统调用 → 交给 VFS

VFS 查找路径,找到 inode,新建内核struct file

当前进程的 fd 表 里,找一个空闲下标,把struct file的指针存入

返回这个下标数字,就是 fd 给用户程序使用

多个进程打开同一个文件 :共享同一个 inode;但是各自会生成独立struct file,各自 fd 表保存各自 file 指针,读写偏移互相独立。

同一个进程多次 open 同一个文件:fd 表里面多条不同 fd,指向多个独立的 struct file

fork 子进程:子进程复制父进程 fd 表,父子 fd 指向同一个 struct file,读写偏移共享。

12.常见的文件系统有哪些?

常见的有 ext4、XFS 这类磁盘上的日志文件系统;还有 tmpfs、proc、sys 这类内存伪文件系统;另外还有 NFS 网络文件系统,它们都由 VFS 提供统一接口。

14.什么是日志文件系统

日志用来记录文件系统元数据的变更操作。当系统意外断电崩溃,重启后依靠日志快速恢复,防止文件系统元数据损坏,避免磁盘分区无法挂载。日志一般只记录元数据,不记录文件内的实际数据。

15.我想知道进程的虚拟地址空间和 C 语言中的内存管理所说的代码区堆栈这些有区别吗?

二者是同一个东西,只是视角不同。进程虚拟地址空间是操作系统给进程的独立虚拟内存空间;我们 C 语言说的代码段、全局区、堆、栈,就是虚拟地址空间内的各个分区。 代码段放指令,全局段放全局静态变量;堆由 malloc 手动管理,栈保存局部变量,函数自动管理。

16.同步/互斥/临界资源/临界区

互斥:保证同一时间只有一个线程访问临界资源;同步:控制线程执行的先后顺序。同步和互斥就是多线程下保护共享数据、协调线程运行的机制。

临界资源:多个线程都能访问的共享资源(全局变量、缓冲区、文件等) 临界区:操作临界资源的那一段代码。

同步用于线程 / 进程存在执行依赖的场景,需要等待特定条件满足才继续执行。

17.什么是死锁?

多个线程互相拿着对方需要的锁,都不释放,互相永久等待,程序卡死。 死锁四个必要条件:互斥、持有并等待、不可剥夺、循环等待。

18.什么情况会造成死锁

18.管道是用户态实现的同步互斥吗?

不是,同步互斥由 Linux 内核完成 ,我们用户态代码不用手动写 mutex、条件变量,直接 read/write 就行。 普通手写生产者消费者,是用户态代码自己用锁 + 条件变量来实现同步互斥。

19.管道和我们手写的生产者消费者模型的区别什么?

管道的缓冲区是内核自己实现的,他的同步互斥不需要我们去保证,但是我们自己写的生产者消费者模型需要我们自己去进行对在内存级的缓冲区进行使用条件变量和互斥锁来保证同步互斥。

20.匿名管道的特点是什么?

① 面向字节流。(面向字节流的意思就是只保证数据是按顺序到达的,但是不对数据的边界进行区分,就是说到了的数据不能确定它是第几段发来的,除了管道是面向字节流的,TCP也是)

②用于父子进程和兄弟进程之间进行通信。

③因为是由内核为进程创建的一段缓冲区,所以匿名管道的生命周期随进程;

④管道自带同步互斥机制(同步就是说数据是按照顺序进入管道的,也就是说不管是线程还是这数据都是按顺序进入的,互斥就是说这个临界资源(共享内存、文件)只能同时被一个线程或者进程访问)

20.同步的使用场景是什么?

  1. 生产者消费者模型(最常考) 缓冲区空 → 消费者阻塞等待生产者放数据;缓冲区满 → 生产者阻塞,等消费者取走数据腾出空位。 用条件变量 / 信号量完成同步,mutex 负责互斥保护缓冲区。
  2. 任务等待完成 主线程创建子线程去执行耗时任务,主线程需要等待子线程计算完毕拿到结果 ,再继续执行。比如 pthread_join 本质就是同步。
  3. 多阶段流水线任务 任务分多步,线程 A 做完第一阶段,线程 B 才能开始第二阶段。A 完成后唤醒 B,B 等待 A 的信号。
  4. 进程间同步:管道 管道读端缓冲区为空,读操作阻塞,等待写端写入数据,内核自带同步机制。

21.互斥的使用场景是什么?

多个执行流(线程 / 进程)要访问【共享临界资源】,并且会修改资源,同一时刻只允许一个执行流操作,就需要互斥。

①多线程修改同一个全局变量 比如多线程同时累加计数器,不加锁会出现计数结果错误,用 mutex 互斥保护。

②多线程操作同一个共享缓冲区 生产者消费者模型里,多个生产者 / 消费者读写缓冲区,访问缓冲区的代码段需要互斥锁保护。

③多线程操作同一个文件 多个线程同时写同一个文件,不加锁会导致内容穿插、乱码,需要互斥。

④多线程操作同一个硬件资源 比如多个线程操作同一个串口,不能同时读写,需要互斥。

22.什么是进程池?

创建进程(fork)开销很大:要复制 PCB、虚拟内存页表等。如果任务频繁,反复 fork+exit 会非常耗 CPU。 进程池提前一次性创建若干子进程,统一管理:

①初始化:预先创建 N 个子进程,全部阻塞等待任务;

②任务到达:主进程把任务交给空闲子进程去处理;

③任务完成:子进程不退出,回到池子里继续等待下一个任务;

④全部任务结束,再统一释放销毁所有子进程。

工作模型:主进程是任务分发者,池子里多个子进程负责干活。 进程之间通信:一般用管道、消息队列来传递任务。

23.进程池和线程池的区别?

  • 进程池:进程独立,有独立虚拟地址空间;开销大;进程崩溃不会影响其他进程。
  • 线程池:线程共享进程地址空间;创建切换开销小;一个线程崩溃会导致整个进程挂掉。

24.什么时候选线程池什么时候选进程池?

IO 密集型优先线程池;CPU 密集型、任务需要内存隔离、任务容易崩溃,优先进程池。因为线程之间是共享一个进程的虚拟地址空间的,如果一个线程崩溃很可能会引起整个线程池奔溃;

线程共享同一个进程的虚拟地址空间,创建、上下文切换开销很小。 适合 IO 密集型任务:网络读写、文件读写、数据库请求。线程大部分时间阻塞等待 IO,CPU 压力不大。

缺点:一个线程崩溃,会导致整个进程直接退出;多线程操作共享变量需要手动做同步互斥保护。

进程池 每个进程有独立虚拟地址空间,隔离性强。fork 开销大,上下文切换代价更高。 适合 CPU 密集型任务 (大量计算),或者任务不稳定容易崩溃的场景。一个进程崩溃,不会影响主进程和其他子进程。不想一个任务挂掉把整套服务搞崩 → 进程池

25.匿名管道和命名管道的区别

不要太悲观,境随心转,至少你还活着不是吗?

-------------- 2026.9.12 20:08

相关推荐
normanhere1 小时前
防火墙来回路径不一致导致的网速异常
运维·服务器·网络
oooo_z1 小时前
美股历史K线数据API接口选型指南:iTick覆盖1分钟到月线全周期
服务器·前端·javascript
T1mzhou1 小时前
ARM64 Linux 6.10 内核驱动(14):drivers/base/platform.c:板级设备主战场
linux·c语言·开发语言·arm开发
微露清风1 小时前
Linux 虚拟地址空间:一道屏障、一张地图、一场延迟兑现的博弈
linux·服务器
zx_741484811 小时前
【Linux入门】Shell 与第一个 Shell 脚本:认识命令行解释器,写出 Hello World
linux·运维
2601_962218472 小时前
万象生鲜系统智能报表引擎技术为生鲜企业提供数字化经营分析能力
大数据·运维·微服务·云原生·架构
网硕互联的小客服2 小时前
反向路径过滤(rp_filter)是什么?多网卡服务器配置详解
运维·服务器·网络
GPFyes2 小时前
科东隔离传输失败E文本校验错误
运维·服务器·网络
是程不是序2 小时前
信创终端安全管理怎么落地?纳管、控权、护数据三段走
运维·网络·安全·电脑·系统安全