内推,二面跪
一面:
select & epoll两种机制的具体实现
可以用两个epoll监听同一个描述符吗,有事件发生时,怎么工作
hash怎么解决冲突
一致性hash
路由表的网段怎么存储、查找
segment fault怎么用gdb调试,两个函数循环调用会怎样
static的使用场景,在一个cpp中定义,在另一个cpp可以访问吗?static变量存放在哪里
time_wait和close_wait
服务器和客户端都是怎么工作的(从创建socket到工作的流程)
listen的两个参数分别是什么
当并发量很大时,可以进行哪些处理解决这个问题
讲一下redis的使用场景、工作原理、与竞品之间的区别
二面:
介绍项目,tun设备和tap设备的区别(项目中用到了),ping探测的周期,周期长短对结果分别有什么影响(项目中用到了)
select和epoll
如果select在监听的时候,描述符对端被关闭了会发生什么
send、recv都是阻塞的,怎么控制在一定时间内完成send、recv,如果超时就不执行,怎么跟select联系起来
socket关闭时,两端的状态变化
TIME_WAIT的作用,TIME_WAIT的时间可以小于2MSL吗,如果小于会有什么影响
epoll底层使用了红黑树,说一下红黑树的特点和优点
printf的可变参数是怎么实现的,如果参数个数不匹配会发生什么,比如字符串需要3个参数,但是只传了2个或者4个分别会发生什么
函数调用栈里面存储的是什么
malloc的返回值,还有其他内存分配函数吗,有什么区别
free怎么释放
设计一个内存管理方案
校招,三面跪
一面:
上来先写一个函数,字符串转换成整数,不能调用库函数
介绍项目
堆和栈的区别
使用指针,怎么尽量避免segment fault
linux内存管理(先说了slab,面试官说他不是问这个,然后把进程中内存分配的流程说了一下,面试官还是说他想问的不是这个,他说他想问的是段页式内存管理,好尴尬,,)
tcp、udp的区别
vector和链表的区别
struct和class的区别
java和C++的区别
二面:
介绍项目
gdb
select和epoll
token口令的实现原理,产生口令的客户端和服务端是否需要通信,具体实现接口(输入和输出)
缓存系统有两个接口:setKey(key,value,expires);getKey(key),问过期键的删除方法,并比较各种方法
服务端A和服务端B之间共享缓存
抢票或者秒杀时,如果用户量很大,服务端可能会崩溃,服务端可以有什么办法解决
三面:
gdb调试core文件
写函数atoi,并设计测试用例
剩下的都是非技术开放性问题,然而踩了无数坑