刚刚参加完中移(苏州)软件技术有限公司的线上面试,可以说是颇受打击。之前一直认为自己的Linux内核水平还可以,文章读了很多,书也没少看,也写过文章,做过知识分享。但这次和高手也可以说是一直做这块的人过招,完败。才知道Linux内核这一块尚有很大欠缺和很多问题。在此对面试过程进行复盘,趁着热乎劲儿将问到的问题能回忆起来的都写在这。并把这些问题所蕴含的各知识点都逐个进行解答与掌握,看看到底和他们的差距仅限于这一些问题,还是仅仅是冰山一角。这也算是知耻而后勇吧。
面试从14点10分开始(本来是14点,但面试官有事晚了10分钟),到15点10分左右结束,大约一个小时。在这一小时中,3位面试官总共提出了10多个问题,现在把能回忆起来的问题都记在这里,如下:
(1)virtio会创建哪些设备?
(2)virtio前端驱动写vring后,如何通知后端?
(3)CFS中某个任务的时间片如何确定?
(4)Linux系统中当内存不足时,如何处理?
(5)Linux内存规整有哪几种情况,即内存规整有几种方式?
(6)vmalloc和kmalloc的区别?
(7)当缺页异常发生时,分为哪几种情况以及处理方式?
(8)Linux内核内存初始化的完整流程。
(9)Linux内核内存模型。
(10)64位系统中是否存在固定映射区、永久映射区?
(11)Linux进程调度参数调优是如何通过代码实际完成的?
(12)文件和匿名文件在Linux内核中是放在内存的什么位置?
(13)实际工作中有没有使用core dump进行调试以及问题定位?(潜台词是应该都是用这种机制,而其它的效率都不如这个)。core dump的具体机制是什么?
(14)既然你们是使用Intel x86处理器,那么想必对Intel汇编很熟悉,那么什么是ISP和IBP(这两个名字很可能是他们南方人有口音,实际不是ISP和IBP,具体是什么有待于再研究确定)?
(15)echo 3 > /proc/sys/vm/drops_cache与0、1、2的区别。
(16)是否了解可信计算国密标准?请介绍一下。
余下的印象中应该还有2~3个问题,但具体是什么问题由于过程比较紧张,想不大起来了。可以看到,一个小时之内提了十几个问题,强度不小。最为关键的是,各个问题都是直接奔核心技术,你但非不是研读过代码而且还得是一直玩内核,绝不可能回答得很顺畅。笔者就吃了瘪。
但是,我倒认为这是一次难得的实战演练,能够通过这些问题,把之前没有方向的研究找到知识点参考(虚拟化部分);把之前一直想研读但没有写决心研究的代码彻底研究透(Linux进程调度和内存管理)。同时也利用这次机会,把这些知识点都补齐,补齐之后即Linux内核内功提升档次之后,再看看和这帮平时一直玩内核的人的差距究竟是这几个问题的差距还是这几个问题仅仅是一个代表性的差距。
接下来,我会针对以上这16个问题逐一深入展开,每一个问题写一篇或几篇文章,把这几个问题都搞定。经过这一过程之后,我想水平定会有一定幅度甚至是大幅提升。也希望后来者能够跟随我一起完成这一“飞跃”。