linux的epoll模型詳解

2021-06-21 20:36:08 字數 2634 閱讀 1497

1. epoll是何方神聖?

epoll可是當前在linux下開發大規模併發網路程式的熱門人選,epoll 在linux2.6核心中正式引入,和select相似,其實都i/o多路復用技術而已,並沒有什麼神秘的。

其實在linux下設計併發網路程式,向來不缺少方法,比如典型的apache模型(process per connection,簡稱ppc),tpc(thread perconnection)模型,以及select模型和poll模型,那為何還要再引入epoll這個東東呢?那還是有得說說的…

2. 常用模型的缺點

如果不擺出來其他模型的缺點,怎麼能對比出epoll的優點呢。

2.1 ppc/tpc模型

這兩種模型思想類似,就是讓每乙個到來的連線一邊自己做事去,別再來煩我。只是ppc是為它開了乙個程序,而tpc開了乙個執行緒。可是別煩我是有代價的,它要時間和空間啊,連線多了之後,那麼多的程序/執行緒切換,這開銷就上來了;因此這類模型能接受的最大連線數都不會高,一般在幾百個左右。

2.2 select模型

1. 最大併發數限制,因為乙個程序所開啟的fd(檔案描述符)是有限制的,由fd_setsize設定,預設值是1024/2048,因此select模型的最大併發數就被相應限制了。自己改改這個fd_setsize?想法雖好,可是先看看下面吧…

2. 效率問題,select每次呼叫都會線性掃瞄全部的fd集合,這樣效率就會呈現線性下降,把fd_setsize改大的後果就是,大家都慢慢來,什麼?都超時了??!!

3. 核心/使用者空間

記憶體拷貝問題,如何讓核心把fd訊息通知給使用者空間呢?在這個問題上select採取了記憶體拷貝方法。

2.3 poll模型

基本上效率和select是相同的,select缺點的2和3它都沒有改掉。

3. epoll的提公升

把其他模型逐個批判了一下,再來看看epoll的改進之處吧,其實把select的缺點反過來那就是epoll的優點了。

3.1. epoll沒有最大併發連線的限制,上限是最大可以開啟檔案的數目,這個數字一般遠大於2048,一般來說這個數目和系統記憶體關係很大,具體數目可以cat /proc/sys/fs/file-max察看。

3.2. 效率提公升,epoll最大的優點就在於它只管你「活躍」的連線,而跟連線總數無關,因此在實際的網路環境中,epoll的效率就會遠遠高於select和poll。

3.3. 記憶體拷貝,epoll在這點上使用了「共享記憶體」,這個記憶體拷貝也省略了。

4. epoll為什麼高效

epoll的高效和其資料結構的設計是密不可分的,這個下面就會提到。

首先回憶一下select模型,當有i/o事件到來時,select通知應用程式有事件到了快去處理,而應用程式必須輪詢所有的fd集合,測試每個fd是否有事件發生,並處理事件;**像下面這樣:

intres = select(maxfd+1, &readfds, null, null, 120); if

(res > 0)

} }

// if(res == 0) handle timeout, res < 0 handle error

epoll

不僅會告訴應用程式有i/0事件到來,還會告訴應用程式相關的資訊,這些資訊是應用程式填充的,因此根據這些資訊應用程式就能直接定位到事件,而不必遍歷整個fd集合。

intres = epoll_wait(epfd, events, 20, 120);

for(int i = 0; i < res;i++)

5. epoll關鍵資料結構

前面提到epoll速度快和其資料結構密不可分,其關鍵資料結構就是:

struct

epoll_event ;

typedef

union epoll_data epoll_data_t;

可見epoll_data是乙個union結構體,借助於它應用程式可以儲存很多態別的資訊:fd、指標等等。有了它,應用程式就可以直接定位目標了。

6. 使用epoll

既然epoll相比select這麼好,那麼用起來如何呢?會不會很繁瑣啊…先看看下面的三個函式吧,就知道epoll的易用了。

intepoll_create(int size);

intepoll_ctl(int epfd, intop, int fd, structepoll_event *event);

控制某個epoll檔案描述符上的事件:註冊、修改、刪除。其中引數epfd是epoll_create()建立epoll專用的檔案描述符。相對於select模型中的fd_set和fd_clr巨集。

intepoll_wait(int epfd,structepoll_event * events,int maxevents,int timeout);

等待i/o事件的發生;引數說明:

epfd:由epoll_create()生成的epoll專用的檔案描述符;

epoll_event:用於回傳代處理事件的陣列;

maxevents:每次能處理的事件數;

timeout:等待i/o事件發生的超時值;

返回發生事件數。

相對於select模型中的select函式。

IO模型(epoll) 詳解 01

從事服務端開發,少不了要接觸網路程式設計。epoll作為linux下高效能網路伺服器的必備技術至關重要,nginx redis skynet和大部分遊戲伺服器都使用到這一多路復用技術。一 從網絡卡接收資料說起 二 如何知道接收了資料?三 程序阻塞為什麼不占用cpu資源?四 核心接收網路資料全過程 五...

簡單的epoll模型

水平觸發模式 include include include include include include include include include int main int argc,const char ar struct sockaddr in serv addr socklen t ...

epoll模型例項

epoll有兩種模式,edge triggered 簡稱et 和 level triggered 簡稱lt 在採用這兩種模式時要注意的是,如果採用et模式,那麼僅當狀態發生變化時才會通知,而採用lt模式類似於原來的 select poll操作,只要還有沒有處理的事件就會一直通知.以 來說明問題 首先...