網路IO模型及同步 非同步與阻塞 非阻塞的理解

2021-08-02 23:25:03 字數 1306 閱讀 7562

常見io分為下面兩個流程 :

(1) 等待資料準備好

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

對於乙個套接字的輸入操作, 第一步通常涉及等待資料從網路中到達, 當所有等待分組到達時, 他被複製到核心的某個緩衝區 . 第二步就是資料從核心緩衝區複製到應用程式緩衝區 .

阻塞io模型 :

標紅部分是阻塞, 直到阻塞結束recvfrom才能返回 .

非阻塞式io :

recvfrom從應用層到核心的時候, 如果該緩衝區沒有資料就直接返回ewouldblock錯誤, 一般對非阻塞io模型進行輪訓檢查這個狀態看是否有資料到來 .

可以看到recvfrom總是立即返回.

io多路復用 :

雖然io多路復用函式也是阻塞的, 但是其與以上兩種不同, io多路復用是阻塞在select, epoll這樣系統呼叫上 . 而沒有阻塞在真正的io系統呼叫如recvfrom上. 也就是說將阻塞點改變了位置 .

非同步io :

紅線部分呼叫立即返回, 等函式操作完成後通知我們 .

前三種io模型都是同步io模型, 區別是在第一階段, 而他們第二階段是一樣的 : 在資料從核心複製到對應緩衝區期間(使用者空間), 程序阻塞於recvfrom 呼叫 . 也就是說在複製資料到使用者態的階段它們都是阻塞的 .

所以上面的阻塞模型、非阻塞模型、多路io復用,都是同步io,非同步必定是非阻塞的,所以不存在非同步阻塞和非同步非阻塞的說法。真正的非同步io需要cpu的深度參與。換句話說,只有使用者執行緒在操作io的時候根本不去考慮io的執行全部都交給cpu去完成,而自己只等待乙個完成訊號的時候,才是真正的非同步io。所以,建立乙個子執行緒去輪詢、去死迴圈,或者使用select、poll、epool,都不是非同步。

阻塞, 非阻塞 : 執行緒要訪問的資料未準備就緒, 執行緒是否立即返回 . 如果呼叫立即返回就是非阻塞,反之.

同步, 非同步 : 訪問資料方式, 同步需要主動讀寫資料, 在讀寫資料過程中還是會阻塞; 非同步只需要io操作完成的通知, 並不主動讀寫資料, 由作業系統核心完成資料讀寫 .

參考 :

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

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

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

第一手教育 2016 10 14 11 25 i o模型不論在實際使用還是準備筆試面試中都是重要的內容,參考unix網路程式設計進行總結如下。尤其注意紅色標註處 1.明確i o考察的物件和流程 參考unix網路程式設計,乙個輸入操作通常包括兩個不同的階段 1 等待資料準備好 2 從核心向程序複製資料...

談談 IO模型 同步 非同步 阻塞 非阻塞

linux os中,有幾種常見的io模型 程式進行io讀 寫操作通常包括幾個階段 資料準備 資料更新 阻塞式io 程式發起read io請求,核心接受到系統呼叫並開始對磁碟進行讀取資料到核心緩衝區,這一過程程式所在的執行緒是阻塞狀態的。資料準備好,核心需要將資料複製到使用者程序空間,複製過程也是阻塞...