网络编程:IO多路复用、reactor框架、webserver
一、网络编程基础
1.网络io、fd、tcp连接、事件、业务的联系?
网络io:数据收、发,对事件的处理。
收:数据由外部网络--经网卡到内核空间--拷贝到用户空间。
发:数据由用户空间-拷贝到网卡-发送到外部网络。
fd是io操作的的唯一抽象标识,fd与tcp的生命周期大体一致,是一对一的关系。
事件:可读事件(EPOLLIN)、可写事件(EPOLLOUT)
io的生命周期包含无数个事件,服务器、reactor(事件驱动框架)管理的是事件。
2.什么是IO多路复用,select、poll、epoll的区别?
IO多路复用:一个进程、线程,监控多个fd。
select、poll都需要把fd集合拷贝到内核空间,再通过轮询得到就绪事件。(面临大量io时,拷贝、轮询会过度占用cup)
epoll零拷贝、无需轮询,红黑树管理fd总集合,双向链表管理就绪fd,快速得到就绪事件,cup占用更少。
select的参数多、版本较低时并发工具,poll适用于并发量小的场景;epoll专门用于高并发。
select:

poll:

epoll:

3.epoll的水平触发LT、边沿触发ET的区别、使用场景?
LT:内核缓冲区有数据可读就一直触发。
ET:内核缓冲区发生 无数据到有数据 的状态变化时触发(若内核缓冲区有数据,又有新的数据追加进来,也可触发)。
ET+循环recv+非阻塞 为常用模式
使用场景:
非阻塞io就用ET(经典模式)
数据包大小不确定时:ET (低触发、高吞吐)
数据包大小确定时:LT (代码简洁)
设置位置:epoll_event结构体中events
注意:
ET非阻塞情况下需要 管理好fd的生命周期,二次清理关闭fd,避免非必要错误打印。
如:recv返回-1时 -- 缓冲区暂满、error的分类处理

main中recv部分二次清理fd:

二、网络编程进阶
1.什么是reactor,为什么需要reactor,比epoll有什么优势?
reactor是基于epoll实现的 事件驱动网络框架。
框架的优势:
为每个io分配缓冲区、长度,绑定回调函数、status、is_close等,实现状态管理:

遇到什么事件就调用对应回调函数:
EPOLLIN--accept_cb(监听sockfd)、recv_cb(clientfd) EPOLLOUT--send_cb
实现网络io与业务的隔离:只做事件管理、数据收发等,至于请求的处理、响应单独封装调用。
注意:
若需要连续调用recv、send,通过set_event管理EPOLLIN、EPOLLOUT实现。
网络io部分--send:只负责发送数据,不管内容,set_event管理EPOLLIN/EPOLLOUT,实现连续send

业务逻辑:只负责数据组装,不管发送,包含status管理

2.如何实现一个webserver?
reactor.c控制网络部分,只需要稍微改动。
webserever.c封装http_request、http_response实现业务逻辑。
可封装server.h完成连接
三、每秒处理请求量QPS
工具:wrk wrk -c50 -t10 -d10 http://192.168.202.130:2000/ (50tcp连接、10线程、10s)
注意:测试打印会严重影响性能 有打印(9k) 无打印(9w)。
更多推荐
所有评论(0)