epoll与selectpoll区别

Posted 清水寺扫地僧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了epoll与selectpoll区别相关的知识,希望对你有一定的参考价值。

相关内容传送门:



  • 相比于select与poll,epoll最大的好处在于它不会随着监听fd数目的增加而降低效率。
    epoll最开始使用的是hash构建监听数据结构,现下使用红黑树来构建监听数据结构,和监听事件的数目是 l o g 2 n log_2n log2n的;
    select和poll则使用轮询的方法(两次遍历,先是select和poll函数阻塞过程中一次遍历,返回后在用户代码中需再一次遍历处理到达的事件),即使使用了自定义数组存储要监听的文件描述符,轮询时间还是和要监听的时间数目是线性的);
  • epoll的实现是基于回调的,如果fd有期望的事件发生就通过回调函数将其加入epoll就绪队列中,也就是说epoll只关心活跃的fd/文件标识符,与fd的数目无关(这样免去了轮询的时间,也即一次遍历也不需要,大大提高了效率);
  • 内核/用户空间拷贝问题,为了把内核侦测到的fd消息通知给用户空间,select/poll采用了内存拷贝的方式,涉及到的空间有发送端的用户空间,内存空间,接收端的同样两个个空间,两个进程间的通信还有一个socket网络套接口,五个端点所以共有四次拷贝;而epoll采用共享内存方式,只涉及内核空间、共享空间(mmap()共享内存详解)和用户空间三方的拷贝操作,只涉及两次拷贝;
  • epoll不仅会告诉应用程序有I/O事件到来(免去第一次阻塞过程中的轮询遍历),还会告诉应用程序相关的信息,这些信息是应用程序填充的,因此根据这些信息应用程序就可直接定位到事件,而不必遍历整个fd集合(直接定位是指events.data.fd字段内存,对应select,poll用户代码当中的第二次遍历)。


select的最大连接数受两个因素制约:

  • 内核限定的一个进程所能打开的最大文件数参数 ,可使用ulimit -n num来更改该内核参数,同时可通过cat /proc/sys/fs/file-max查看能调整的最大数;
  • select函数当中限定的FD_SIZE参数,这个只能通过更改宏设置后,重新编译内核来实现;

以上是关于epoll与selectpoll区别的主要内容,如果未能解决你的问题,请参考以下文章

selectpoll和epoll之间的区别

selectpoll和epoll的区别(转载)

selectpoll和epoll机制

selectpoll和epoll多路I/O复用

五种高阶IO模型以及多路转接技术(selectpoll和epoll)及其代码验证

五种高阶IO模型以及多路转接技术(selectpoll和epoll)及其代码验证