跳转至

IO多路复用

IO通常指网络请求连接,复用就是一个线程同时监控多个请求连接,IO复用的三种实现

  • select
  • poll
  • epoll

select

可以得到有IO事件完成了,但是不知道是哪几个流完成的,所系需要轮询所有流查看对应的状态

poll

相比于select,poll没有最大连接数的限制,原因是poll使用链表存储连接,而select使用数组存储连接

epoll

epoll即event poll,epoll可以得到是哪个流发生了怎样的IO事件,不必轮询所有连接复杂度从O(n)降低到O(1) 不同实现的对比1

select poll epoll
操作方式 遍历 遍历 回调
数据结构 bitmap 数组 红黑树
最大连接数 1024(x86)或2048(x64) 无限制 无限制
最大支持文件描述符数 一般有最大值限制 65535 65535
fd拷贝 每次调用select,都需要把fd集合从用户态拷贝到内核态 每次调用poll,都需要把fd集合从用户态拷贝到内核态 fd首次调用epoll_ctl拷贝,每次调用epoll_wait不拷贝
工作模式 LT LT LT和ET
工作效率 每次调用都进行线性遍历,时间复杂度为O(n) 每次调用都进行线性遍历,时间复杂度为O(n) 事件通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪fd放到readyList里面,时间复杂度O(1)

评论