io多路復用是指核心一旦發現程序指定的乙個或者多個io條件準備讀取,它就通知該程序。
與多程序和多執行緒技術相比,i/o多路復用技術的最大優勢是系統開銷小,系統不必建立程序/執行緒,也不必維護這些程序/執行緒,從而大大減小了系統的開銷。
目前支援i/o多路復用的系統呼叫有 select,pselect,poll,epoll,i/o多路復用就是通過一種機制,乙個程序可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程式進行相應的讀寫操作。但select,pselect,poll,epoll本質上都是同步i/o,因為他們都需要在讀寫事件就緒後自己負責進行讀寫,也就是說這個讀寫過程是阻塞的,而非同步i/o則無需自己負責進行讀寫,非同步i/o的實現會負責把資料從核心拷貝到使用者空間。
關於i/o多路復用(又被稱為「事件驅動」),首先要理解的是,作業系統為你提供了乙個功能,當你的某個socket可讀或者可寫的時候,它可以給你乙個通知。這樣當配合非阻塞的socket使用時,只有當系統通知我哪個描述符可讀了,我才去執行read操作,可以保證每次read都能讀到有效資料而不做純返回-1和eagain的無用功。寫操作類似。作業系統的這個功能通過select/poll/epoll/kqueue之類的系統呼叫函式來使用,這些函式都可以同時監視多個描述符的讀寫就緒狀況,這樣,多個描述符的i/o操作都能在乙個執行緒內併發交替地順序完成,這就叫i/o多路復用,這裡的「復用」指的是復用同乙個程序/執行緒。
在select/poll中,程序只有在呼叫一定的方法後,核心才對所有監視的檔案描述符進行掃瞄,而epoll事先通過epoll_ctl()來註冊乙個檔案描述符,一旦基於某個檔案描述符就緒時,核心會採用類似callback的**機制,迅速啟用這個檔案描述符,當程序呼叫epoll_wait()時便得到通知。(此處去掉了遍歷檔案描述符,而是通過監聽**的的機制。這正是epoll的魅力所在。)
注意:
如果沒有大量的idle-connection或者dead-connection,epoll的效率並不會比select/poll高很多,但是當遇到大量的idle-connection,就會發現epoll的效率大大高於select/poll。select、poll、epoll區別#
支援乙個程序所能開啟的最大連線數:
fd劇增後帶來的io效率問題:
訊息傳遞方式
綜上,在選擇select,poll,epoll時要根據具體的使用場合以及這三種方式的自身特點:
表面上看epoll的效能最好,但是在連線數少並且連線都十分活躍的情況下,select和poll的效能可能比epoll好,畢竟epoll的通知機制需要很多函式**。
select低效是因為每次它都需要輪詢。但低效也是相對的,視情況而定,也可通過良好的設計改善。
參考:
I O多路復用之poll
poll的優點 1 poll 不要求開發者計算最大檔案描述符加一的大小。2 poll 在應付大數目的檔案描述符的時候速度更快,相比於select。3 它沒有最大連線數的限制,原因是它是基於鍊錶來儲存的。poll的缺點 1 大量的fd的陣列被整體複製於使用者態和核心位址空間之間,而不管這樣的複製是不是...
I O多路復用之select
阻塞i o模型 應用程式呼叫乙個i o函式,應用程式會一直等待資料準備好。如果資料沒有準備好,就會一直等待。只有當資料準備好,從核心拷貝到使用者空間io函式才成功返回。非阻塞i o模型 把乙個套介面設定成非阻塞告訴核心,當所有的i o操作無法完成時,不要將程序睡眠,而返回乙個錯誤資訊。此時i o操作...
IO多路復用之select
1 背景知識 我們首先來看看伺服器程式設計的模型,客戶端發來的請求服務端會產生乙個程序來對其進行服務,每當來乙個客戶請求就產生乙個程序來服務,然而程序不可能無限制的產生,因此為了解決大量客戶端訪問的問題,引入了io復用技術。即 乙個程序可以同時對多個客戶請求進行服務。也就是說io復用的 介質 是程序...