天天看點

epoll的ET和LT兩種模式對比及注意事項

ET模式:

因為ET模式隻有從unavailable到available才會觸發,是以

1、讀事件:需要使用while循環讀取完,一般是讀到EAGAIN,也可以讀到傳回值小于緩沖區大小;

如果應用層讀緩沖區滿:那就需要應用層自行标記,解決OS不再通知可讀的問題

2、寫事件:需要使用while循環寫到EAGAIN,也可以寫到傳回值小于緩沖區大小

如果應用層寫緩沖區空(無内容可寫):那就需要應用層自行标記,解決OS不再通知可寫的問題。

LT模式:

因為LT模式隻要available就會觸發,是以:

1、讀事件:因為一般應用層的邏輯是“來了就能讀”,是以一般沒有問題,無需while循環讀取到EAGAIN;

如果應用層讀緩沖區滿:就會經常觸發,解決方式如下;

2、寫事件:如果沒有内容要寫,就會經常觸發,解決方式如下。

LT經常觸發讀寫事件的解決辦法:修改fd的注冊事件,或者把fd移出epollfd。

總結:

目前好像還是LT方式應用較多,包括redis、libuv等。(nginx使用ET)

LT模式的優點在于:事件循環處理比較簡單,無需關注應用層是否有緩沖或緩沖區是否滿,隻管上報事件。缺點是:可能經常上報,可能影響性能。

繼續閱讀