et模式只能通過一種方式(圖中紅線)。所以et模式下能被喚醒的情況,lt模式下一定也能被喚醒。我們先來討論特殊情況(et模式),再來討論一般情況(lt模式)。(1) 當buffer由不可讀狀態變為可讀的時候,即由空變為不空的時候。
(2) 當有新資料到達時,即buffer中的待讀內容變多的時候。
另外補充一點:
(3) 當buffer中有資料可讀(即buffer不空)且使用者對相應fd進行epoll_mod
in事件時。
對於情況(1)(2)分別對應圖1(a),圖1(b)。
對於寫操作
(1) 當buffer由不可寫變為可寫的時候,即由滿狀態變為不滿狀態的時候。
(2) 當有舊資料被傳送走時,即buffer中待寫的內容變少得時候。
另外補充一點:
(3) 當buffer中有可寫空間(即buffer不滿)且使用者對相應fd進行epoll_mod
out事件時(具體見下節內容)。
對於情況(1)(2)分別對應圖2(a),圖2(b)。
lt模式下程序被喚醒(描述符就緒)的條件就簡單多了,它包含et模式的所有條件,也就是上述列出的六中讀寫被喚醒的條件都是用於lt模式。此外,還有更普通的情況lt可以被喚醒,而et則不理會,這也是我們需要注意的情況。
對於讀操作
當buffer中有資料,且資料被讀出一部分後buffer還不空的時候,即buffer中的內容減少的時候,lt模式返回讀就緒。如下圖所示。
對於寫操作
當buffer不滿,又寫了一部分資料後扔然不滿的的時候,即由於寫操作的速度大於傳送速度造成buffer中的內容增多的時候,lt模式會返回就緒。如下圖所示。
注:poll和select都是lt模式。
epoll的 LT 條件觸發和 ET 邊緣觸發
下面是二者的定義 條件觸發 lt 只要輸入緩衝有資料就會一直通知該事件 邊緣觸發 et 輸入緩衝收到資料時僅註冊1次該事件,即使輸入緩衝中還留有資料,也不會再進行註冊 從而我要說明的是,為什麼要強調邊緣觸發要使用非阻塞io 因為在伺服器端當epoll wait監聽到有客戶端fd可讀寫時,那麼就只會返...
epoll的ET和LT的觸發events
水平觸發 對於讀操作 只要緩衝內容不為空,lt模式返回讀就緒。對於寫操作 只要緩衝區還不滿,lt模式會返回寫就緒。邊緣觸發 對於讀操作 1 當緩衝區由不可讀變為可讀的時候,即緩衝區由空變為不空的時候。2 當有新資料到達時,即緩衝區中的待讀資料變多的時候。3 當緩衝區有資料可讀,且應用程序對相應的描述...
LT模式 ET模式
lt 在資料到達之後,無論程式是沒有接收,還是接收了,但沒有接收完,下一輪epoll wait仍然會提醒應用程式該描述符上有資料,知道資料被接收完。同一事件僅僅被觸發一次 include include include include include include include include ...