epoll 編程
LT(level triggered)是缺省的工做方式,而且同時支持block和no-block socket.在這種作法中,
內核告訴你一個
文件描述符是否就緒了,而後你能夠對這個就緒的fd進行IO操做。若是你不做任何操做,
內核仍是會繼續通知你的,因此,這種模式編程出錯誤可能性要小一點。傳統的select/poll都是這種模型的表明。
ET (edge-triggered)是高速工做方式,只支持no-block socket。在這種模式下,當描述符從未就緒變爲就緒時,
內核經過epoll告訴你。而後它會假設你知道
文件描述符已經就緒,而且不會再爲那個文件描述符發送更多的就緒通知,直到你作了某些操做致使那個文件描述符再也不爲就緒狀態了(好比,你在發送,接收或者接收請求,或者發送接收的數據少於必定量時致使了一個EWOULDBLOCK 錯誤)。可是請注意,若是一直不對這個fd做IO操做(從而致使它再次變成未就緒),
內核不會發送更多的通知(only once),不過在TCP協議中,ET模式的加速效用仍須要更多的benchmark確認。
ET和LT的區別就在這裏體現,LT事件不會丟棄,而是隻要讀buffer裏面有數據能夠讓用戶讀,則不斷的通知你。而ET則只在事件發生之時通知。能夠簡單理解爲LT是水平觸發,而ET則爲邊緣觸發。LT模式只要有事件未處理就會觸發,而ET則只在高低電平變換時(即狀態從1到0或者0到1)觸發。[1]