EPOLLET VS EPOLLLT

EPOLLET VS EPOLLLT

EPOLLET

ET:Edge Triggered 邊緣觸發

邊緣觸發模式,簡單說,系統只在狀態改變時觸發事件,當有數據到達時會觸發EPOLLIN事件,應用層應該在一次事件觸發時,讀取完socket緩衝區的全部數據,直到返回EAGAIN,表明緩衝區數據讀完,否則,epoll只會在再次數據到達時觸發事件,導致消息處理嚴重延遲。

當客戶伺服器使用一種定長的TCP位元組流協議時,當發送方的速率很快時,一次可能發送N個msg1請求包,但接收方只會觸發一次EPOLLIN,這時,接收方一般需要二重循環讀取完本次全部的消息處理完畢,否則會發現很奇怪的現象,發送方再發送另外一類msg2消息,接收方觸發後處理的卻是msg1,哈哈,消息處理會一直延遲,血的教訓。。。

所以,ET模式,一定是:一次觸發,全部讀取!

設置方式

非阻塞模式:fcntl(O_NONBLOCK)

ev.events = EPOLLIN|EPOLLET|EPOLLERR

ev.data.fd = socketfd

epoll_ctl(ADD)

EPOLLLT

LT:Level Triggered 水平觸發

socket緩衝區有數據可讀時, 讀事件一直觸發,上層應用程序一直收到讀事件,epoll_wait會一直觸發返回;

socket緩衝區沒滿可寫時, 寫事件會一直觸發,epoll_wait會一直觸發返回;

可以看出,ET模式更加簡潔高效,項目中喜歡用ET.

推薦閱讀:

UNP第三版中大篇幅的介紹了SCTP,請問SCTP應用的發展趨勢怎麼樣?有沒有多投入學習的必要?
ipconfig下的IPv4地址是什麼意思?
IP層接收到比MTU大的數據包會先分片再重組,隨後在傳遞給上層協議(比如UDP)處理嗎?
為什麼整個127.*網段都被拿來當做環回地址了?
TCP協議的滑動窗口具體是怎樣控制流量的?

TAG:計算機網路 | TCPIP |