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協議的滑動窗口具體是怎樣控制流量的?