操作系统 IO 多路复用

本文将介绍操作系统中的 IO 多路复用机制。

一、什么是 IO 多路复用?

IO 多路复用允许一个线程处理多个 IO 流。

二、Select

  • 最早出现在 Unix 系统上
  • 工作方式:
    • 调用:进程调用 select 方法,传入需要监视的文件描述符集合
    • 监控:系统会遍历集合,当有文件描述符就绪时,将其标记为可读 / 可写,方法返回
    • 处理:进程遍历集合,寻找并处理就绪的文件描述符
    • 重复:进程处理完成,再次调用 select 方法以处理剩余的集合
  • 缺点:
    • 两次拷贝:函数调用时,需要将集合从用户态拷贝到内核态;函数返回时,需要将修改后的集合从内核态拷贝到用户态
    • n + 1 次遍历:函数执行时,系统会对集合做若干次遍历,监控其就绪情况;函数返回后,进程需要遍历集合以寻找并处理就绪的文件描述符

三、Poll

  • 与 select 类似,区别在于没有文件描述符数量的限制

四、Epoll

  • Linux 系统上引入的一种高效的 IO 多路复用实现

  • 工作方式:

    • 创建池子:进程调用 epoll_create 方法,创建池子

    • 增删改查:进程调用 epoll_ctl 方法,增删改查文件描述符

      epoll 池内部会使用红黑树对文件描述符进行管理,保证查找性能

    • 等待:进程调用 epoll_wait 方法,进入等待

    • 监听:系统会监听集合,并在它们成功建立连接、成功接收请求时触发相应的事件,并将事件存储到队列中

    • 回调:系统进行事件出队,epoll_wait 方法返回

    • 处理:进程应该遍历返回的事件集合,进行处理即可

  • 优势:

    • 进程不再需要遍历所有的文件描述符,避免了遍历的开销

参考

  • 操作系统导论