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处理

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

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

相关推荐
lifallen1 小时前
DeepSeek Harness:把 Agent 做成可替换的运行时插件树
人工智能·学习·ai·开源软件·ai编程
自学机械人的小白ing1 小时前
深度学习系统学习
人工智能·深度学习·学习
nmjkhome2 小时前
22 梁单元和谱分析进一步讲解(第47课)-solid works simulation
学习
明快de玄米612 小时前
Electron学习文档
学习·electron·vim
小小de风呀2 小时前
de风——【从零开始学习C++】(十八):AVL树——让二叉搜索树自己“站起来“的自平衡黑科技
c++·科技·学习
MartinYeung53 小时前
[论文学习]MCPTox:面向真实世界MCP服务器的工具投毒攻击基准测试
运维·服务器·学习
Chen—LSN3 小时前
C语言——数据在内存中的存储
c语言·开发语言·经验分享·笔记
math_hongfan3 小时前
事务下单与状态流转:ArkTS 的 JOIN 联表在鸿蒙订单里实战
android·学习·华为·harmonyos
weixin_431600443 小时前
NestJS 入门(9):连上数据库,SQL 写在哪?
数据库·后端·sql·学习·nest.js