下面是二者的定義:
條件觸發(lt):只要輸入緩衝有資料就會一直通知該事件
邊緣觸發(et):輸入緩衝收到資料時僅註冊1次該事件,即使輸入緩衝中還留有資料,也不會再進行註冊
從而我要說明的是,為什麼要強調邊緣觸發要使用非阻塞io;
因為在伺服器端當epoll_wait監聽到有客戶端fd可讀寫時,那麼就只會返回這一次,但是並不知道此fd有多少資料可讀的,如果一直讀到沒有資料時,那麼就會使得伺服器端阻塞,但是條件觸發會一直返回有可讀資料的fd,從而就不會存在fd是返回的,且沒有資料可讀,從而導致程序阻塞。所以需要對邊緣觸發設定非阻塞io,其實就是防止你一直讀,因為你不知道這個是否是還有資料可讀了。
總結一下:
1. 對於監聽的 sockfd,最好使用水平觸發模式,邊緣觸發模式會導致高併發情況下,有的客戶端會連線不上。如果非要使用邊緣觸發,可以用 while 來迴圈 accept()。
2. 對於讀寫的 connfd,水平觸發模式下,阻塞和非阻塞效果都一樣,建議設定非阻塞。
3. 對於讀寫的 connfd,邊緣觸發模式下,必須使用非阻塞 io,並要求一次性地完整讀寫全部資料
(參考知乎:
epoll的ET和LT的觸發events
水平觸發 對於讀操作 只要緩衝內容不為空,lt模式返回讀就緒。對於寫操作 只要緩衝區還不滿,lt模式會返回寫就緒。邊緣觸發 對於讀操作 1 當緩衝區由不可讀變為可讀的時候,即緩衝區由空變為不空的時候。2 當有新資料到達時,即緩衝區中的待讀資料變多的時候。3 當緩衝區有資料可讀,且應用程序對相應的描述...
epoll的ET和LT模式
從man手冊中,得到et和lt的具體描述如下 epoll事件有兩種模型 edge triggered et level triggered lt 假如有這樣乙個例子 1.我們已經把乙個用來從管道中讀取資料的檔案控制代碼 rfd 新增到epoll描述符 2.這個時候從管道的另一端被寫入了2kb的資料 ...
ET和LT觸發方式
et模式只能通過一種方式 圖中紅線 所以et模式下能被喚醒的情況,lt模式下一定也能被喚醒。我們先來討論特殊情況 et模式 再來討論一般情況 lt模式 1 當buffer由不可讀狀態變為可讀的時候,即由空變為不空的時候。2 當有新資料到達時,即buffer中的待讀內容變多的時候。另外補充一點 3 當...