多路復用是指使用乙個執行緒來檢查多個檔案描述符(socket)的就緒狀態,比如呼叫select/poll傳入多個檔案描述符(filedescription 簡稱fd),如果有乙個檔案描述符準備就緒就返回,否則一直阻塞到超時。
io多路復用是一種機制,乙個程序監控多個檔案描述符,一旦某個檔案描述符準備就緒就通知程序執行相應的io操作,但select、poll、epoll本質上是同步io,需要在讀寫事件就緒後自己負責讀寫,也就是說這個讀寫過程是阻塞的。而非同步io無需自己處理讀寫,而是把讀寫交給了核心。
與多執行緒或多程序相比,io多路復用技術最大的優勢就是開銷小,不用再建立或維護程序或執行緒,從而大大見笑了開銷。
1、select
select堅實的檔案描述符分為3類,即write_fds、read_fds、except_fds,呼叫select函式後,程序會阻塞,直到檔案描述符就緒(可讀、可寫或者except)或超時,函式返回。當函式返回後遍歷fd_set找到就緒的檔案描述符。
select的缺點
2、poll
poll本質上與select沒什麼大的差別,管理多個檔案描述符也是採用輪詢的方式,但是poll沒有大小限制,因為poll使用的是鍊錶儲存檔案描述符。poll同樣存在乙個問題,包含大量檔案描述符的陣列會被整體複製於核心態與使用者態的位址空間之間,它的開銷隨著檔案描述符的數量則加而增大。
3、epoll
epoll是2.6核心之後提出的,相對於poll與select更加靈活,而且沒有數量限制,epoll使用乙個檔案描述符管理多個描述符,將使用者關係的描述符的事件存放到核心的乙個事件表中,這樣使用者空間和核心空間只需複製一次。
優點:
參考文章:
io多路復用select,poll,epoll詳解
I O多路復用
一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...
i o多路復用
最常見的i o多路復用就是 select poll epoll了,下面說說他們的一些特點和區別吧。select 可讀 可寫 異常三種檔案描述符集的申明和初始化。fd set readfds,writefds,exceptionfds fd zero readfds fd zero writefds ...
I O多路復用
我們都知道unix like 世界裡,一切皆檔案,而檔案是什麼呢?檔案就是一串二進位製流而已,不管socket,還是fifo 管道 終端,對我們來說,一切都是檔案,一切都是流。在資訊 交換的過程中,我們都是對這些流進行資料的收發操作,簡稱為i o操作 input and output 往流中讀出資料...