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 ,由于通常数量有限,且每个事件都需要逐一处理,没有优先级之分,因此采用简单的单向双向链表即可

image-20240504152735059


io多路复用
http://example.com/2024/05/04/io多路复用/
作者
Forrest
发布于
2024年5月4日
许可协议