1、基於概念
epoll是一種機制,來處理大量併發連線時事件的讀寫順序。
在linux
的網路程式設計中,很長的時間都在使用
select
來做事件觸發
。2.5.x
核心後,引入
epoll
。epoll是
linux
核心為處理大批量控制代碼而作了改進的
poll
,是linux
下多路復用
io介面
select/poll
的增強版本,
它能顯著減少程式在大量併發連線中只有少量活躍的情況下的系統
cpu利用率。
因為它不會復用
檔案描述符集合來傳遞結果而迫使開發者每次等待事件之前都必須重新準備要被偵聽的檔案描述符集合,另一點原因就是獲取事件的時候,
它無須遍歷整個被偵聽的描述符集
,只要遍歷那些被核心
io事件非同步喚醒而加入
ready
佇列的描述符集合就行了
。epoll
的除了提供
select/poll
那種io
事件的電平觸發
(level triggered
)外,還提供了邊沿觸發
(edge triggered
),這就使得使用者空間程式有可能快取
io狀態,減少
epoll_wait/epoll_pwait
的呼叫,提高應用程式效率。
在 linux/posix_types.h
標頭檔案有這樣的宣告:
#define __fd_setsize 1024
表示select
最多同時監聽
1024個fd
,當然,可以通過修改標頭檔案再重編譯核心來擴大這個數目。
epoll所支援的
fd上限是最大可以開啟檔案的數目
,在1gb
記憶體的機器上大約是
10萬左右,具體數目可以
cat /proc/sys/fs/file-max
察看。2、效率
select/poll致命弱點是當擁有個很大的
socket
集合,不過由於網路延時,任一時間只有部分的
socket
是「活躍」的,
但是select/poll
每次呼叫都會線性掃瞄全部的集合,導致效率呈現線性下降。但是
epoll
不存在這個問題,它只會對「活躍」的
socket
進行操作
---這是因為在核心實現中
epoll
是根據每個
fd上面的
callback
函式實現的。那麼,只有「活躍」的
socket
才會主動的去呼叫
callback
函式,其他
idle
狀態socket
則不會,在這點上,
epoll
實現了乙個「偽」
aio,因為這時候推動力在
os核心。在一些
benchmark
中,如果所有的
socket
基本上都是活躍的
---比如乙個高速
lan環境,
epoll
並不比select/poll
有什麼效率,相反,如果過多使用
epoll_ctl
,效率相比還有稍微的下降。但是一旦使用
idle connections
模擬wan
環境,epoll
的效率就遠在
select/poll
之上了。
3、工作模式
lt(level triggered
)是預設的工作方式,並且同時支援
block
和no-block socket.
在這種做法中,核心告訴你乙個檔案描述符是否就緒了,然後你可以對這個就緒的
fd進行
io操作。如果你不作任何操作,核心還是會繼續通知你的,所以,這種模式程式設計出錯誤可能性要小一點。傳統的
select/poll
都是這種模型的代表。
et(edge-triggered
)是高速工作方式
,只支援
no-block socket
。在這種模式下,當描述符從未就緒變為就緒時,核心通過
epoll
告訴你。然後它會假設你知道檔案描述符已經就緒,並且不會再為那個檔案描述符傳送更多的就緒通知,直到你做了某些操作導致那個檔案描述符不再為就緒狀態了(比如,繼續傳送資料,將導致另乙個就緒狀態;把快取中的資料全部read完;或者傳送接收的資料少於一定量時導致了乙個
ewouldblock/eagain
錯誤等三種情況)。但是請注意,如果一直不對這個fd作
io操作(從而導致它再次變成未就緒),核心不會傳送更多的通知(
only once
),也就是說:每次連續的資料流只通知一次,
不過在tcp
協議中,
et模式的加速效用仍需要更多的
benchmark
確認。總結一下
:et模式僅當狀態發生變化的時候才獲得通知,這裡所謂的狀態的變化並不包括緩衝區中還有未處理的資料,也就是說,如果要採用
et模式,需要一直
read/write
直到出錯為止,很多人反映為什麼採用
et模式只接收了一部分資料就再也得不到通知了,大多因為這樣;而
lt模式是只要有資料 沒有處理就會一直通知下去的。
3 epoll反應堆複雜型
完整 在我個人github上歡迎fork include include include include include include include include include include include define max events 1024 define buflen 128 ...
Hibernate基本概念 3
一 hibernate配置 1.導jar包 2.配置主檔案 a。資料庫連線 url 驅動 使用者名稱,密碼,方言 b。相關 顯示sql,sql格式化 c。對映檔案 3.對映檔案 表到實體 欄位到屬性 查詢 select dname from dept d 引數 1.按位置 from dept whe...
基本概念 C 基本概念
由於工作中需要用到c 編寫的一些工具,有時候需要根據需求修改或者定製工具,所以現在不得不學習一下c 的基礎語法,此為筆記,不成章法!機器語言 組合語言 高階語言 面向過程的程式設計方法 物件導向的程式設計方法 泛型程式設計方法 1 演算法設計 2 源程式編輯 3 編譯 4 連線 5 執行除錯 輸入裝...