I O多路復用

2022-03-15 02:56:38 字數 1371 閱讀 8957

1、使用場景

io多路復用是指核心一旦發現程序指定的乙個或者多個io條件準備讀取,它就通知該程序。io多路復用適用如下場合:

(1)當客戶處理多個描述字時(一般是互動式輸入和網路套接字),必須使用i/o復用。

(2)當乙個客戶同時處理多個套介面時,而這種情況是可能的,但很少出現。

(3)如果乙個tcp伺服器既要處理監聽套介面,又要處理已連線套介面,一般也要用到i/o復用。

(4)如果乙個伺服器即要處理tcp,又要處理udp,一般要使用i/o復用。

(5)如果乙個伺服器要處理多個服務或多個協議,一般要使用i/o復用。

與多程序和多執行緒技術相比,i/o多路復用技術的最大優勢是系統開銷小,系統不必建立程序/執行緒,也不必維護這些程序/執行緒,從而大大減小了系統的開銷。

不同io模式比較:

select poll 移植性好,但單程序監視的檔案數過多會效能不佳,不適合用於大併發

select的問題:

(1)被監控的fds集合限制為1024

(2)fds集合需要從使用者空間拷貝到核心空間

(3)當被監控的fds中某些有資料可讀的時候,無法直接從通知中得到有可讀事件的fds列表,而需要遍歷整個fds來收集

poll使用pollfd結構而不是select的fd_set結構,解決問題(1)

水平觸發,邊緣觸發:通知程序的方式

1. lt模式

lt(level triggered)是預設的工作方式,並且同時支援block和no-block socket.在這種做法中,核心告訴你乙個檔案描述符是否就緒了,然後你可以對這個就緒的fd進行io操作。如果你不作任何操作,核心還是會繼續通知你的。

2. et模式

et(edge-triggered)是高速工作方式,只支援no-block socket。在這種模式下,當描述符從未就緒變為就緒時,核心通過epoll告訴你。然後它會假設你知道檔案描述符已經就緒,並且不會再為那個檔案描述符傳送更多的就緒通知,直到你做了某些操作導致那個檔案描述符不再為就緒狀態了(比如,你在傳送,接收或者接收請求,或者傳送接收的資料少於一定量時導致了乙個ewouldblock 錯誤)。但是請注意,如果一直不對這個fd作io操作(從而導致它再次變成未就緒),核心不會傳送更多的通知(only once)

et模式在很大程度上減少了epoll事件被重複觸發的次數,因此效率要比lt模式高。epoll工作在et模式的時候,必須使用非阻塞套介面,以避免由於乙個檔案控制代碼的阻塞讀/阻塞寫操作把處理多個檔案描述符的任務餓死。

參考:linux io模式及 select、poll、epoll詳解

大話 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 往流中讀出資料...