Linux/Unix select函數 及select/poll與epoll的對比

來源:互聯網
上載者:User

select()是Linux/Unix 網路編程中的一個重要函數,通過調用select函數可以確定一個或者多個通訊端(描述符)的狀態,判斷通訊端上是否有資料需要讀出或者寫入

 #include<sys/select.h> #include<sys/time.h> int select(int max_fd_p_1, fd_set *readset, fd_set* writeset, fd_set* exceptset, struct timeval* timeout); 返回:就緒描述字的個數,0——逾時,-1——出錯

 

select函數有5個參數,我們會介紹每一個參數。

參數max_fd_p_1
核心需要一個數字來指定最大的描述字,因為核心使用這個參數來遍曆一組描述字。又因為描述字是從0開始計數的,所以max_fd_p_1實現上是最大描述字的加上1的值。
參數readset
select可以測試一組描述字是否可讀,使用者需要告訴核心所有關心的描述字,readset就是用來指定關心的描述字集合。
參數writeset
如同readset指定可讀描述字集合一樣,writeset用來指定關心的可寫描述字集合。
參數exceptset
跟readset、writeset一樣,exceptset用來指定所關心的異常描述字集合,也就是當集合中一個描述字出現異常時會得到核心的一個通知。
參數timeout
用來指定逾時的時間長度,這是一個結構體
struct timeval {    long tv_sec;//秒數    long tv_usec;//微秒數 }

用法詳解UNP第三版

epoll 和select/poll的區別:

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

2.IO效率不隨FD數目增加而線性下降

傳統的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.使用mmap加速核心與使用者空間的訊息傳遞。

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

4.核心微調

這一點其實不算epoll的優點了,而是整個linux平台的優點。也許你可以懷疑linux平台,但是你無法迴避linux平台賦予你微調核心的能力。比如,核心TCP/IP協議棧使用記憶體池管理sk_buff結構,那麼可以在運行時期動態調整這個記憶體pool(skb_head_pool)的大小---
通過echo
XXXX>/proc/sys/net/core/hot_list_length完成。再比如listen函數的第2個參數(TCP完成3次握手的資料包隊列長度),也可以根據你平台記憶體大小動態調整。更甚至在一個資料包面數目巨大但同時每個資料包本身大小卻很小的特殊系統上嘗試最新的NAPI網卡驅動架構

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.