天天看點

徹底學會使用epoll(二)——ET和LT的觸發方式

分析了ET和LT的實作方式,那麼分析他們的觸發方式就容易多了。我們通過實作分析知道LT模式下epoll_wait被喚醒可以通過兩種方式(圖中紅線和藍線),而ET模式隻能通過一種方式(圖中紅線)。是以ET模式下能被喚醒的情況,LT模式下一定也能被喚醒。我們先來讨論特殊情況(ET模式),再來讨論一般情況(LT模式)。

根據上一節對兩種加入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的觸發方式
徹底學會使用epoll(二)——ET和LT的觸發方式

                                    (a)                                                                                                       (b)

圖1 ET讀觸發的兩種情況

徹底學會使用epoll(二)——ET和LT的觸發方式

圖2 LT寫觸發的兩種情況

LT模式下程序被喚醒(描述符就緒)的條件就簡單多了,它包含ET模式的所有條件,也就是上述列出的六中讀寫被喚醒的條件都是用于LT模式。此外,還有更普通的情況LT可以被喚醒,而ET則不理會,這也是我們需要注意的情況。

l 對于讀操作

當buffer中有資料,且資料被讀出一部分後buffer還不空的時候,即buffer中的内容減少的時候,LT模式傳回讀就緒。如下圖所示。 

徹底學會使用epoll(二)——ET和LT的觸發方式

l 對于寫操作

當buffer不滿,又寫了一部分資料後扔然不滿的的時候,即由于寫操作的速度大于發送速度造成buffer中的内容增多的時候,LT模式會傳回就緒。如下圖所示。

徹底學會使用epoll(二)——ET和LT的觸發方式

注:poll和select都是LT模式。

繼續閱讀