天天看點

epoll 觸發模式

Edge Triggered (ET):邊緣觸發隻有資料到來,才觸發,不管緩存區中是否還有資料。

Level Triggered (LT):水準觸發隻要有資料都會觸發。

LT(level triggered)是預設的工作方式,并且同時支援block和no-block socket。在這種做法中,核心告訴你一個檔案描述符是否就緒了,然後你可以對這個就緒的fd進行IO操作。如果你不作任何操作,核心還是會繼續通知你的,是以,這種模式程式設計出錯誤可能性要小一點。傳統的select/poll都是這種模型的代表。

優點:當進行socket通信的時候,保證了資料的完整輸出,進行IO操作的時候,如果還有資料,就會一直的通知你。

缺點:由于隻要還有資料,核心就會不停的從核心空間轉到使用者空間,所有占用了大量核心資源,試想一下當有大量資料到來的時候,每次讀取一個位元組,這樣就會不停的進行切換。核心資源的浪費嚴重。效率來講也是很低的。

ET(edge-triggered)是高速工作方式,隻支援no-block socket。在這種模式下,當描述符從未就緒變為就緒時,核心通過epoll告訴你。然後它會假設你知道檔案描述符已經就緒,并且不會再為那個檔案描述符發送更多的就緒通知。請注意,如果一直不對這個fd作IO操作(進而導緻它再次變成未就緒),核心不會發送更多的通知(only once)。

優點:每次核心隻會通知一次,大大減少了核心資源的浪費,提高效率。

缺點:不能保證資料的完整。不能及時的取出所有的資料。

應用場景:處理大資料。使用non-block模式的socket。

you are the best!

繼續閱讀