水平觸發與邊緣觸發

2021-09-23 22:27:24 字數 911 閱讀 7832

今天開始封裝c的socket的基礎,在封裝的時候意識到這樣乙個問題,如果我現在fd的接收緩衝區中有2048位元組的資料,但是我唯讀出來1024個位元組的資料,當我下次select的時候(這之間沒有網路資料過來), 還會檢測到該select可讀嗎?這樣就引申出來水linux的io多路復用中的水平觸發模式和邊緣觸發模式,那麼什麼是水平觸發模式,什麼是邊緣觸發模式呢?

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

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

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

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

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

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

水平觸發與邊緣觸發

1.水平觸發level trigger lt 狀態達到 當被監控的檔案描述符上有可讀寫事件發生時,會通知使用者程式去讀寫,如果使用者一次讀寫沒取完資料,他會一直通知使用者,如果這個描述符是使用者不關心的,它每次都返回通知使用者,則會導致使用者對於關心的描述符的處理效率降低。復用型io中的select...

水平觸發與邊緣觸發

水平觸發 level triggered,也稱條件觸發 select 和poll 將就緒的檔案描述符告訴程序後,如果程序沒有對其進行io操作,那麼下次呼叫select 和poll 的時候將再次報告這些檔案描述符,所以它們一般不會丟失就緒的訊息。邊緣觸發 edge triggered 只告訴程序哪些檔...

linux C epoll 水平觸發與邊緣觸發詳解

poll有兩種觸發方式 水平觸發與邊緣觸發的區別 水平觸發 只要緩衝區有資料就會一直觸發 邊沿觸發 只有在緩衝區增加資料的那一刻才會觸發 使用邊沿觸發 include include include include include int main int argc,char ar return 0...