select/epoll
的特點
select
的特點:
select
選擇控制代碼的時候,是遍歷所有控制代碼,也就是說控制代碼有事件響應時,
select
需要遍歷所有控制代碼才能獲取到哪些控制代碼有事件通知,因此效率是非常低。但是如果連線很少的情況下,
select
和epoll的lt
觸發模式相比,
效能上差別不大。
這裡要多說一句,
select
支援的控制代碼數是有限制的,
同時只支援
1024
個,這個是控制代碼集合限制的,如果超過這個限制,很可能導致溢位,而且非常不容易發現問題,
taf就出現過這個問題,
除錯了n
天,才發現:)當然可以通過修改
linux
的socket
核心調整這個引數。
epoll
的特點:
epoll
對於控制代碼事件的選擇不是遍歷的,是事件響應的,就是控制代碼上事件來就馬上選擇出來,不需要遍歷整個控制代碼鍊錶,因此效率非常高,核心將控制代碼用紅黑樹儲存的。
對於epoll
而言還有et和
lt的區別,
lt表示水平觸發,
et表示邊緣觸發,兩者在效能以及**實現上差別也是非常大的。
epoll的lt
和et的區別
lt:水平觸發,
效率會低於
et觸發,尤其在大併發,大流量的情況下。但是
lt對**編寫要求比較低,不容易出現問題。
lt模式服務編寫上的表現是:只要有資料沒有被獲取,核心就不斷通知你,因此不用擔心事件丟失的情況。
et:邊緣觸發,
效率非常高,在併發,大流量的情況下,會比
lt少很多
epoll
的系統呼叫,因此效率高。但是對程式設計要求高,需要細緻的處理每個請求,否則容易發生丟失事件的情況。
下面舉乙個列子來說明lt和
et的區別(都是非阻塞模式,阻塞就不說了,效率太低):
採用lt
模式下,
如果accept
呼叫有返回就可以馬上建立當前這個連線了,再
epoll_wait
等待下次通知,和
select
一樣。但是對於
et而言,如果
accpet
呼叫有返回,除了建立當前這個連線外,不能馬上就
epoll_wait
還需要繼續迴圈
accpet
,直到返回
-1,且
errno==eagain
,taf
裡面的示例**:
epoll兩種觸發模式
二 詳細 三 測試效果 lt level triggered lt是預設的工作方式,並且同時支援block和no block socket。在這種做法中,核心告訴你乙個檔案描述符是否就緒了,然後你可以對這個就緒的fd進行io操作。如果你不作任何操作,核心還是會繼續通知你的,所以,這種模式程式設計出錯...
epoll兩種模式(lt et)複習
最近又在複習一些基礎知識,現在看看epoll的相關知識點。兩種模式 簡單理解 lt 水平觸發 對於採用lt工作模式的檔案描述符,當epoll wait檢測到其上有事件發生並將此事件通知應用程式後,應用程式可以不立即處理該事件,當應用程式下一次呼叫epoll wait時,epoll waite還會再次...
epoll的兩種模式 LT ET
關於epoll的兩種工作模式 lt level trigger,電平觸發 模式 et edge trigger,邊沿觸發 模式。et模式在很大程度上降低了同乙個 epoll 事件被重複觸發的次數。用以下 測試 lt et在工作方式上的差異。include include include includ...