linux网络编程(十)IO函数select、poll、epoll等区别
可以用以下表格对比来看select, poll, epoll的区别:
|
select
|
poll
|
epoll
|
|
|
操作方式
|
遍历
|
遍历
|
回调
|
|
底层实现
|
数组
|
链表
|
红黑树
|
|
IO效率
|
每次调用都进行线性遍历,时间复杂度为O(n)
|
每次调用都进行线性遍历,时间复杂度为O(n)
|
事件通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪fd放到readyList里面,时间复杂度O(1)
|
|
最大连接数
|
1024(x86)或2048(x64)
|
无上限
|
无上限
|
|
fd拷贝
|
每次调用select,都需要把fd集合从用户态拷贝到内核态
|
每次调用poll,都需要把fd集合从用户态拷贝到内核态
|
调用epoll_ctl时拷贝进内核并保存,之后每次epoll_wait不拷贝
|
epoll是Linux目前大规模网络并发程序开发的首选模型。在绝大多数情况下性能远超select和poll。目前流行的高性能web服务器Nginx正式依赖于epoll提供的高效服务。但是,在并发连接不高的情况下,多线程+阻塞I/O方式可能性能更好。
浙公网安备 33010602011771号