epoll的ET和LT模式觸發場景

epoll有兩種事件模型:
Level Triggered (LT) 水平觸發
socket接收緩衝區不爲空,有數據可讀,讀事件一直觸發
socket發送緩衝區不滿,可以繼續寫入數據,寫事件一直觸發
Edge Triggered (ET) 邊緣觸發
socket的接收緩衝區狀態變化時觸發讀事件
socket的發送緩衝區狀態變化時觸發寫事件
總結:
水平觸發:只要可讀,就一直觸發讀事件,只要可寫,就一直觸發寫事件
邊緣觸發:從不可讀變爲可讀,從可讀變爲不可讀,從不可寫變爲可寫,從可寫變爲不可寫,都只觸發一次

水平觸發:

1.從accept成功之後,可寫事件就會一直觸發,直到發送緩衝區滿了。對方給你發送了數據,只要你的接收緩衝區還有數據沒取完就會一直觸發可讀事件。

2.當對方斷開連接,不管是主動斷開還是異常斷開,都會觸發可讀可寫事件。爲什麼?因爲你recv和send的時候都會給你返回(主動斷開0,異常斷開-1)。

關於epoll的觸發和fd的狀態:

讀事件觸發,寫事件觸發和可讀,可寫要分開。比如說讀事件的觸發告訴我們有數據可讀,但是可讀只是說我們讀不會阻塞,會有返回,並不代表能成功讀到數據。就像斷開連接,觸發了可讀,我們去recv了確實沒有阻塞,還給了我們返回“數據”,立即出錯告訴我們斷開了。

邊緣觸發:

1.從不可讀變爲可讀:從接收緩衝區爲空,到接收到數據後觸發一次

2.從可讀變爲不可讀:斷開連接,從可讀變爲不可讀觸發一次

3.從不可寫變爲可寫:從accept建立連接觸發一次

4.從可寫變爲不可寫:斷開連接,從可寫變爲不可寫觸發一次

這裏有一個很有意思的地方,當你對fd註冊了可讀可寫事件時,每次可讀事件觸發都會給你順便帶上一個可寫事件出來。比如說場景1,接收到對方數據了,觸發了可讀可寫事件,雖然觸發的原因是可讀,但是此時fd的狀態是可讀可寫,還是準確了反應此時fd的狀態。

如果你只註冊可寫事件,那麼就只有2,3和4場景會觸發,2和4雷同。如果你註冊了可讀可寫,那麼4個場景都會有可寫事件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章