首先感谢腾讯爸爸捞我。
本人普通211院校,大龄ACMer(区域赛铜),感觉腾讯问的蛮全面的,算法倒是问的比较少。
下面是凭印象过一遍,另外其他厂的一些面试我认为比较经典的,我也加上去。
一面(30min)
问的基础知识比较多,
1、自我介绍(最好别说的太少)
2、关于C++的多态实现(虚函数动态绑定)
3、创建派生类对象构造函数的执行顺序(基类,派生类)
4、TCP三次握手(TimeWait为什么2RTT),四次挥手
5、TCP的有限状态机最好知道,被问到四次挥手每次发送完报文处于什么状态(客户端发送FIN,进入FIN_WAIT1,收到ACK,进入FIN_WAIT2,再收到服务器端的FIN报文进入TIME_WAIT;服务器端收到FIN报文发出ACK进入CLOSE_WAIT,然后发送FIN+ACK服务器端进入LAST_ACK状态),协商完毕之后都进入CLOSED。
6、TCP流量控制(可变窗口协议,双方协商cwnd值)和拥塞控制(慢开始,拥塞避免,快重传,快恢复)。
7、三次握手发生在Listen还是Accpet(三次握手发生在Accept之前,Listen使端口进入Listening状态,Accept只是从中提取出来Socket,你最好测试下)
8、Mysql的Mylsam引擎和Innodb引擎的区别(从版本,索引缓冲区,外键,侧重点,锁级别,优缺点适用场景)。单表查询Mylsam效率快的多,稳定性也高,它的索引页和数据页是分离的,所以相同页大小Mylsam的索引更多一些,可以存更多的索引键。Innodb的支持事务,恢复能力强。
再补充一个阿里一面问的,我没答出来:
1、一个文件中有一堆大数,内存中放不下,找出最大的(我答的不在点上,取出来一直比较然后找到最大的。正解:对文件水平拆分,然后多路归并,对小文件排好序后每个文件都取少量数据(内存允许的情况下),然后放到一个新文件中,取完了就再取一些)。
可参考https://blog.csdn.net/ZZh1301051836/article/details/101106024
二面(30min)
二面用的腾讯会议,直接共享屏幕,面试像聊天一下(有点梦幻),还好用的腾讯会议。
我展示了我经常更新的博客,寒假Python做的测试软件也展示了出来(算是个中小型项目了),表现出来的我的实践能力。
二面发现我面的是游戏部门,问我做过游戏没,原来我做过很多简单的游戏(贪吃蛇,三维弹球等等都是小游戏,都是比较简单的没展示出来)。
又简单介绍了下我用Muduo库写的一个聊天软件,这个算是中型项目。
总体感觉发挥不错
1、自我介绍(不能介绍的太少)
2、走一遍我的C++聊天服务器的项目:客户端是简单的命令行窗口,按照约定的消息格式发送请求(msgid,json),都用Json封装数据。服务器端分层,网络层我用的陈硕大佬的Muduo库(封装性强的Reactor模型,以后一定看看这个源码),网络层和服务层回调解耦,服务层主要实现的功能登录、注册、一对一聊天、离线消息存储、查询好友,添加好友,创建群组和群组聊天待加。Dao层用的Mysql,也用了libmysqlclient提供的数据包。
可能面试官觉得我都是用的库,然后开始问我底层了解不,我平时练习用一些(我缺乏底层api练习,C++很多网络api蛮复杂的,封装epoll,封装连接,其实也可以,总有一天我会有自己的方法库)。
这一点我认为面试官可能会问我reactor模型的了解,我不太了解,简单的知道。https://www.cnblogs.com/moyangvip/p/5360837.html
3、最后十分钟,一直在跟我讨论进程和线程,基本概念、应用场景。
为什么浏览器用多进程更好一些,我从资源占用说了一通,认为网页不会开很多,而且关闭网页,打开网页很好调度。面试官哥哥说了他的观点,多线程的话一个网页发生问题,这个浏览器就崩溃,但是多进程如果问题可以直接Kill。
为什么有了I/O复用还要用多线程,明明复用可以解决所有问题,我没答出来。我想着多线程可以提高效率,但说不清楚。解答:从硬件方面来答,多线程可以被CPU多核并行处理,数据量太大要从硬件方面扩张。
三面(1h)
紧张又激动,面完之后觉得很挫败。
可能是最后一道题我说了我的算法处理思路,给我抬了上来。
一共三道题:
1、类A继承B、C,A中有多少个虚表,怎么通过虚表去实现多态。(我确实了解过这方面,他说我了解的不对,我是从这个博客了解的,没有再深入一步,我很惭愧。
https://blog.csdn.net/haoel/article/details/1948051)
2、客户端发送10个200字节的包,服务器端一次recv能收到多少字节,有什么情况。(不会,瞎扯了MTU,MSS,设置的缓冲区大小,被说不对)
3、最后是个思维题,没想出来。两个人打牌,每个人:
A: 3 4 5 66 77 88
B: 3 4 5 66 77 88
单压单,对子压对子。A先手,是否可以必胜。
这是个博弈,同局势一般都可以赢。
A必胜的方法:
先出4,B出5,然后B出3/4,我都不出,B出4/3,我出5。B没有单的了,我再出3,剩下的对/单先手必胜。
最后让我设计算法怎么处理是否必胜:
dfs,对B来说,我不出或者选择一种出法压你,或者如果到B了,就不能不出。对A来说,B的所有情况,不管怎么出,我都要赢。dfs的时候每次到A都要保证接下来所有情况都要赢。存在这种情况则必胜。
4、问了一些非技术的问题,平时怎么学习新事物,ACM比赛给我带来了什么,记忆最深的一个比赛(我突出了团队配合,说了徐州区域赛)。
Hr面(20min)
聊天聊的挺愉快的。
总体面试下来,感觉收获蛮大。
腾讯处理也挺快的,我对内存,业务逻辑方面还需要进一步学习。
共勉。