腾讯后台面试经历(转)

今天是3月11日,鹅肠技术一面,电话面
2019年3月11日 星期一
本人浙江大学软件学院研一研究生。
当时投递岗位的时候没有看清要求,写着后台开发岗,招C/C++/Java,果然越靠前越重要。。本来想投的是Java岗,奈何鹅肠后台C++偏多。结果面试的时候面的全是C++和Linux,Java一点没问。全程大概25分钟,总结如下。

面试内容和我的回答
先自我介绍一下吧

好,我叫xx, 目前在xx,本科在xx做过xx,在xx实习过,实习期间xx。

你在本科的时候参加过xx的比赛,在那个比赛中,你扮演什么角色?

我在那个比赛中作为队长,协调团队的工作,同时作为比赛项目的主力后台开发。

你觉得这个比赛项目中最难的一点是哪里。

我觉得是微信服务号中发送弹幕消息,一开始不知道怎么实现,想法很简单,后台用一个消息队列缓存用户的消息,使用ajax轮询的方式访问后台的消息队列,利用js显示在网页。后来觉得效率太低,会造成网络拥堵,采用WebSocket与后台服务器建立连接,利用sessionId完成全双工通信。

你知道WebSocket是怎么建立连接的吗?

好像是通过http建立。。。。然后。。不清楚了。

在WebSocket通信的过程中,遇到过什么问题吗?

额,有时候消息会发送失败,,,显示断开连接。。但是不知道为什么。

你的项目是部署在什么系统下的?

Linux系统。

Linux的进程间的通信有哪些方式?

信号量机制、共享内存、管道、共享文件

Liunx下如何查看共享内存的情况呢?

这个。。我不清楚。

嗯,你知道Linux下有哪些socket模型吗?

Socket模型??

就是epoll,poll,select这些。说说他们的原理,以及epoll和select有哪些不同点。

嗯,epoll,poll和select都是linux下I/O多路复用的实现,可以实现单线程管理多个连接,select是基于轮询的,轮询连接的状态,返回I/O状态,poll和select的原理基本相同,只是poll没有最大连接数的限制,因为它是基于链表的,而select是基于数组的,有最大连接数的限制。epoll和那两者的区别是,epoll不是基于轮询的检查,而是为每个fd注册回调,I/O准备好时,会执行回调,效率比select和poll高很多。

select的最大连接数是多少?

在32位的机器上貌似是1024个。

在windows系统下多少?

这个。。。。我不清楚。

好的,没关系。linux下如何查看某个端口的占用?

用netstat + grep名命令。。

你知道TCP和UDP的区别吗?

嗯,TCP是面向连接的可靠传输,UDP是尽最大努力传输的不可靠传输。

你在玩王者荣耀的时候,请问在对战过程中,用的是UDP连接还是TCP连接?

应该是UDP吧,因为对战的时候网络传输的大部分是玩家人物的状态和位置,不需要时刻知道,有丢包的可能,所以有时候人物会瞬移。。。(胡乱猜,后来想想应该是TCP,不然别人打你一下,你这边网络不好,刚好丢包了,不就不掉血了吗哈哈哈哈,这也是乱猜的)

嗯,问你一些C++的问题。你用过C++的STL库对吧,有哪些容器?

map,vector,list,queue,set…

你知道他们分别是如何实现的吗?

知道一些,首先他们都是根据添加动态扩容的,vector是连续存储,也就是数组的方式实现的,list内部存储结构是链表,set是有序的集合,内部的数据结构是红黑树,map内部数据结构也是红黑树。(答得很笼统。但是我是比较清楚的,因为这部分看过Java的STL源码,原理应该是差不多的。)

嗯,程序的内存模型分为那几个区域?

堆内存和栈内存。

那你知道栈内存和堆内存是用来干嘛的吗?

栈保存函数的局部变量和函数返回信息,堆内存用来保存类和对象。

那通过malloc申请的内存是在哪个区域的?

堆内存。

那你知道申请内存有两种方式清除,free和delete,你知道这两种方式的区别吗?

嗯,free是清除malloc申请的内存,而delete是清除new出来的内存。

嗯,那你知道如果用free去清理new出来的内存会产生什么问题吗?

。。。。。。不清楚。

好的,没关系。你知道,Java和C++的最主要的区别是什么?

第一点是,在C++中,支持面向过程,函数可以与类隔离单独存在,而Java的函数必须在类里面。第二点是内存管理,C++需要程序员自己去管理内存,而Java是通过垃圾回收自动管理内存。(关于多继承和单继承的区别忘记回答了。。接口也忘了回答了,有点紧张)

你知道static关键字是用来干嘛的吗?

在一个类中,类成员和方法如果用static修饰,可以直接通过类名去访问。它可以作为多线程的访问控制。。(瞎j8回答)。

现在有一道题目,你需要思考一下再回答。一个机器上有一个超大的文件,里面有4G个32位int型整数,而机器的内存只有512MB,我需要获得它的中位数,请问应该怎么办?

我想一下。。。。(中位数??不都是最大或最小前K个吗?中位数怎么办?一分钟之后。。)我想不出来,但是一定要先把文件分块(这不是废话吗??),然后应该可以用堆排序的方式,但是我暂时想不出应该怎么去做。

好的,没关系,你可以回去再看一下应该怎么做。时间差不多了,今天就到这儿吧,具体结果后面会通知你的,再见。

好的,再见。。

15分钟后。。。
面试官打电话过来。

喂? xx啊,你现在是研一是吧?你什么时候毕业?

嗯,2020年毕业。

2020年6月份对吧。

是的。

好的,我这边再确认一下。

好的,请问。。。我这次的一面能通过吗?

这个嘛,要根据综合情况考虑的,现在还不确定。

好的,谢谢。

总结
刚面完,心情有点失落,感觉有点崩,其实这个C++是面试,而我想面Java岗位,但是不排斥C++,还是很想去鹅肠的。。。没回答上来的问题我后面会继续补充。还是需要多多沉淀,多多总结。

3月11日 22:06 更新
一面过了,明天晚上18:30技术二面,等待ing。。。

你可能感兴趣的:(面试)