在分析 i/o 模型之前,首先了解 同步 i/o 和 非同步 i/o 的基本概念:
同步 i/o:程序呼叫 i/o 操作函式時,在 i/o 操作函式返回之前,該程序會被掛起(即阻塞),直到 i/o 操作完成後返回;
非同步 i/o:程序呼叫 i/o 操作函式時,在 i/o 操作函式返回之前,該程序不會被掛起(即不阻塞),當 i/o 操作完成後會通知方式告知程序;
在 unix 系統中主要有 5 種 i/o 模型:阻塞式 i/o;非阻塞式 i/o;i/o 多路復用;訊號驅動式 i/o;非同步 i/o;
一般乙個輸入操作需要兩個階段:(1)等待資料準備就緒;(2)從核心向程序複製資料;
當程序呼叫 i/o 操作時,若資料未準備就緒,則程序會一直處於阻塞狀態,直到資料準備就緒,並從核心把該資料複製到應用程序的緩衝區後才返回。即 i/o 操作的兩個階段都屬於阻塞狀態。
以 udp 資料報的讀取過程為例,若程序呼叫 recvfrom 函式從套接字讀取資料,若此時套接字緩衝區沒有資料,則程序會阻塞於 recvfrom 函式呼叫,直到套接字緩衝區有資料,並把該資料讀取到程序緩衝區後返回。在 recvfrom 函式返回之前,程序一直處於阻塞狀態。
當程序呼叫 i/o 操作時,若資料未準備就緒,則立即返回乙個 ewouldblock 錯誤,直到資料準備就緒,在資料準備就緒之前,應用程序採用輪詢的方式檢查資料是否準備就緒。當資料準備就緒之後,在核心把該資料複製到應用程序的緩衝區之前,程序處於阻塞狀態,直到資料複製完成後才返回。即 i/o 操作第一階段處於輪詢檢查狀態,第二階段處於阻塞狀態。
以 udp 資料報的讀取過程為例,若程序呼叫 recvfrom 函式從套接字讀取資料,若此時套接字緩衝區沒有資料,則會返回乙個 ewouldblock 錯誤給程序,在資料準備就緒之前,應用程序採用輪詢的方式檢查資料是否準備就緒。直到套接字緩衝區有資料,並把該資料讀取到程序緩衝區後返回。
在 i/o 多路復用中,一般系統呼叫 select 或 poll 函式,在資料準備就緒之前阻塞於 select 或 poll 的系統呼叫上,而不阻塞於 i/o 操作上。當 select 或 poll 發現資料準備就緒後,通過實際的 i/o 操作將資料從核心複製到應用程序的緩衝區上。即第一階段阻塞於 select 或 poll 的系統呼叫上,第二階段阻塞於實際的 i/o 操作。
以 udp 資料報的讀取過程為例,若程序呼叫 select 函式等待資料報套接字變為可讀,當 select 函式返回套接字可讀時,呼叫 recvfrom 把所讀資料報複製到應用程序緩衝區。
當程序呼叫 i/o 操作時,若資料未準備就緒,則等待資料準備就緒,在等待期間進行不會阻塞。若在某一時刻資料準備就緒,核心會通知程序啟動 i/o 操作,將資料從核心複製到應用程序緩衝區。即第一階段處於等待階段,此時,程序並不會阻塞,第二階段阻塞於實際的 i/o 操作。
首先開啟套接字的訊號驅動式 i/o 功能,並通過函式 sigaction 系統呼叫乙個訊號處理函式,該系統呼叫立即返回,程序繼續工作,即程序不會被阻塞。當資料報準備好讀取時,核心就為程序產生乙個 sigio 訊號,捕獲該訊號並對該訊號進行處理,在處理函式中呼叫 recvfrom 函式讀取資料報,並通知主迴圈資料已經準備好待處理,也可以通知主迴圈,讓它讀取資料報。等待資料報到達期間程序不會被阻塞。
應用程序啟動乙個非同步 i/o 操作,並讓核心在整個操作(將資料從核心複製到應該程序的緩衝區)完成後通知應用程序。在整個過程中,程序不會被阻塞。
呼叫 aio_read 函式,給核心傳遞描述符、緩衝區指標、緩衝區大小和檔案偏移,並告知核心整個操作完成時如何通知程序。該系統呼叫立即返回,而且在等待 i/o 完成期間,程序不會被阻塞。
前面四種 阻塞式 i/o、非阻塞式 i/o、i/o 多路復用 以及 訊號驅動式 i/o 屬於同步 i/o。下圖顯示了這 5 種 i/o 模型之間的區別。
UNIX網路程式設計 I O模型
乙個數入操作通常包括兩個不同的階段 1 等待資料準備。2 從核心項程序複製資料。對於乙個套結字上的輸入操作,第一步通常涉及等待資料從網路中到達。當所等待的資料從網路中到達。當所等待分組到達時,它被複製到核心中的某個緩衝區。第二步就是把資料從核心緩衝區複製到應用程序緩衝區。一.i o模型 1.阻塞性i...
網路程式設計之IO模型
io多路復用概念 io發生時涉及的物件和步驟。對於乙個網路io,它會涉及到兩個系統物件,乙個是呼叫io的程序或者執行緒,另乙個就是系統核心。如當乙個read操作發生時,會先等待資料準備,然後將資料從核心拷貝到程序中去 阻塞io blocking io 特點 在執行io的兩個階段 等待資料和拷貝資料兩...
網路程式設計之 IO模型
我們這裡研究的io模型都是針對網路io的 blocking io 阻塞io nonblocking io 非阻塞io io multiplexing io多路復用 signal driven io 訊號驅動io asynchronous io 非同步io 由signal driven io 訊號驅動...