io多路复用
什么是I/O多路复用
通俗的意思
- 多路:存在多个待服务的对象
- 复用:只由一个执行单元提供服务
- 多路复用:由一个执行单元,同时为多个对象提供服务,形成一种一对多的服务关系
- 比方:餐厅中,只有一名服务员为多个餐位的顾客提供服务
在Linux中,IO多路复用有更加明确的定义
- 多路:存在多个需要处理的 io event 的fd
- 复用:复用一个 loop thread 同时为多个 fd提供处理服务,其中 thread 是内核视角下的最小调度单位;多路复用的模型通常为loop model
IO模型是指同时操作Socket的方案
阻塞IO:同步读写Socket时,线程陷入内核态;当读写成功后,切换为用户态,继续执行
非阻塞IO:轮询每个fd,是否需要处理
多路复用:操作系统帮我们监听了 所有的socket,若有事件需要处理,event poll告知我们发生的事件列表
必要性&&合理性
阻塞模型
非阻塞模型
使用操作系统内核对外的接口,进行IO多路复用的优雅实现,做到真正意义上的随叫随到
select -> poll -> epoll
select
epoll
fd无限,无限制
loop thread 被唤醒时,无需遍历fd,就可以知道哪一个fd需要被处理
epoll通过创建池子和添加fd两个操作解耦,实现了池中fd数据的复用,减少了用户态和内核态间的数据拷贝
epoll 的指令
epoll_create
epoll_ctl
epoll_wait
数据结构
epoll的数据结构:红黑树存储fd
red-black tree 一种自平衡二叉查找树,可以保证增删改的平均时间复杂度是 **O(logN)**的对数级别
就绪事件队列
针对fd的io event ,由于通常数量有限,且每个事件都需要逐一处理,没有优先级之分,因此采用简单的单向双向链表即可
io多路复用
http://example.com/2024/05/04/io多路复用/