腾讯ieg后台开发面试
岗位:C++后台开发
回顾一下三轮技术面试,总的来说非常坎坷,每一轮的面试都非常细节,不得不说腾讯面试官对于基础的扎实程度要求很高。
初试 视频面:1h15min
面试官非常和蔼,首先让我介绍了一下自己,然后就是对于我之前在腾讯参加引力计划的一些细节的考察,由项目拓展到各种网络+操作系统:
1、项目中采用的websocket协议与http协议之间的区别
2、把http1.1,http2,http3的发展过程,还有一些具体细节说一下,类似于http1.1keep alive,http2的静态表,动态表,HPACK编码,http3的QUIC具体细节QPACK,TLS1.3以及运输层实现为UDP
3、关于UDP如何实现类似于TCP状态连接?(加上seq等)
4、关于TCP的拥塞控制(以及BBR算法的提出缘由简单介绍下,丢包驱动->测量驱动)
5、TCP的四次挥手状态分别是什么,以及他们在性能上可否进行调优(Linux上的TCP参数调优,time_wait复用,半连接队列,全连接队列...)?
6、项目中用到的epoll,可否介绍一下select,poll,epoll的具体原理,以及发展的原因,在epoll基础上的Reator框架是什么形式?(可以结合Redis的单线程reator,Netty的主从reator回答)
7、介绍一下红黑树在linux内核中的应用(看到简历上写的了解内核和红黑树),回答了两个:
(1)、CFS调度算法(vruntime的大小来构造红黑树)
(2)、mm_struct的vm_area_struct(不同的虚拟内存区域之间用红黑树进行连接)
8、对我的科研项目问了一下:对抗机器学习中的特征选择,简单介绍一下
上面讲完差不多40分钟,然后开始做题:
算法题:
合并有序链表(leetcode原题)
反问:
游戏服务器开发中现在重点关注技术?(高并发,高可用的分布式架构,现在也比较流行和AI结合面)
复试 视频面:1h3min
面试官看上去是个大佬,后来证明他确实是😕
一开始上来让我介绍,说一下自己本科和研究生期间学过的计算机方面的课程(操作系统、网络、数据结构与算法、计组、微机等)
面试题:
1、了解Linux的网络协议栈低层实现吗?(从网卡开始收包,结构体拷贝链:ring_buffer->sk_buff->socket,每一层所在的OSI层,以及linux中所在的子系统)
2、数据包发送是如果采用零拷贝技术,应该在哪些方面要进行改进? (SG_DMA的选用,sendfile函数)
3、项目中涉及到的websocket协议,对于包体是如何编码的?是probuff还是其他的?如果是自己设计一个网络协议,要考虑到哪些问题(粘包问题,纠错问题,编码问题等)
4、项目中一个普通的包大概多少字节,当时有没有观测CPU占用率,哪些指标可以观测性能,并发量为多少QPS?(平均负载等)
5、对第4题追问,那么如何方法可以提升Linux性能?(reator模型中线程池的线程个数与CPU核心数相同,还有网络方面也可以考虑:初试中提到的点)
6、协程与线程的底层区别,为什么协程更轻量,以及异步IO的原理?windows的IOCP?
7、场景题:如果现在你手上有1亿个数字,那么你如何利用手上的工具进行排序?涉及到的数据结构?(其实1亿个数字占用空间并不大~)
8、go与C++的应用场景可否谈一下?以及目前服务器性能提高的主要手段还有哪些?还有微服务了解多少?(问的比较宏观,技术的全面性)
9、啥时候可以入职?
没有算法题,很开心😂
反问:
Linux内核这一块自己比较感兴趣,面试官怎么看?(面试官回答这是程序员的必备技能,但是基础好的话应对各种应用层的技术就会发现思想大致相同,所以啃一啃也很有意义)
三面 电话面:40min
面试题:
1、在项目中,Reator模型的client_fd如何分配?(我回答自己采用的是round_roubin,也可以采用别的分配方式)
2、分配时是共用消息队列还是每个子线程一个队列?
3、http服务器项目中的http解析报头,报体时所需要注意的问题?
4、每个client结构体中存储了哪些数据结构?
5、介绍一下stl源码,自己讲了几个(大概20min):
(1)vector扩容操作
(2)deque是链表队列,(queue和stack为适配器)
(3)sort是内省排序
(4)list双向链表
(5)set和map底层采用红黑树,unordered_map和unordered_set采用的是哈希表
6、对于不同的容器采用sort排序时如何进行区分?(类型萃取:type_traits和type_info技术)
中午状态变成HR面,然后收到云证与综合测试的通知
HR面试 (40min)
面试题:
1、介绍一下本科或者研究生自己印象最深的科目?
2、为什么想转计算机?
3、假期里读了哪些书?
4、大学期间印象最深的事情?
5、对于工作的发展及规划?
7、平时喜欢玩什么游戏?水平咋样?
8、手上还有没有其他的offer,如果要选择的话,怎么选?
9、评价一下自己?
10、大概啥时候入职?
11、有什么问题要问的?
总的来说,HR面试还是比较轻松愉悦的,比技术轻松很多啊,可能想看看你的性格还有做事情的热爱程度以及靠不靠谱。
写在最后的话:
如果是面试服务器方面的开发,我认为可以多研究一下linux开源代码,可以看看极客时间上刘超老师的《趣谈操作系统》和《趣谈网络协议》,这两个专栏,虽然很硬核,但是啃个3-4遍,相信对于基础的理解一定会有质的飞跃,复习期间可以搭配着一些《图解http》或者《C++服务器开发精髓》这样的书,由浅入深,对于写在简历上的项目,相信牛客的小伙伴们也能够收获自己的心仪offer~如果有技术上的问题也可以一起交流哦~