Linux内核笔试复盘:考点拆解与备考路线全解析
2026/8/30 5:40:07 网站建设 项目流程

2018年秋招,我通过学长内推拿到了滴滴出行的内推笔试资格,岗位是Linux内核工程师。笔试安排在周六晚上,远程在线答题,一共两个小时出头。当时我对内核的理解其实还很稚嫩,网上刷过不少“Linux面试题”,但真打开试卷才发现,这套题和平时背的那些零散知识点完全是两码事。它很少直接问“进程和线程的区别是什么”这种一句话能答完的问题,而是把一个概念塞进具体场景,让你判断、解释、设计。今天回头复盘,那场笔试真正让我想清楚了一件事:基础架构团队招内核工程师,要的不是会背八股的人,而是能顺着一条调用链把系统讲明白的人。这篇文章我会完整拆解当年的笔试题型、考点和答题思路,再给出一份可落地的Linux内核备考路线,不管是准备校招还是想转内核方向,都能拿来直接用。

1. 笔试复盘:Linux内核岗位到底在筛什么人

1.1 岗位JD与笔试考察方向

先说我投这个岗位时看到的JD。虽然具体描述会随部门和年份变化,但核心都落在几件事上:负责服务器端Linux内核的定制与优化、容器和虚拟化场景下的内核适配、性能调优、稳定性问题排查。也就是说,这个岗位不是天天写业务代码的,而是要长期和操作系统底层打交道。因此笔试也好,后续面试也好,考察方向都围绕操作系统基础、C语言功底、Linux工具链和系统分析思维展开。

这一点很关键,直接决定了你该怎么复习。如果你按“算法+数据库+网络”的标准后端岗套路去准备,大概率会在内核卷子上吃亏。你得把重点放在进程调度、内存管理、文件系统、同步机制、中断处理、系统调用这类操作系统核心概念上。记得当时一起准备的同学,还在疯狂刷SQL和Redis八股,结果拿到卷子完全不在一个频道上。所以提醒一句:投递之前一定要把岗位方向吃透,内核岗和业务后端岗的复习路径差异非常大。

1.2 试卷结构、题量与时间分配

我当时拿到的那套卷子,整体结构可以分成四块:选择题、简答题、情景分析题、编程题。选择题基本覆盖Linux常用命令、C语言结果输出、操作系统概念辨析;简答题多为“描述xx机制的工作原理”或“比较A和B的区别”;情景分析题最费时间,通常会给你一个具体的内核场景,比如“某进程卡死,你如何定位”“网卡中断过高怎么办”;编程题则比较直接,一般是一道系统编程或算法题,考察C代码能力。

时间上是两个小时左右,题量不算小。我当时估算了一下,如果按部就班从选择题做到编程题,很可能最后编程题时间不够。所以我拿到卷子后先花五分钟把所有题目浏览了一遍,然后先做编程题,再回头处理简答和情景题。这个策略在后面几次面试中也帮了不少忙,先把硬骨头啃掉,至少保证最容易拉开差距的大题不空着。你别小看这个浏览动作,它能帮你提前判断哪道题能拿分,哪道题需要放弃,避免在低分值题目上耗太多时间。

1.3 内推笔试和普通网申笔试的差异

这里想多说一句内推笔试的定位。很多同学以为内推就是一个“免笔试”的通道,其实大部分公司并不是这样,尤其是技术岗。滴滴的这轮内推笔试,我感觉和普通网申笔试最大的差别不在难度,而在针对性。普通海选笔试更像通用能力测试,题量不小但深度有限;内推卷子会更贴近部门方向,Linux内核岗位就会出现更多系统底层题,而不只是泛泛的操作系统常识。

所以如果你拿到了内推资格,千万别掉以轻心。相反,你应该把JD里提到的技术栈逐条列出来,对照自己的知识盲区提前补。比如JD里写“熟悉内核内存管理、进程调度”或“了解容器、虚拟化技术”,这些基本就是笔试和面试的高频区。我当时就是吃了这个亏,以为内推笔试会简单,结果对虚拟化相关概念准备不足,丢了一些分。

2. 考点拆解:七个方向几乎涵盖了整张卷子

2.1 C语言与计算机基础:看似基础,实则筛人

内核是C语言的天下,笔试里C语言题目权重不低。我当时遇到的选择题里,就有结构体对齐、指针运算、内存布局相关的内容。比如给一个包含char、int、char指针的结构体,让你在32位和64位环境下分别算sizeof;再比如写出某段指针运算代码的输出结果。这种题看起来基础,但非常容易错,因为很多人平时只会在IDE里跑,不会去抠内存布局。

结构体对齐的规则其实不复杂:每个成员按自身对齐值对齐,整个结构体大小要按最大对齐值对齐。但加上#pragma pack(1)或者位域之后,结果就会变化。建议复习时把《C专家编程》里关于内存和指针的部分翻一翻,再配合常见笔试题练一遍,基本可以应付。另外一个高频点是数组名和指针的区别,sizeof(arr)sizeof(ptr)的结果经常被拿来出题,这类题只要把概念理清就不会丢分。

