1. 程式人生 > >對阻塞,非阻塞,同步,異步的深入理解

對阻塞,非阻塞,同步,異步的深入理解

一個 以太網 結果 情況下 spa nbsp emc sock 過程

以前寫過一篇對於這幾個概念的粗略解釋,現在再深入一些。

同步和異步的區別:

同步是調用協議中結果在調用完成時返回,調用過程中參與雙方處於一種狀態同步的過程。

異步是指調用方發出請求就立即返回

請求甚至可能還沒有到達接收方。比如放到了某個緩沖區,等待對方取走或者第三方轉交。

結果由接收方主動推送,或者調用方輪詢而得到。

阻塞與非阻塞的區別:

影響調用接口的結果(在特定條件下是否提前返回結果),而不是調用方式

舉個例子:

對於系統調用函數read(socket, buf, len),這個API核心是讀出socket緩沖區裏的數據並返回,類似於從緩存區中memcpy到buf。

如果緩沖區是空的,那麽有三種選擇:

1.阻塞住,等緩沖區有數據的時候再memcpy。這是阻塞同步

2.立即返回,什麽也不做,讓調用者在稍後的某個時候再read,這是非阻塞同步(這種情況下buf屬於調用者,可以釋放,下次調用的時候可以再使用另一個buf)

3.buf的處理權轉移到系統,調用者立即返回,等到緩沖區中有數據的時候再調用memcpy到buf,再把這個buf返回給調用者。

(或者內核直接把數據拷貝到調用者的內存,而不通過緩沖區),這是異步(沒有異步阻塞這種說法)

從不同層次上,當一個網絡包從應用程序a發到另一臺電腦上的應用程序b,需要經歷這些過程

1 從a的業務代碼到a的軟件框架

2 從a的軟件框架到計算機的操作系統內核

3 從a所在計算機的內核到網卡

4 從網卡經過網線發到交換機等設備,層層轉發,到達b所在計算機的網卡

5 從b所在計算機的網卡到達b所在計算機的內核

6 從b所在計算機的內核到達b的程序用戶空間

7 從b的軟件框架到達b的業務代碼

關於同步異步的問題,需要一層一層地看:

1,7 取決於軟件框架的設計,比如協程模型,調用接口後馬上切換到其他協程繼續執行,完成之後由框架切換到協程中,這是一種異步接口設計

2,6,需要調用方自己把數據在內核和用戶空間裏搬來搬去,都是同步接口(IOCP不是)

3,5 內核一般通過緩沖區,使用DMA傳輸數據,這一步為異步

4 以太網是同步時序邏輯,必須兩邊都同時就緒了才能開始傳輸數據,這是同步的

整理自:

https://www.zhihu.com/question/65519203/answer/233433548

怎樣理解阻塞非阻塞與同步異步的區別? - 靈劍的回答 - 知乎 https://www.zhihu.com/question/19732473/answer/117012135

對阻塞,非阻塞,同步,異步的深入理解