• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

selectpoll和epoll

linux 搞代码 3年前 (2022-03-03) 35次浏览 已收录 0个评论
文章目录[隐藏]

在浏览UNIX环境高级编程中,发现只写了select和poll,对于epoll的回调机制还有所不了解。

IO多路复用

首先要了解LINUX网络IO多路复用,IO多路复用在Linux下包含了三种,select, poll, epoll,形象来看,他们性能是相似的,但具体细节各有不同:首先都会对一组文件描述符进行相干事件的注册,而后阻塞期待某些事件的产生或期待超时。更多细节详见上面的 “具体怎么用”。IO多路复用都能够关注多个文件描述符,但对于这三种机制而言,不同数量级文件描述符对性能的影响是不同的,上面会具体介绍。

select

select将监听的文件描述符分为三组,每一组监听不同的须要进行的IO操作。readfds是须要进行读操作的文件描述符,writefds是须要进行写操作的文件描述符,exceptfds是须要进行异样事件处理的文件描述符。这三个参数能够用NULL来示意对应的事件不须要监听。

当select返回时,每组文件描述符会被select过滤,只留下能够进行对应IO操作的文件描述符。

  • linux 下 fd_set 是个 1024 位的位图,每个位代表一个 fd 的值,返回后须要扫描位图,这也是效率低的起因。性能问题且不提,正确性问题则更值得器重。因为这是一个 1024 位的位图,因而当过程内的 fd 值 >= 1024 时,就会越界,可能会造成解体。对于服务器程序,fd >= 1024 很容易达到,只有连接数 + 关上的文件数足够大即可产生。
  • 再来看fd_set构造体是怎么记录一批文件描述符是否有事件触发的。认真看fd_set构造的定义能够发现,他其实是一个__int32_t类型的数组,数组所有元素加起来共蕴含1024bit(由FD_SETSIZE定义)。记录某个文件描述符是否触发事件时,一个bit代表一个文件描述符的状态,0示意没有触发事件,1示意触发,把文件形容的数值映射为下标,计算出哪一bit代表了这个文件描述符的状态。

因而能够看出,一旦文件描述符的数值超出1024,计算出的下标就有可能超出__int32_t数组的最大下标地位,所以有可能会呈现数组越界的问题。

poll

和select用三组文件描述符不同的是,poll只有一个pollfd数组,数组中的每个元素都示意一个须要监听IO操作事件的文件描述符。events参数是咱们须要关怀的事件,revents是所有内核监测到的事件。

  • Poll机制冲破了Select机制中的文件描述符数量最大为1024的限度。

epoll

epoll_create用于创立一个epoll实例,而epoll_ctl用于往epoll实例中增删改要监测的文件描述符,epoll_wait则用于阻塞的期待能够执行IO操作的文件描述符直到超时。

  • 增加到文件描述符上的理论都会与网卡建设回调机制,也就是理论产生时会自主调用一个回调办法,将事件所在的文件描述符插入到就绪队列中
  • 援用程序调用epoll_wait 就能够间接从就绪队列中将所有就绪的文件描述符拿到,能够说工夫复杂度O(1)

对于上述的回调机制如何实现,还在查阅epoll相干源码中

level-triggered and edge-triggered

状态继续告诉和状态变动告诉。

这两个概念来自电路,triggered代表电路激活,也就是有事件告诉给程序,level-triggered示意只有有IO操作能够进行比方某个文件描述符有数据可读,每次调用epoll_wait都会返回以告诉程序能够进行IO操作,edge-triggered示意只有在文件描述符状态发生变化时,调用epoll_wait才会返回,如果第一次没有全副读完该文件描述符的数据而且没有新数据写入,再次调用epoll_wait都不会有告诉给到程序,因为文件描述符的状态没有变动。

select和poll都是状态继续告诉的机制,且不可扭转,只有文件描述符中有IO操作能够进行,那么select和poll都会返回以告诉程序。而epoll两种告诉机制可选。

不同IO多路复用计划优缺点

poll vs select

poll和select基本上是一样的,poll相比select好在如下几点:

  1. poll传参对用户更敌对。比方不须要和select一样计算很多奇怪的参数比方nfds(值最大的文件描述符+1),再比方不须要离开三组传入参数。
  2. poll会比select性能稍好些,因为select是每个bit位都检测,假如有个值为1000的文件描述符,select会从第一位开始检测始终到第1000个bit位。但poll检测的是一个数组。
  3. select的工夫参数在返回的时候各个系统的解决形式不对立,如果心愿程序可移植性更好,须要每次调用select都初始化工夫参数。

select比poll好在上面几点

  1. 反对select的零碎更多,兼容更弱小,有一些unix零碎不反对poll
  2. select提供精度更高(到microsecond)的超时工夫,而poll只提供到毫秒的精度。

但总体而言 select和poll基本一致。

epoll vs poll&select

epoll优于select&poll在上面几点:

  1. 在须要同时监听的文件描述符数量减少时,select&poll是O(N)的复杂度,epoll是O(1),在N很小的状况下,差距不会特地大,但如果N很大的前提下,一次O(N)的循环可要比O(1)慢很多,所以高性能的网络服务器都会抉择epoll进行IO多路复用。
  2. epoll外部用一个文件描述符挂载须要监听的文件描述符,这个epoll的文件描述符能够在多个线程/过程共享,所以epoll的应用场景要比select&poll要多。

参考

https://zhuanlan.zhihu.com/p/…
https://www.gaodaima.com/p/019…
https://www.cnblogs.com/Anker…
https://www.cnblogs.com/anker…


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:selectpoll和epoll

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址