epoll与select、poll区别

相关内容传送门:



  • 相比于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参数,这个只能通过更改宏设置后,重新编译内核来实现;
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值