I O多路復用

2021-05-25 05:35:03 字數 1466 閱讀 1170

一、五種i/o模型

1、阻塞i/o模型

最流行的i/o模型是阻塞i/o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型(我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單:要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面低潮標記等額外變數開始活動,導致這個概念變得複雜)。

程序呼叫recvfrom,其系統呼叫直到資料報到達且被拷貝到應用程序的緩衝區中或者發生錯誤才返回,期間一直在等待。我們就說程序在從呼叫recvfrom開始到它返回的整段時間內是被阻塞的。

2、非阻塞i/o模型

程序把乙個套介面設定成非阻塞是在通知核心:當所請求的i/o操作非得把本程序投入睡眠才能完成時,不要把本程序投入睡眠,而是返回乙個錯誤。也就是說當資料沒有到達時並不等待,而是以乙個錯誤返回。

3、i/o復用模型

呼叫select或poll,在這兩個系統呼叫中的某乙個上阻塞,而不是阻塞於真正i/o系統呼叫。 阻塞於select呼叫,等待資料報套介面可讀。當select返回套介面可讀條件時,呼叫recevfrom將資料報拷貝到應用緩衝區中。

4、訊號驅動i/o模型

首先開啟套介面訊號驅動i/o功能, 並通過系統呼叫sigaction安裝乙個訊號處理函式(此系統呼叫立即返回,程序繼續工作,它是非阻塞的)。當資料報準備好被讀時,就為該程序生成乙個sigio訊號。隨即可以在訊號處理程式中呼叫recvfrom來讀資料報,井通知主迴圈資料已準備好被處理中。也可以通知主迴圈,讓它來讀資料報。

5、非同步i/o模型

告知核心啟動某個操作,並讓核心在整個操作完成後(包括將資料從核心拷貝到使用者自己的緩衝區)通知我們。這種模型與訊號驅動模型的主要區別是:

訊號驅動i/o:由核心通知我們何時可以啟動乙個i/o操作,

非同步i/o模型:由核心通知我們i/o操作何時完成。

二、i/o復用的典型應用場合:

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

2、如果乙個伺服器要處理多個服務或者多個協議(例如既要處理tcp,又要處理udp),一般就要使用i/o復用。

三、支援i/o復用的系統呼叫

1、select

select包括5個引數,分別是: 需要監視的檔案描述符的最大值加1,select監視的度檔案描述符集,select監視的寫描述符集,select監視的異常處理檔案描述符集合,和超時引數

其中超時引數有三個值,null為永遠等待;0為從不等待;struct  timeval是乙個結構體,可設定時間。

select()檔案描述符處理函式:

1、fd_zero(fd_set *set)用於清除監視的檔案描述符集合

2、fd_set(int fd ,df_set *set)用於向檔案集中加入乙個檔案描述符

3、fd_clr(int fd,fd_set *set)從檔案集中刪除乙個檔案描述符

4、fd_isset(int fd ,fd-set *set)判斷fd 是否在檔案集中

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

I O多路復用

關於i o多路復用 又被稱為 事件驅動 首先要理解的是,作業系統為你提供了乙個功能,當你的某個socket可讀或者可寫的時候,它可以給你乙個通知。這樣當配合非阻塞的socket使用時,只有當系統通知我哪個描述符可讀了,我才去執行read操作,可以保證每次read都能讀到有效資料而不做純返回 1和ea...