3 epoll基本概念

2022-02-12 09:01:33 字數 2825 閱讀 5562

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 執行除錯 輸入裝...