恭喜发现宝藏!微信搜索公众号【TechGuide】关注更多新鲜好文和互联网大厂的笔经面经。 作者@TechGuide【全网同名】 点赞再看,养成习惯,您动动手指对原创作者意义非凡🤝
面试部门 / 岗位:基础架构 / 后端开发 候选人简介学历:齐鲁工业大学,也不是很清楚是二本还是三本,总之普通的本科。和公司前辈们聊过这种学历投大公司能不能被捞挺看运气的。
ACM 铜牌一块(只是有的面试官会稍微提一嘴,没感到很有用的样子)
实习经历腾讯一段 (硬通货)
三个项目,基本上反映了我的技能栈: 乞丐版的 C++ web server 乞丐版的 TCP 协议原型 乞丐版的 os 内核
一面(9.16)-
自我介绍
-
“我看你写了个 TCP 原型,那我们来聊聊 TCP 吧” 讲讲TCP 四次握手
-
TIME_WAIT 2MSL
-
拥塞控制
-
TCP 有哪几种关闭的情况。 项目里实现过,但当时没答上来。
分两种:1)普通的正常关闭 2)收到 RST 后非正常关闭,因为 TCP 本身作为可靠协议理应把数据都发完再关闭,非正常关闭的话则会把发送缓冲区的数据都给扬了直接强退。
-
TCP 里的 RTT 和 RTO 怎么测量的?当时没答出来,下来搜索后发现有专门的算法的。
-
有看过 Linux 内核怎么实现 TCP 的吗?啊这,无。
-
有看过 TCP 的 RFC 文档吗?啊这,无。
-
说说 SELECT POLL EPOLL 的区别
-
操作系统:“我这个内核是怎么做的?”“它本身是别人做的教学用操作系统,我在之上加了点功能。就,懂得都懂。”
-
那你讲讲 Linux 里 page fault 是怎么实现的?(恰好我也实现过这方面的功能,所以基本接住了接下来的几个问题)
子问题 1:Linux 下中断的触发流程 子问题 2:Linux 怎么确定是谁出发的 page fault 子问题 3:page fault 判断线程没有访问内存的权限会发生啥 (查线程的 vmspace 发现这段内存没有被分配的话会触发 segment fault) 子问题 4:page fault 分配物理内存失败时会触发啥错误?(犹犹豫豫的说应该是内存不足之类的错误码吧)
算法题 给你几个数组,每个数组抽一个数,把所有组合情况列一下。 (赤裸裸的 DFS, 秒了)
反问 对应届生有什么建议:keep learn,多读代码,多读论文,保持编程的热情,保持新知识的输入
二面(9.18)-
自我介绍
-
聊实习经历, 10 min
-
实习用的一致性哈希,这个一致性怎么理解?
-
聊项目, 10 min
-
你这个 TCP 里重排序用的什么数据结构?
-
有没有了解过 Linux 内核里用的啥结构?
-
讲讲你这个里面时怎么实现的流量控制?
-
聊聊 epoll 的 ET LT
算法题 写个单生产者单消费者的 ring buffer
反问 您作为面试官比较关注候选人哪些方面的能力:编程的热情、扎实的计算机基础知识,就网络、OS,然后有一定的算法基本功
三面(9.22)-
C 语言
-
static 关键字
-
voiltile 关键字
-
预处理指令 if define 作用
-
gdb 调试
-
查看指针地址和值都用啥指令?
-
查看调用栈用啥指令?
-
怎么打断点?
-
讲讲你的内核里怎么实现的多线程调度
-
讲讲 Linux 内核里怎么实现的多线程调度
-
讲讲虚拟地址怎么变成物理地址的
-
TLB 是什么东西?
-
32位和64位的区别?硬件和OS两方面谈谈。
-
大小端是啥?怎么判断?现在X86一般是哪个?
-
X86 的 cache 架构
-
你刚才说所有核心共享 L3 缓存,有没有了解过 NUMA?(似乎是唯一一个没有答出来的问题)
算法题 “接下来我们来做个题吧” 我心里还说这轮怎么问的这么少,结果***来了:
面试官即兴发挥:“那你刚才讲了虚拟地址转物理地址转换过程,那现在来写个函数实现一下吧” “那虚拟地址结构,每个段多长怎么处理?” “你自己定义” “那每个页表项每个段的长度呢?” “你自己定义” “那页表查询失败呢?” “返回NULL,具体怎么算失败你自己定义”
结果写出来面试官看完后被屎一样的代码震惊了。 “你…看过 Linux 内存管理的代码吧?” “看过…一点点” “Linux 是这么定义页表项的?” “不是…” “Linux 里是这么判断页表项是否有效的?” “不是…”
反问 部门做啥的? 主要是虚拟化和操作系统 应届生进入这个部门的话可以针对性学习哪部分技术栈? 多看看 Linux 源码。
结局 25 号收到感谢信。
总结 本人记性不是很好,所以可能有些题忘记了没写上。不过每一轮都是若干提问 + 一道算法题,每轮都是 40min ~ 60min。因为部门是真·底层(虚拟化、操作系统、网络栈),很多问题一开始像是八股,但到最后都会引导到“你有没有看过Linux 源码里这一块儿是怎么实现的?”。 算法题都是部门人自己出的,没遇到 leetcode 原题,但也不是很难。第三面面试官即兴发挥让我写个虚拟地址转物理地址的函数,这种不按套路出牌的体验还是很新奇有趣的,虽然我把当年的知识忘了太多最后写的很烂就是了…