天天看點

## Linux面試問題彙總----Epoll的ET模式和LT模式(ET的非阻塞)                        Epoll的ET模式和LT模式(ET的非阻塞)

                        Epoll的ET模式和LT模式(ET的非阻塞)

epoll也是實作I/O多路複用的一種方法。epoll水準觸發(level trigger,LT,LT為epoll的預設工作模式)與邊緣觸發(edge trigger,ET)兩種工作模式。使用脈沖信号來解釋LT和ET可能更加貼切。Level是指信号隻需要處于水準,就一直會觸發;而edge則是指信号為上升沿或者下降沿時觸發。

LT:隻要核心緩沖區有資料就一直通知,隻要socket處于可讀狀态或可寫狀态,就會一直傳回sockfd;

ET:隻有狀态發生變化才通知,隻有當socket由不可寫到可寫或由不可讀到可讀,才會傳回其sockfd;

select(),poll()模型都是水準觸發模式,信号驅動IO是邊緣觸發模式,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确認。

水準觸發

1. 對于讀操作

隻要緩沖内容不為空,LT模式傳回讀就緒。

2. 對于寫操作

隻要緩沖區還不滿,LT模式會傳回寫就緒。

邊緣觸發

1. 對于讀操作

(1)當緩沖區由不可讀變為可讀的時候,即緩沖區由空變為不空的時候。

(2)當有新資料到達時,即緩沖區中的待讀資料變多的時候。

(3)當緩沖區有資料可讀,且應用程序對相應的描述符進行EPOLL_CTL_MOD 修改EPOLLIN事件時。

2. 對于寫操作

(1)當緩沖區由不可寫變為可寫時。

(2)當有舊資料被發送走,即緩沖區中的内容變少的時候。

(3)當緩沖區有空間可寫,且應用程序對相應的描述符進行EPOLL_CTL_MOD 修改EPOLLOUT事件時。

## Linux面試問題彙總----Epoll的ET模式和LT模式(ET的非阻塞)                        Epoll的ET模式和LT模式(ET的非阻塞)

繼續閱讀