NIO 水平觸發,邊緣觸發的區別

2021-08-27 20:06:49 字數 750 閱讀 2993

在linux的io多路復用中有水平觸發,邊緣觸發兩種模式,這兩種模式的區別如下:

水平觸發:如果檔案描述符已經就緒可以非阻塞的執行io操作了,此時會觸發通知.允許在任意時刻重複檢測io的狀態,沒有必要每次描述符就緒後盡可能多的執行io.select,poll就屬於水平觸發.

邊緣觸發:如果檔案描述符自上次狀態改變後有新的io活動到來,此時會觸發通知.在收到乙個io事件通知後要盡可能多的執行io操作,因為如果在一次通知中沒有執行完io那麼就需要等到下一次新的io活動到來才能獲取到就緒的描述符.訊號驅動式io就屬於邊緣觸發.

epoll既可以採用水平觸發,也可以採用邊緣觸發.

大家可能還不能完全了解這兩種模式的區別,我們可以舉例說明:乙個管道收到了1kb的資料,epoll會立即返回,此時讀了512位元組資料,然後再次呼叫epoll.這時如果是水平觸發的,epoll會立即返回,因為有資料準備好了.如果是邊緣觸發的不會立即返回,因為此時雖然有資料可讀但是已經觸發了一次通知,在這次通知到現在還沒有新的資料到來,直到有新的資料到來epoll才會返回,此時老的資料和新的資料都可以讀取到(當然是需要這次你盡可能的多讀取).

下面我們還從電子的角度來解釋一下:

水平觸發:也就是只有高電平(1)或低電平(0)時才觸發通知,只要在這兩種狀態就能得到通知.上面提到的只要有資料可讀(描述符就緒)那麼水平觸發的epoll就立即返回.

邊緣觸發:只有電平發生變化(高電平到低電平,或者低電平到高電平)的時候才觸發通知.上面提到即使有資料可讀,但是沒有新的io活動到來,epoll也不會立即返回.

水平觸發和邊緣觸發的區別

水平觸發 level triggered,也被稱為條件觸發 lt 只要滿足條件,就觸發乙個事件 只要有資料沒有被獲取,核心就不斷通知你 邊緣觸發 edge triggered et 每當狀態變化時,觸發乙個事件 舉個讀socket的例子,假定經過長時間的沉默後,現在來了100個位元組,這時無論邊緣觸...

水平觸發和邊緣觸發的區別

水平觸發 level triggered,也被稱為條件觸發 lt 只要滿足條件,就觸發乙個事件 只要有資料沒有被獲取,核心就不斷通知你 邊緣觸發 edge triggered et 每當狀態變化時,觸發乙個事件 舉個讀socket的例子,假定經過長時間的沉默後,現在來了100個位元組,這時無論邊緣觸...

邊緣觸發和水平觸發的區別

只要檔案描述符關聯的讀核心緩衝區非空,有資料可以讀取,就一直發出可讀訊號進行通知,當檔案描述符關聯的核心寫緩衝區不滿,有空間可以寫入,就一直發出可寫訊號進行通知 lt模式支援阻塞和非阻塞兩種方式。epoll預設的模式是lt。當檔案描述符關聯的讀核心緩衝區由空轉化為非空的時候,則發出可讀訊號進行通知,...