彻底学会使用epoll(二)——ET和LT的触发方式

看了篇文章,受益匪浅

原文链接: http://blog.chinaunix.net/uid-28541347-id-4285054.html

分析了ET和LT的实现方式,那么分析他们的触发方式就容易多了。我们通过实现分析知道LT模式下epoll_wait被唤醒可以通过两种方式(图中红线和蓝线),而ET模式只能通过一种方式(图中红线)。所以ET模式下能被唤醒的情况,LT模式下一定也能被唤醒。我们先来讨论特殊情况(ET模式),再来讨论一般情况(LT模式)。

2.1 ET

根据上一节对两种加入rdlist途径的分析,可以得出ET模式下被唤醒(返回就绪)的条件为:

l 对于读取操作:

(1) 当buffer由不可读状态变为可读的时候,即由空变为不空的时候。

(2) 当有新数据到达时,即buffer中的待读内容变多的时候。

另外补充一点:

(3) 当buffer中有数据可读(即buffer不空)且用户对相应fd进行epoll_mod IN事件时(具体见下节内容)。

对于情况(1)(2)分别对应图1(a),图1(b)。

l 对于写操作:

(1) 当buffer由不可写变为可写的时候,即由满状态变为不满状态的时候。

(2) 当有旧数据被发送走时,即buffer中待写的内容变少得时候。

另外补充一点:

(3) 当buffer中有可写空间(即buffer不满)且用户对相应fd进行epoll_mod OUT事件时(具体见下节内容)。

对于情况(1)(2)分别对应图2(a),图2(b)。

彻底学会使用epoll(二)——ET和LT的触发方式_第1张图片 彻底学会使用epoll(二)——ET和LT的触发方式_第2张图片

​ (a) (b)

图1 ET读触发的两种情况

彻底学会使用epoll(二)——ET和LT的触发方式_第3张图片

图2 LT写触发的两种情况 (转载者注:这里作者可能是写错了,应该是ET写触发)

2.2 LT

LT模式下进程被唤醒(描述符就绪)的条件就简单多了,它包含ET模式的所有条件,也就是上述列出的六中读写被唤醒的条件都是用于LT模式。此外,还有更普通的情况LT可以被唤醒,而ET则不理会,这也是我们需要注意的情况。

l 对于读操作

当buffer中有数据,且数据被读出一部分后buffer还不空的时候,即buffer中的内容减少的时候,LT模式返回读就绪。如下图所示。

彻底学会使用epoll(二)——ET和LT的触发方式_第4张图片

l 对于写操作

当buffer不满,又写了一部分数据后扔然不满的的时候,即由于写操作的速度大于发送速度造成buffer中的内容增多的时候,LT模式会返回就绪。如下图所示。

彻底学会使用epoll(二)——ET和LT的触发方式_第5张图片

注:poll和select都是LT模式。

  • 小结:

    ET模式,可写

    1. 缓冲区满=>非满
    2. 缓冲区原先有数据,但是被人取走了一部分数据
    3. 缓冲区有空间的时候,用户设置了EPOLL_MOD_OUT

    ET模式,可读

    1. 缓冲区空=>非空
    2. 缓冲区原先有数据,但又来了数据
    3. 当缓冲区有数据的时候,用户设置了EPOLL_MOD_IN

    LT模式,可写

    1. 在ET的基础上,既缓冲区中有空闲就返回可写

    LT模式,可读

    1. 在ET的基础上机上,缓冲区中数据变少,也会返回,既一次性没读完

你可能感兴趣的:(Unix网络编程(第三版))