水平觸發(level-triggered,也被稱為條件觸發)lt: 只要滿足條件,就觸發乙個事件(只要有資料沒有被獲取,核心就不斷通知你)
邊緣觸發(edge-triggered)et: 每當狀態變化時,觸發乙個事件
「舉個讀socket的例子,假定經過長時間的沉默後,現在來了100個位元組,這時無論邊緣觸發和條件觸發都會產生乙個read ready notification通知應用程式可讀。應用程式讀了50個位元組,然後重新呼叫api等待io事件。這時條件觸發的api會因為還有50個位元組可讀從 而立即返回使用者乙個read ready notification。而邊緣觸發的api會因為可讀這個狀態沒有發生變化而陷入長期等待。 因此在使用邊緣觸發的api時,要注意每次都要讀到socket返回ewouldblock為止,否則這個socket就算廢了。而使用條件觸發的api 時,如果應用程式不需要寫就不要關注socket可寫的事件,否則就會無限次的立即返回乙個write ready notification。大家常用的select就是屬於條件觸發這一類,長期關注socket寫事件會出現cpu 100%的毛病。
邊緣觸發和水平(條件)觸發
條件觸發 lt 和邊緣觸發 et 的區別在於事件的時間點 邊緣觸發 每當狀態變化時發生乙個io事件 條件觸發 只要滿足條件就發生乙個io事件 在條件觸發方式中,只要輸入緩衝有資料就會一直通知該事件。例如 伺服器輸入緩衝收到50位元組的資料時,伺服器端作業系統將通知該事件 註冊到發生變化的檔案描述符 ...
epoll 水平觸發 邊緣觸發
水平觸發 只要緩衝區還有資料,核心就還會通知使用者。使用者如果第一次讀取資料沒讀完,即使沒有任何新的操作觸發,還是可以繼續通過epoll wait來獲取事件 邊緣觸發 只有當新事件觸發的時候,才能通過epoll wait來獲取資料,如果第一次讀取資料沒讀完,就只能等待下一次事件觸發來獲取餘下的資料。...
epoll 水平觸發 邊緣觸發
先簡單比較一下level trigger 和 edge trigger 模式的不同。讓我們換乙個角度來理解et模式,事實上,epoll的et模式其實就是socket io完全狀態機。當socket由不可讀變成可讀時,epoll的et模式返回read 事件。對於read 事件,開發者需要保證把讀取緩衝...