总结一下通过和ai对话,主动选择被拷打过程中的内容,关于webserver项目。
webserver本身是跟着牛客的项目做的,当时跟着做觉得每个都懂,但是去表达又回答不上来ai的问题,觉得是自己隔了很久忘记了,但是事实上真正的知识,不存在完全忘记,哪怕记不清也能说一两句,比如c++对象的虚函数的实现这些,因为当时是切切实实思考过的。
1.webserver流程图
a.主线程监听套接字连接,然后通过epoll 监听事件
b.线程池的线程去队列去取任务
c.定时器定时的去清掉连接
d.工作队列里的每个数据都存储着对应的发送和接收的数据以及套接字
2.主线程和线程池的分界线
主线程和线程池通过工作队列联系起来,主线程去把任务,也就是epoll有信号的连接推送到队列里,线程池去取。
在这个过程中有一个互斥访问队列、同步的内容。
3.数据的流向
从客户端发送数据、到我们接收端网络缓冲区-内核内存缓冲区-用户内存缓冲区、写回的过程是反过来的,数据的流动就是主要是套接字到队列里的数据。
4.mmap
mmap是减少了内核内存区到用户内存区的这个搬运过程,但是对于比如解析的内容,对于我们响应的http头,都是用户内存拼的,省不掉。
5.lt和et
lt是对于被epoll通知有信号的事件,如果一次read没有读完,会继续通知,et是如果没有新的数据重新到来,哪怕是没有读完也不会继续通知,这就要求解析的线程来读完。
为了防止阻塞,要用非阻塞的读取。
哪怕是et,也有可能因为新来数据继续通知被另一个线程接收,然后都读数据,出现问题,于是应该让一个套接字被一个线程处理,使用epolloneshot。
6.为什么每次重新建立连接、处理完之后要对连接进行init处理
对于缓冲中的内容要清空,比如之前读到的客户端的请求,如果不处理是一直在用户的内存区的。
总结:发现虽然不一定面试会问这些问题,但是主动被拷打,也是学到了很多不清楚的认识,之前是零零散散的在学习的。