對阻塞,非阻塞,同步,異步的深入理解
以前寫過一篇對於這幾個概念的粗略解釋,現在再深入一些。
同步和異步的區別:
同步是調用協議中結果在調用完成時返回,調用過程中參與雙方處於一種狀態同步的過程。
異步是指調用方發出請求就立即返回。
請求甚至可能還沒有到達接收方。比如放到了某個緩沖區,等待對方取走或者第三方轉交。
結果由接收方主動推送,或者調用方輪詢而得到。
阻塞與非阻塞的區別:
影響調用接口的結果(在特定條件下是否提前返回結果),而不是調用方式
舉個例子:
對於系統調用函數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
對阻塞,非阻塞,同步,異步的深入理解