攒人品的 WXG 后台开发二面面筋
也许还问了别的东西,但是只记得这些了,给大家分享一下。
面试官:看上次面试问的都是操作系统方面的啊,这次我们问点网络吧
1. TCP、UDP的区别,为啥三次握手、四次挥手?
2. 打洞听说过吗?打洞是用什么协议实现的呢?UDP还是TCP?有哪些使用UDP和TCP的协议呢?
3. HTTP了解吗,HTTP1,HTTP1.1,HTTP2有啥区别,HTTP header都有啥内容啊,HTTP方法有哪些啊,GET/POST区别是啥,长链接的发送顺序和接受顺序要一致嘛,可能被阻塞嘛?
4. HTTPS了解吗,握手流程是怎么样的,加密是对称还是非对称,协议相比HTTP有什么好处呢?HTTP和HTTPS的端口分别是啥?
5. 如果用户输入的是http://xxx.com的网址,但是已经升级到了HTTPS,会发生什么呢?你会怎么处理呢?
6. socket 编程了解吗,调用write函数进行了几次内存拷贝呢?那是否可以减少拷贝次数呢?如果缓冲区写满了会怎样,还可以继续write吗?
7. 你刚刚提到mmap,怎么实现的了解吗?是只能映射用户空间和内核空间吗?
面试官:来问点别的东西吧
1. 进程和线程了解吗,有啥区别?线程之间怎么同步的?
2. 考虑你有一个服务,可能会起十个进程,如果某一个进程挂了,需要能感知到并且重新拉起来,请问你会怎么设计?
3. 线程之间是怎么同步的呢?同一台机器上的进程之间如何做到互斥的进行某个操作呢?
4. 你刚刚提到原子操作,怎么实现的了解吗?
5. select 和 epoll 了解嘛?有什么区别,ET/LT模式?epoll 的一些实现?如果需要跨平台,你会用select还是epoll?
面试官:来做两道题吧
1. 很简单,找出序列中和最大的连续子序列的下标起始和结尾;
2. 是一道工程题,楼主还是第一次做这种题:
考虑你向业务方提供热更新的服务,业务方可能是在多线程的场景下,会去读取config文件,也会不定时去更新config文件,config文件很大(大约50G),只有一份且存在磁盘上,内存大约128G。问如何设计这个updater类,使得业务方在更新时可以无感知的进行读取config的操作。
在面试官的引导下以及redis重哈希的启发,想出了double buffering的思路,然后去实现,同时要考虑多个线程更新config、多个线程读取config、文件在内存中副本的保存(因为太大了)等等情况,尽量和真实场景贴近。
可能还有其它的问题,但楼主脑容量太小,已经flush掉了
这次面试确实实楼主有史以来面到的最难的面试了,问题都相当有深度,同时要求能在具体的场景下结合知识点给出解决方案,感觉一眨眼就面了三个小时,辛苦面试官和楼主一起面到11点了。