`
splayx
  • 浏览: 82430 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

epoll的水平触发和边缘触发

    博客分类:
  • net
 
阅读更多

即Level-Triggered and Edge-Triggered

 

简单说来

Level-Triggered:

只要事件是处于就绪状态,你每询问一次,就告诉你一次它处于就绪状态。

Edge-Triggered:

只有在状态改变的时候告诉你,这也是为什么et模式下,建议用非阻塞的socket。

 

下面我们来看看epoll对于两类触发是怎么返回给用户的。

当用户调用epoll_wait时会返回一组事件,包括水平触发的或边缘触发的。

 

epoll中有两个重要的数据结构红黑树rbt,和一个就绪列表ready-list。

调用epoll_wait时其实就是从ready-list中拿数据,

一般说来从ready-list中每拿一个事件就删除一个事件,

但如果拿到的事件是水平触发,它会放回read-list。

这是一个很巧妙的操作!

这样下次再取到这个事件的时候只要判断一下该事件是否还有效就可以了。

这样对于内核中其他地方来说,它们对于epoll只要有边缘触发的概念就好了。

网络IO什么的,只要在状态改变的时候,告诉epoll就OK了。

而在epoll内部,它自己区分边缘和水平,并呈现给用户。

 

具体参见linux内核源码。

1
5
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics