水平觸發(level triggered): 當滿足條件時, 觸發. (select和poll採用該方式)
邊緣觸發(edge triggered): 當狀態變化時,觸發. (訊號驅動[signal-driven i/o]採用該方式)
過程:當資料到來的時候, 觸發器滿足條件,傳送通知, 程序接收到通知後,請求核心讀取資料.
水平觸發,是因為資料就緒,可io,滿足條件,則傳送通知.
邊緣觸發,是因為狀態發生了變化, 則傳送通知.
理想情況下, 兩種觸發方式都能滿足需求.
但是當核心在讀取資料的過程無法一次讀完, 就會產生問題.
水平觸發: 這裡依舊有資料在, 傳送通知!
邊緣觸發: 沒有狀態變化, 不傳送...
於是, 邊緣觸發情況下,未讀資料就再無法被讀到.
相較而言 邊緣觸發的實際使用效率並沒有大幅度提高, 而且還需要解決資料.
在epoll中, lt(level triggered)模式為預設預設.
如果需要選擇使用et(edge triggered)模式, 則需要考慮, 如何解決資料讀取問題.
epoll 水平觸發 邊緣觸發
水平觸發 只要緩衝區還有資料,核心就還會通知使用者。使用者如果第一次讀取資料沒讀完,即使沒有任何新的操作觸發,還是可以繼續通過epoll wait來獲取事件 邊緣觸發 只有當新事件觸發的時候,才能通過epoll wait來獲取資料,如果第一次讀取資料沒讀完,就只能等待下一次事件觸發來獲取餘下的資料。...
epoll 水平觸發 邊緣觸發
先簡單比較一下level trigger 和 edge trigger 模式的不同。讓我們換乙個角度來理解et模式,事實上,epoll的et模式其實就是socket io完全狀態機。當socket由不可讀變成可讀時,epoll的et模式返回read 事件。對於read 事件,開發者需要保證把讀取緩衝...
epoll的水平觸發和邊緣觸發
即level triggered and edge triggered 簡單說來 level triggered 只要事件是處於就緒狀態,你每詢問一次,就告訴你一次它處於就緒狀態。edge triggered 只有在狀態改變的時候告訴你,這也是為什麼et模式下,建議用非阻塞的socket。下面我們來...