網路程式設計釋疑之 同步,非同步,阻塞,非阻塞

2021-08-05 20:41:46 字數 1523 閱讀 8603

一講到網路程式設計的i/o模型,總會涉及到這幾個概念。問了很多人,沒幾個能清晰地講出他們之間的區別聯絡,甚至在網路上也有很多不同的觀點,也不知是中國文字釋義的博大精深,還是本來這幾個概念就是繞人不倦。今天我也來給大家講解一下我對這幾個概念的理解。

既然網路上眾說紛紜,不如找個權威參考一下,這個權威就是《unix網路程式設計:卷一》第六章——i/o復用。書中向我們提及了5種類unix下可用的i/o模型:

阻塞式i/o模型:預設情況下,所有套接字都是阻塞的。怎麼理解?先理解這麼個流程,乙個輸入操作通常包括兩個不同階段:

(1)等待資料準備好;

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

對於乙個套接字上的輸入操作,第一步通常涉及等待資料從網路中到達。當所有等待分組到達時,它被複製到核心中的某個緩衝區。第二步就是把資料從核心緩衝區複製到應用程式緩衝區。 好,下面我們以阻塞套接字的recvfrom的的呼叫圖來說明阻塞

標紅的這部分過程就是阻塞,直到阻塞結束recvfrom才能返回。

非阻塞式i/o: 以下這句話很重要:程序把乙個套接字設定成非阻塞是在通知核心,當所請求的i/o操作非得把本程序投入睡眠才能完成時,不要把程序投入睡眠,而是返回乙個錯誤。看看非阻塞的套接字的recvfrom操作如何進行

可以看出recvfrom總是立即返回。

i/o多路復用:雖然i/o多路復用的函式也是阻塞的,但是其與以上兩種還是有不同的,i/o多路復用是阻塞在select,epoll這樣的系統呼叫之上,而沒有阻塞在真正的i/o系統呼叫如recvfrom之上。如圖

訊號驅動式i/o:用的很少,就不做講解了。直接上圖

非同步i/o:這類函式的工作機制是告知核心啟動某個操作,並讓核心在整個操作(包括將資料從核心拷貝到使用者空間)完成後通知我們。如圖:

注意紅線標記處說明在呼叫時就可以立馬返回,等函式操作完成會通知我們。

等等,大家一定要問了,同步這個概念你怎麼沒涉及啊?別急,您先看總結。 其實前四種i/o模型都是同步i/o操作,他們的區別在於第一階段,而他們的第二階段是一樣的:在資料從核心複製到應用緩衝區期間(使用者空間),程序阻塞於recvfrom呼叫。相反,非同步i/o模型在這兩個階段都要處理。

再看posix對這兩個術語的定義:

好,下面我用我的語言來總結一下阻塞,非阻塞,同步,非同步

網路程式設計釋疑之 同步,非同步,阻塞,非阻塞

一講到網路程式設計的i o模型,總會涉及到這幾個概念。問了很多人,沒幾個能清晰地講出他們之間的區別聯絡,甚至在網路上也有很多不同的觀點,也不知是中國文字釋義的博大精深,還是本來這幾個概念就是繞人不倦。今天我也來給大家講解一下我對這幾個概念的理解。既然網路上眾說紛紜,不如找個權威參考一下,這個權威就是...

網路IO之阻塞 非阻塞 同步 非同步總結

對於乙個network io 以read為例 它會涉及到兩個系統物件,乙個是呼叫該io的process or thread 另乙個是系統核心 kernel 當乙個read操作發生時,它會經歷兩個階段 1.等待資料準備 waiting for the data to be ready 2.將資料從核心...

網路IO之阻塞 非阻塞 同步 非同步總結

1 前言 在網路程式設計中,阻塞 非阻塞 同步 非同步經常被提到。unix網路程式設計第一卷第六章專門討論五種不同的io模型,stevens講的非常詳細,我記得去年看第一遍時候,似懂非懂,沒有深入理解。網上有詳細的分析 我結合網上部落格和書總結一下,加以區別,加深理解。2 資料流向 網路io操作實際...