I O模型 阻塞 非阻塞 I O復用 同步 非同步

2021-07-25 11:16:31 字數 2389 閱讀 4950

第一手教育 

2016-10-14 11:25

i/o模型不論在實際使用還是準備筆試面試中都是重要的內容,參考unix網路程式設計進行總結如下。(尤其注意紅色標註處)

1. 明確i/o考察的物件和流程

參考unix網路程式設計,乙個輸入操作通常包括兩個不同的階段:

(1) 等待資料準備好;

(2) 從核心向程序複製資料。

對於乙個套接字的輸入操作,第一步通常涉及等待資料從網路到達,當所等待分組到達時,被複製到核心的某個緩衝區;

第二步就是把資料從核心緩衝區複製到應用程序緩衝區。

理解上述兩個不同階段對於後續理解i/o模型尤其是非阻塞i/o與同步i/o關係十分必要。

2. i/o模型

2.1 阻塞式i/o模型

阻塞式i/o是最流行的i/o,也是所有套接字預設的i/o。

如圖所示,程序呼叫recvfrom系統呼叫,直到資料報到達且被複製到應用程序緩衝區中或發生錯誤才返回。

也就是說,程序從呼叫recvfrom開始到返回的整個時段都是阻塞的(上述兩個階段都是阻塞),recvfrom成功返回後,應用程序才開始處理資料報。

2.2 非阻塞i/o模型

根據書中的定義,當所請求的i/o操作非得把本程序投入睡眠才能完成時,不投入睡眠,而是返回乙個錯誤。

還是考察圖示比較清晰。

如圖所示,不同於阻塞式i/o,非阻塞i/o在第一階段資料沒有準備好的時候,不阻塞,而是直接返回乙個錯誤(ewouldblock)。

所以一般採用輪詢(polling)的方式,應用程序持續輪詢核心,檢視資料是否準備好。當資料準備好時,被複製到應用程序緩衝區(第二階段)。

注*:值得注意的一點是,當第一階段資料準備完成後,進入第二階段,核心向記憶體的複製。這一階段仍然是阻塞的,這對於後續理解非阻塞與同步的關係十分重要。

2.3 i/o復用模型

i/o復用最常見的就是select和epoll,其阻塞發生在上述兩個系統呼叫之一,而不是真正的i/o系統呼叫上。

如下圖所示:

當使用者程序呼叫了select,那麼整個程序會被阻塞與select。核心會「監視」所有select負責的套接字,當任何乙個套接字中的資料準備好了,select就會返回。

這時候進入第二階段,完成核心向記憶體的資料複製。

i/o復用的優勢在於同時等待多個描述符就緒,單就乙個描述符可言,其沒有優勢,反而還會因為多一次select系統呼叫存在劣勢。

2.4 非同步i/o模型

非同步i/o的工作機制是告知核心啟動某個操作,並讓核心在整個操作(包括第二階段資料從核心向記憶體的複製)完成後告知我們。

如下圖所示:

非同步i/o要通過呼叫特殊api實現(如posix的aio_read),可以看出,其在兩個階段都是沒有對於使用者程序的阻塞的,依靠訊號通知程序整個過程完成。

2.5 同步、非同步與阻塞、非阻塞、i/o復用的關係

首先先來再明確一下同步、非同步i/o之間的區別。

書中所述,posix把兩種術語定義如下:

同步i/o:導致請求程序阻塞,直到i/o操作完成;

非同步i/o: 不導致請求程序阻塞。

所以說,阻塞式i/o, 非阻塞i/o, i/o復用由於都導致了請求程序阻塞,所以均屬於同步i/o。

(值得注意的是非阻塞i/o,正如之前提示要注意的,其在第二階段核心向記憶體複製資料是會導致使用者程序的阻塞,所以也屬於同步i/o)

想使用非同步i/o,必須使用特殊的api(如linux下aio,windows下iocp等)。

所以他們的關係如下圖所示:

3. 總結

如下圖所示:(暫時忽略訊號驅動i/o)

圖中清晰地總結了每種i/o的特點和呼叫流程。

可以看出阻塞式、非阻塞式、與i/o復用,其不同之處在於第一階段,第二階段的處理方式相同(均阻塞與recvfrom呼叫),這也是剛才說到的將他們歸於同步i/o的原因。

而非同步i/o不存在請求程序阻塞的情況。同時注意前三種i/o模型在第一階段的處理方式(阻塞,返回+輪詢,阻塞於select等),區分這三種i/o模型。

同步IO 非同步IO 阻塞IO 非阻塞IO

同步io 非同步io 阻塞io 非阻塞io,這幾個詞常見於各種各樣的與網路相關的文章之中,往往不同上下文中它們的意思是不一樣的,以致於我在很長一段時間對此感到困惑,所以想寫一篇文章整理一下。posix 可移植作業系統介面 把同步io操作定義為導致程序阻塞直到io完成的操作,反之則是非同步io按pos...

阻塞IO, 非阻塞IO, 同步IO,非同步IO介紹

一 前言 1 我們之前講了io操作什麼時候切換回來呢?我們剛剛講了 函式,這個 函式是當你的程式一遇到io操作,再一切換,這個切換的時候,切換之前你等著io操作完了再回來。2 io 為什麼不阻塞吶?因為io操作是用作業系統完成的,咋們使用者讀乙個檔案,你以為自己的程式開啟乙個檔案,然後去把檔案的內容...

網路IO模型(同步非同步,阻塞非阻塞)

摘錄自 網路應用需要處理的無非兩大類問題 網路i o,資料計算 網路io的模型大致有如下幾種 同步模型 阻塞非阻塞 多路復用 訊號驅動式 非同步io 網路io的本質是socket的讀取,socket在linux系統被抽象為流,io可以理解為對流的操作。這個操作分為2個階段 1 等待流資料準備 2 從...