epoll 相對於select的優勢

2021-07-16 07:44:18 字數 1153 閱讀 2227

分類:

linuxknowhow

(819)

(0) 舉報

收藏這個問題至今才去查,是因為我需要用的地方真的不是很多,學習了那麼多年,不知道自己究竟學了什麼,覺得自己的優勢就是針對特定知識點都熟悉點,一整套的軟體架構沒有搞過。

再總結一點select的不足點:

select 最不能忍受的是乙個程序所開啟的fd是有一定限制的,由fd_setsize設定,預設值是1024。對於那些需要支援的上萬連線數目的im伺服器來說顯然太少了。這時候你一是可以選擇修改這個巨集然後重新編譯核心,不過資料也同時指出這樣會帶來網路效率的下降,二是可以選擇多程序的解決方案(傳統的apache方案),不過雖然linux上面建立程序的代價比較小,但仍舊是不可忽視的,加上程序間資料同步遠比不上執行緒間同步的高效,所以也不是一種完美的方案。不過 epoll則沒有這個限制,它所支援的fd上限是最大可以開啟檔案的數目,這個數字一般遠大於2048,舉個例子,在1gb記憶體的機器上大約是10萬左右,具體數目可以cat /proc/sys/fs/file-max檢視,一般來說這個數目和系統記憶體關係很大。

傳統的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之上了。

這點實際上涉及到epoll的具體實現了。無論是select,poll還是epoll都需要核心把fd訊息通知給使用者空間,如何避免不必要的記憶體拷貝就很重要,在這點上,epoll是通過核心與使用者空間mmap同一塊記憶體實現的。而如果你像我一樣從2.5核心就關注epoll的話,一定不會忘記手工 mmap這一步的。

WPF 獲得滑鼠相對於螢幕的位置,相對於控制項的位置

原文 wpf 獲得滑鼠相對於螢幕的位置,相對於控制項的位置 相對於螢幕的位置 第一步 用於獲得滑鼠相對於螢幕的位置 public class win32 重新整理桌面 dllimport shell32.dll public static extern void shchangenotify uin...

WPF 獲得滑鼠相對於螢幕的位置,相對於控制項的位置

原文 wpf 獲得滑鼠相對於螢幕的位置,相對於控制項的位置 相對於螢幕的位置 第一步 用於獲得滑鼠相對於螢幕的位置 public class win32 重新整理桌面 dllimport shell32.dll public static extern void shchangenotify uin...

springMVC 相對於 Structs 的優勢

智者說,沒有經過自己的思考和估量,就不能接受別人的東西。資料只能是乙個參考,至於是否正確,還得自己去分辨 springmvc相對於 structs 的幾個優勢 1 springmvc安全性更高,structs2 框架是類級別的攔截,每次 request 請求structs2 都會為之建立乙個 act...