操作系统 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
方法返回处理:进程应该遍历返回的事件集合,进行处理即可
优势:
- 进程不再需要遍历所有的文件描述符,避免了遍历的开销
参考
- 操作系统导论