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) |