2.2 进程线程与调度:永远的内核必考点

进程与线程是内核笔试里最不可能缺席的部分。常见问法有:进程和线程的本质区别是什么、Linux里为什么没有严格区分进程和线程、CFS调度器如何保证公平性、nice值对优先级的影响、上下文切换到底在切换什么。

我当时在准备阶段就被一个问题卡过:看起来进程和线程都有task_struct,区别到底在哪?后来想明白,关键不是“有还是没有”task_struct,而是它们共享什么资源。进程拥有独立的地址空间、独立文件表、独立信号处理;线程是在同一个地址空间里,共享mm_struct、文件表、信号处理函数,但拥有独立的内核栈、寄存器上下文和调度实体。所以在Linux里,“线程”本质上是“共享资源的一组task_struct”,这个理解方式比单纯背定义好用多了。

关于CFS调度器,笔试可能会问到“为什么nice值越大优先级越低”或者“vruntime是什么”。你不需要把红黑树细节背下来,但至少要明白:CFS按虚拟运行时间(vruntime)挑选下一个运行的进程,nice值影响的是权重,权重越大,vruntime增长越慢,获得的CPU时间越多。能讲到这个层面,已经比绝大多数背概念的人强了。

2.3 内存管理:从malloc到页表的完整路径

内存管理这块,笔试一般会从用户态和内核态两个层面出题。用户态常问malloc到底做了什么、为什么malloc后没有立刻占用物理内存、mmap和read/write有什么区别、虚拟地址空间怎么布局。内核态则常问伙伴系统、slab分配器、页表、缺页异常、OOM机制。

我当时印象比较深的一道简答题是:进程申请了1GB虚拟内存但只写了其中一小部分,物理内存占用为什么没有1GB。本质上这就是虚拟内存和按需分页的机制:malloc只会修改进程的地址空间,只有当真正访问到某个页面且页表项不存在时,才会触发缺页异常去分配物理页。如果你能继续补充“伙伴系统按2的幂次分配物理页块,slab分配器用来缓存小块对象”,说明你对内核内存分配体系有完整认识。

很多同学容易栽在“内存泄漏”和“内存占用”这类概念上。笔试题里如果给了一段malloc后没有free的代码,要小心判断:是内存泄漏还是正常推迟释放,得结合程序的生命周期分析。进程退出后,操作系统会回收它所有的内存,这种不算真正的泄漏;长期运行的守护进程内存只涨不降才是问题。

2.4 并发与同步:自旋锁、信号量和RCU怎么考

内核开发绕不开并发。笔试里常见的对比题是自旋锁和信号量的区别、互斥锁和信号量的区别、读写锁适合什么场景、RCU又是什么。这里我建议不要机械背区别,而是抓住一条主线:临界区里能不能睡眠、临界区执行多久、竞争激烈程度。

自旋锁是忙等待,在等待期间不会睡眠,适合短临界区,而且持有锁期间不能睡眠;信号量可以睡眠,适合长时间持有锁的场景;mutex又比信号量更严格,更贴近“互斥”的语义。读写锁允许多个读者并行,适合读多写少的场景;RCU则更进一步,读侧基本无锁,靠发布-订阅机制实现安全的延迟回收。笔试中如果你能把“为什么读多写少用读写锁或RCU”讲清楚,得分点就齐了。

更进阶的是中断上下文。笔试中会出现“在中断处理函数里可以用信号量吗”这种题。答案是不能,因为中断上下文不是进程上下文,没有调度实体,一旦睡眠系统就卡住了。这种情况下只能使用自旋锁,并且要小心关抢占或关中断。我在后面第3部分会专门拆一道这样的题。

2.5 文件系统:一切皆文件背后的抽象

文件系统方向的考点主要集中在VFS上。面试官很喜欢问:普通文件、目录、设备文件、socket、管道,为什么在Linux里统称为“文件”?答案就是VFS提供了一层统一抽象,所有对象都有inode、dentry、file这些结构,关联了对应的方法表。只要理解这层抽象,很多题都能串起来。

常见的具体考点还有:硬链接和软链接的区别、为什么同一个文件可以有多个目录项指向同一个inode、删除一个正在被进程打开的文件后磁盘空间什么时候释放、页缓存和回写机制。我后来排查线上问题时遇到过“文件删了但磁盘空间没释放”,其实就是因为进程还持有该文件的fd,inode尚未释放。这种题笔试不一定会出,但和文件系统相关的基础概念一定要通。

2.6 中断、系统调用与内核模块

系统调用是用户态进入内核态的主要通道。笔试里常让描述“read系统调用的流程”,或者“fork系统调用的返回值为什么有两次返回”。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询