epoll IO EVENT NOTIFICATION FACILITY学习

EPOLL :epoll_create/epoll_ctl/epoll_wait

水平触发和边缘触发:使用水平触发的epoll和poll相同。

EPOLLET

1.管道的read端口rfd注册到epoll

2.管道的write端口写2K的数据

3.调用epoll_wait等待rfd资源可用

4.从rfd读1K的数据

5.再次调用epoll_wait

步骤5中调用的epoll_wait可能被阻塞,尽管输入buffer中的数据可以操作

ET只有在rfd的状态发生变化时才会触发事件。

①LT模式:Level Triggered水平触发

这个是缺省的工作模式。同时支持block socket和non-block socket。内核会告诉程序员一个文件描述符是否就绪了。如果程序员不作任何操作,内核仍会通知。

 

②ET模式:Edge Triggered 边缘触发

是一种高速模式。仅当状态发生变化的时候才获得通知。这种模式假定程序员在收到一次通知后能够完整地处理事件,于是内核不再通知这一事件。注意:缓冲区中还有未处理的数据不算状态变化,所以ET模式下程序员只读取了一部分数据就再也得不到通知了,正确的用法是程序员自己确认读完了所有的字节(一直调用read/write直到出错EAGAIN为止)。

 An application that employs the EPOLLET flag should use non-blocking file descriptors to avoid having a blocking read or write starve a task that is handling multiple file descriptors.

  The suggested way to use epoll as an edge-triggered (EPOLLET) interface is as follows:
              i   with non-blocking file descriptors; and
              ii  by waiting for an event only after read(2) or write(2) return EAGAIN.

如下图:

0:表示文件描述符未准备就绪

1:表示文件描述符准备就绪

image_thumb[2]

 

对于水平触发模式(LT):在1处,如果你不做任何操作,内核依旧会不断的通知进程文件描述符准备就绪。

对于边缘出发模式(ET): 只有在0变化到1处的时候,内核才会通知进程文件描述符准备就绪。之后如果不在发生文件描述符状态变化,内核就不会再通知进程文件描述符已准备就绪。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值