即level-triggered and edge-triggered
簡單說來
level-triggered:
只要事件是處於就緒狀態,你每詢問一次,就告訴你一次它處於就緒狀態。
edge-triggered:
只有在狀態改變的時候告訴你,這也是為什麼et模式下,建議用非阻塞的socket。
下面我們來看看epoll對於兩類觸發是怎麼返回給使用者的。
當使用者呼叫epoll_wait時會返回一組事件,包括水平觸發的或邊緣觸發的。
epoll中有兩個重要的資料結構紅黑樹rbt,和乙個就緒列表ready-list。
呼叫epoll_wait時其實就是從ready-list中拿資料,
一般說來從ready-list中每拿乙個事件就刪除乙個事件,
但如果拿到的事件是水平觸發,它會放回read-list。
這是乙個很巧妙的操作!
這樣下次再取到這個事件的時候只要判斷一下該事件是否還有效就可以了。
這樣對於核心中其他地方來說,它們對於epoll只要有邊緣觸發的概念就好了。
網路io什麼的,只要在狀態改變的時候,告訴epoll就ok了。
而在epoll內部,它自己區分邊緣和水平,並呈現給使用者。
具體參見linux核心原始碼。
epoll 水平觸發 邊緣觸發
水平觸發 只要緩衝區還有資料,核心就還會通知使用者。使用者如果第一次讀取資料沒讀完,即使沒有任何新的操作觸發,還是可以繼續通過epoll wait來獲取事件 邊緣觸發 只有當新事件觸發的時候,才能通過epoll wait來獲取資料,如果第一次讀取資料沒讀完,就只能等待下一次事件觸發來獲取餘下的資料。...
epoll 水平觸發 邊緣觸發
先簡單比較一下level trigger 和 edge trigger 模式的不同。讓我們換乙個角度來理解et模式,事實上,epoll的et模式其實就是socket io完全狀態機。當socket由不可讀變成可讀時,epoll的et模式返回read 事件。對於read 事件,開發者需要保證把讀取緩衝...
epoll的水平觸發和邊緣觸發
水平觸發 level triggered 當滿足條件時,觸發.select和poll採用該方式 邊緣觸發 edge triggered 當狀態變化時,觸發.訊號驅動 signal driven i o 採用該方式 過程 當資料到來的時候,觸發器滿足條件,傳送通知,程序接收到通知後,請求核心讀取資料....