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

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

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

相关推荐
m4Rk_几秒前
【论文阅读】Agent 记忆机制(63):SAMem——把经验记忆细化为带长期价值的状态—Thought
论文阅读·人工智能·学习·开源·github
点心的游戏开发世界2 分钟前
GDScript 入门笔记(十三):字符串操作
开发语言·笔记·游戏引擎·godot
kyrie_sakura17 分钟前
MySQL数据库学习笔记1 -- 基础概念,sql语句
数据库·学习·mysql
点心的游戏开发世界18 分钟前
GDScript 入门笔记(十二):类型系统进阶
笔记·游戏引擎·godot
吴声子夜歌35 分钟前
Linux命令——学习Shell(三)
linux·chrome·学习
小猪佩奇TONY1 小时前
Linux 内核学习(18) --- linux dma_buf 机制
linux·运维·学习
叶子野格1 小时前
《Verilog学习:数字系统设计基础》
学习·fpga开发
边境悍匪1 小时前
蜗牛学苑 Java 智能体学习 Day36|阿里云 OSS 文件上传、Spring 事务、全局异常思维导图复盘
java·学习·阿里云
LuminousCPP1 小时前
数据结构-排序(一):基础排序算法横向对比|冒泡、插入、希尔、堆与双向选择,详解二分 / Knuth 增量
c语言·数据结构·笔记·算法·排序算法
Linux-lucky2 小时前
33-Linux学习之旅之MySQL用户管理
java·linux·运维·学习·mysql·ubuntu