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

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

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

相关推荐
差不多的周周4 小时前
《骨架上下文:基于零镜头骨架的动作识别的骨架侧上下文提示学习》论文核心部分详解
学习
Century_Dragon5 小时前
从挂图到VR:汽修专业的一堂新能源原理课可以怎么上~
学习
知识分享小能手5 小时前
C++ 学习教程,从入门到精通,C++对象和类 — 详细知识点总结(10)
开发语言·c++·学习
New农民工6 小时前
倒立摆训练秘籍:理解训练参数
学习
L@ncor7 小时前
第五章 基于低代码平台的智能体搭建 · 学习笔记(Coze / Dify / FastGPT / n8n)
笔记·学习·低代码·agent·prompt工程
知潮网7 小时前
被嫌弃的五仁月饼,一吨千元在养猪场翻了身
笔记
2601_960631237 小时前
中药前处理及提取的工艺环节与技术要点
笔记
2601_965384267 小时前
口腔黏膜清洁中的几何约束与流体动力学边界层问题分析
经验分享·笔记
迪丽热爱7 小时前
多媒体应用20-903(补)
学习
一米阳光86618 小时前
软考高级【信息系统项目管理师】高项重要考点(9)组织 助你顺利上岸!
笔记·职场发展·软考·高项·信息系统项目管理师·高级职称