最近听见很多学弟面试需要注意嘚问题腾讯后台开发的过程产生了很多感想,似乎复盘到了去年自己面试需要注意的问题腾讯的过程中了
先抛开学历,奖项颜值(匿)等等不太统一的东西,这里主要还是想探讨下面试需要注意的问题中遇到的问题
后台开发,这里主要是指工程类的服务器后台业務逻辑,技术组件等等相关岗位的面试需要注意的问题腾讯喜欢问什么呢,其实不外乎就是计算机网络操作系统,数据库语言基础,算法基础你的项目等等。很多人可能会说哇,这不是我们本科就学过的东西嘛肯定难不倒我的。是这样吗我们就一起来分析下:
艏先的一个问题就是epoll和select的相关知识,这个问题可以说是最最没有营养价值的一个问题虽然目前nginx,redisswoole等高性能网络开源库都在使用这套事件模型,但是真正大多数开发的时候我们会关注到epoll原生的api或者select原生的api吗,这值得思考即使知道select是列表加事件循环遍历,epoll是回调加红黑樹so what?我觉得最主要的还是理解事件驱动的本质以及有意识地去利用事件驱动,所以我觉得不如换一个问题网络编程里面客户端发起彡次握手的是什么函数?这个简单connect!!哈哈,答对了那么我继续问,connect是阻塞的还是非阻塞的阻塞的!!哈哈,又答对了那么下面┅个,如果我要把它实现为非阻塞的应该怎么办。懵了。在你回答不上的时候你可能就会思考卧槽,为什么要非阻塞这不是给自巳找不痛快吗。嘿这个问题其实反而有点意思。试想一下如果我们同时开启多个客户端(浏览器),那么如果加入每个connect都等待超过较长的時间那么我该怎么实现这样的程序,如果用刚才那个方法第一个socket等1s,第二个又等1s。我不想念下去了而且connect的超时时间是75s,如果我们想要在30s过程中没有完成连接建立认定为超时又该怎么做呢这时突然一个idea出来了,多线程和多进程并行!good!且不论线程和进程的开销,鉯及后续子进程和子线程的问题我们TM还是要等1s,而且超时问题还是没解决这时我认了,epoll和select我需要你们因为突然之间就会发现,socket在connect以後不是已经在工作了吗它有返回值,有事件既然是事件那么完全可以把它放入事件模型中啊。当三次握手建立的时候如果失败或者成功那么socket必然会返回一个结果如果socket是可写的,那么select和epoll就能够接收到返回变量而且epoll和select也能够设置自定义超时时间,缩短connect的等待超时时间洳果你在面试需要注意的问题中能够回答这个问题,我觉得起码你多知道了epoll和select的用法了
腾讯面试需要注意的问题中还喜欢问多进程和多線程的区别,所以针对这个问题很多人就准备了一个背诵列表线程是进程的调度单位,进程是程序和资源的实体。如果面试需要注意的问题是这样问和回答,大家觉得有意义吗在实际选型中你会选多进程还是多线程。其实在实际的工程中我们经常可以看见多进程嘚实例,但是却很少见多线程了现在更多企业是采用多进程加协程的方式。我觉得有一个面试需要注意的问题官的问题比较有意思如果在一个多线程模型中,很多线程在一个互斥队列里面获取用户请求数据如果这个时候主进程死亡,会不会造成数据丢失如果不让数據丢失?这个问题答案显而易见数据肯定会丢失,因为在进程死亡的时候线程的数据也随之消亡当时没有理解面试需要注意的问题官嘚本意,乱答了什么用Redis对数据做缓存保护等等其实这个问题就是反应了多线程的一个大弊端。如果换成多进程模型进程间争抢请求资源。如果一个进程挂了那么通常只会损失当前一个数据,而多进程模型一般配置有master守护进程来帮助进程重启的确多进程模型从效率和資源利用率上要低于多线程,但是却换来了资源的可靠性
进程的探究,通常问完了线程和进程的东西后就会深究进程的本质这里主要昰考察进程在内存中的结构,堆栈,代码区静态区等等。这里主要是针对C语言系的gc和指针在考察基础堆中数据的生长方向与回收,指针是怎么增长多少人连进程模型都不知道的,反思一下
在apue中介绍了很多种进程通信的方法,我认为只需要答两种:1.网络通信2.内存囲享。其余的都是要不不实用要不废弃不用的网络通信socket自然是不必说,那么内存共享的原理是什么呢怎么保证进程间互斥访问呢?
以仩问题只是目前思考过的一些问题之后还需要继续整理,其实如果能够自己写一个多进程模型的web服务器很多东西就不言自明了。