cpp选手秋招准备 学习笔记day7 webserver

总结一下通过和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处理

对于缓冲中的内容要清空,比如之前读到的客户端的请求,如果不处理是一直在用户的内存区的。

总结:发现虽然不一定面试会问这些问题,但是主动被拷打,也是学到了很多不清楚的认识,之前是零零散散的在学习的。

相关推荐
~patience~6 小时前
WAV 逆向分析工具使用笔记
笔记
滴啦嘟啦哒6 小时前
【具身笔记】【π0.5 微调与仿真】五、在MuJoCo中实现可视化仿真
笔记·python·vla·具身
xier_ran6 小时前
【infra之路】AI 编译器学习笔记(十三):AI 编译器全景——TVM、XLA、IREE 与其他
人工智能·笔记·学习
连山齐名6 小时前
ai应用开发的学习笔记
服务器·笔记·学习
乔旭伟6 小时前
中小厂生产管理系统选型笔记:驱动方式、主线链路与成本结构
笔记·需求分析·规格说明书
xier_ran7 小时前
【infra之路】AI 编译器学习笔记(十四):为什么要 tiling,以及矩阵计算单元的“固定“
人工智能·笔记·学习
燕落南枝7 小时前
HTML 学习:辅助标签 label 与字符实体
前端·学习·html
hackchen7 小时前
LangChain 学习第 3 课 - 输出解析器(Output Parser)
数据库·学习·langchain
如旧呀7 小时前
origin绘制等距的HSD置信区间
笔记·origin
问心无愧05137 小时前
[极客大挑战 2019]Upload
笔记