高效能伺服器之IO復用方式比較

2021-08-09 09:52:51 字數 1721 閱讀 7711

最近,想起3年前做的乙個客戶端裝置,發現我對客戶端使用select,現在回想起來,雖然也能夠工作,但是強扭的瓜不甜,實際不用select也可以滿足實際需求。當時可能是興奮,想實踐select的技術。下面主要複習和介紹select\poll\epoll的相關,並進行對比。

標頭檔案:#include api:      int select( int nfds, fd_set far* readfds, fd_set * writefds, fd_set * exceptfds, const struct timeval * timeout);

引數:

nfds:是乙個整數值,是指集合中所有檔案描述符的範圍,即所有檔案描述符的最大值加1,不能錯!在windows中這個引數的值無所謂,可以設定不正確。

readfds:(可選)指標,指向一組等待可讀性檢查的套介面。

writefds:(可選)指標,指向一組等待可寫性檢查的套介面。

exceptfds:(可選)指標,指向一組等待錯誤檢查的套介面。

timeout:select()最多等待時間,對阻塞操作則為nul

標頭檔案:#include api: int poll(struct pollfd fds, nfds_t nfds, int timeout);

引數:fds:是乙個struct pollfd結構型別的陣列,用於存放需要檢測其狀態的socket描述符;每當呼叫這個函式之後,系統不會清空這個陣列,操作起來比較方便;特別是對於socket連線比較多的情況下,在一定程度上可以提高處理的效率;這一點與select()函式不同,呼叫select()函式之後,select()函式會清空它所檢測的socket描述符集合,導致每次呼叫select()之前都必須把socket描述符重新加入到待檢測的集合中;因此,select()函式適合於只檢測乙個socket描述符的情況,而poll()函式適合於大量socket描述符的情況;

nfds:nfds_t型別的引數,用於標記陣列fds中的結構體元素的總數量;

timeout:是poll函式呼叫阻塞的時間,單位:毫秒;

返回值:

>0:陣列fds中準備好讀、寫或出錯狀態的那些socket描述符的總數量;

==0:陣列fds中沒有任何socket描述符準備好讀、寫,或出錯;此時poll超時,超時時間是timeout毫秒;換句話說,如果所檢測的socket描述符上沒有任何事件發生的話,那麼poll()函式會阻塞timeout所指定的毫秒時間長度之後返回,如果 timeout==0,那麼poll() 函式立即返回而不阻塞,如果timeout==inftim,那麼poll() 函式會一直阻塞下去,直到所檢測的socket描述符上的感興趣的事件發生是才返回,如果感興趣的事件永遠不發生,那麼poll()就會永遠阻塞下去;

-1: poll函式呼叫失敗,同時會自動設定全域性變數errno;

不用的場景使用的技術不同,只有選擇最適合的才能發揮其設計優勢。再次複習這些基礎知識,如何使用得選擇適合場景。

linux高效能伺服器程式設計 九 I O復用

第九章 i o復用 i o復用就是乙個執行緒可以同時監聽多個檔案描述符,提高程式效能。雖然i o復用可以同時監聽多個檔案描述符,但是它本身是阻塞的,如果多個檔案描述符準備就緒,如果不採取措施它仍然是序列工作的。所以只能通過多程序或者多執行緒來處理。linux下實現i o復用主要使用到 select ...

Linux高效能服務程式設計(I O復用)

i o復用 本身是阻塞的 網路程式需要使用i o復用技術的情況 1.客戶端程式需要同時處理多個socket。2.客戶端需要同時處理使用者輸入和網路連線 3.tcp伺服器要同時處理監聽socket和連線socket 4.伺服器要同時處理tcp請求和udp請求 5.伺服器要同時監聽多個埠,或者處理多種服...

高效能伺服器之epoll

什麼是epoll epoll是什麼?是為處理 大批量控制代碼 而作了改進的poll。它 幾乎具備了之前所說的 一切優點,被公認為linux2.6下效能最好的多路i o就緒通 知 方法。epoll的相關系統調 用 epoll只有epoll create,epoll ctl,epoll wait 3個系...