最近工作接觸到了網路服務同步和非同步,所以學習了下《unix網路程式設計》,在此作下總結。
輸入/輸出(i/o)是在主存和外部裝置(如磁碟驅動器、終端和網路)之間拷貝資料的過程。輸入是從i/o裝置拷貝資料到主存,而輸出是從主存拷貝資料到i/o裝置。比如,網路可視為乙個i/o裝置,作為資料來源和資料接收方。系統可以經過網路讀取其他機器傳送來的資料,並將資料複製到自己主存中。
下面分別介紹unix的5種i/o模型:
乙個輸入操作通常為以下兩個階段:
(1)等待資料準備好;
(2)從核心複製資料到程序;
拿網路中客戶端請求服務的例子說明五種模型。
在網路請求中,套接字(socket)是實現通訊的乙個端點,應用程式可以通過它傳送或接收資料,可對其進行像對檔案一樣的開啟、讀寫和關閉等操作。
對於乙個soket上的輸入操作:
(1)等待資料從網路中到達。資料到達時被複製到核心中的緩衝區;
(2)把資料從核心緩衝區複製到應用程序緩衝區。
1. 阻塞式io模型
阻塞式io模型是最常用的,我們將recvfrom作為系統呼叫,來觀察應用程序和核心之間的區別。下圖中程序呼叫recvfrom,該系統呼叫直到資料報準備好且拷貝到應用緩衝區或者出錯才返回,也就是說在資料返回之前,程序被阻塞,當程序返回成功指示後,才可以開始下面的處理。
2. 非阻塞式io模型
下圖中,前三次呼叫recvfrom,資料還沒準備好,核心會立即返回乙個ewouldblock錯誤,直到第四次呼叫時,資料準備好被拷貝到應用緩衝區,該系統呼叫返回成功指示,接下來開始處理資料。當應用程序像這樣對乙個非阻塞描述字迴圈呼叫recvfrom時,這實際上就是輪詢(polling)。
應用程式不斷地查詢核心,檢查資料是否準備好,這對cpu來說是一種浪費,所以這種模型比較少見。
3. io復用模型
io復用是指通過呼叫select,poll或者epoll函式,監聽多個socket連線,每新來乙個socket連線,就會被加入到監聽列表,實現單個執行緒同時處理多個網路連線的io。基本原理是通過select,poll或epoll不斷輪詢負責的全部socket,當其中乙個資料準備好,就通知程序。然後呼叫recvfrom拷貝資料從核心到程序,返回成功指示後,進行下一步處理。
應用程序雖然不會被socket的io阻塞,但一直被select,poll或epoll阻塞。如果socket數不是很多的話,使用io復用模型可能比多執行緒 + 阻塞io延遲更大,因為io復用模型相對比之前的模型需要兩次系統呼叫,它的優勢在於能處理較多的連線。
4. 訊號驅動io模型
該模型通過系統呼叫sigaction安裝乙個訊號處理程式。當核心準備好資料後,傳送訊號告知程序。在訊號處理程式中呼叫recvfrom讀取資料,並通知主迴圈。這種模型的好處是當等待資料報到達時,io不被阻塞。主迴圈可以繼續執行,只是等待訊號處理程式的通知:資料已準備好被讀。
5. 非同步io模型
非同步io模型讓核心完成整個操作(包括將資料從核心拷貝到程序緩衝區)後才進行通知應用程序。這個模型和訊號驅動模型的主要區別在於:訊號驅動io是由核心通知我們何時可以啟動乙個io操作,而非同步io是由核心通知我們io操作何時完成。
下圖中呼叫aio_read,傳遞核心描述字、緩衝區指標、緩衝區大小、檔案偏移,並告訴核心整個操作完成時如何通知我們。該系統呼叫立即返回,不阻塞於io操作。該圖中,核心在操作完成後傳遞乙個訊號,該訊號直到資料被拷貝到緩衝區才產生,這是和訊號驅動io的不同之處。
1. 對比
從這兩個階段來看,前四種模型在第一階段有所不同,但第二個階段基本相同,把資料從核心拷貝到應用程序的緩衝區時,程序被阻塞於recvfrom呼叫。非同步io模型的兩個階段都不同於前四種模型。
2. 同步vs非同步
同步io操作會阻塞請求程序,直到io操作完成。
非同步io操作不會阻塞請求程序。
前四種模型:阻塞io模型、非阻塞io模型、io復用模型和訊號驅動io都是同步io模型,因為真正的io操作(recvfrom)阻塞程序。
I O模型 阻塞 非阻塞 I O復用 同步 非同步
第一手教育 2016 10 14 11 25 i o模型不論在實際使用還是準備筆試面試中都是重要的內容,參考unix網路程式設計進行總結如下。尤其注意紅色標註處 1.明確i o考察的物件和流程 參考unix網路程式設計,乙個輸入操作通常包括兩個不同的階段 1 等待資料準備好 2 從核心向程序複製資料...
網路IO模型(同步非同步,阻塞非阻塞)
摘錄自 網路應用需要處理的無非兩大類問題 網路i o,資料計算 網路io的模型大致有如下幾種 同步模型 阻塞非阻塞 多路復用 訊號驅動式 非同步io 網路io的本質是socket的讀取,socket在linux系統被抽象為流,io可以理解為對流的操作。這個操作分為2個階段 1 等待流資料準備 2 從...
談談 IO模型 同步 非同步 阻塞 非阻塞
linux os中,有幾種常見的io模型 程式進行io讀 寫操作通常包括幾個階段 資料準備 資料更新 阻塞式io 程式發起read io請求,核心接受到系統呼叫並開始對磁碟進行讀取資料到核心緩衝區,這一過程程式所在的執行緒是阻塞狀態的。資料準備好,核心需要將資料複製到使用者程序空間,複製過程也是阻塞...