同步 非同步 阻塞與非阻塞的詳解

2022-03-26 11:17:19 字數 1796 閱讀 3742

參考&部分**文章:

首先了解一下同步、非同步、阻塞與非阻塞

io分兩階段(一旦拿到資料後就變成了資料操作,不再是io):

1.資料準備階段

2.核心空間複製資料到使用者程序緩衝區(使用者空間)階段

在作業系統中,程式執行的空間分為核心空間和使用者空間。應用程式都是執行在使用者空間的,所以它們能操作的資料也都在使用者空間。

「阻塞」與"非阻塞"與"同步"與「非同步"不能簡單的從字面理解,提供乙個從分布式系統角度的回答。

1.同步與非同步

同步和非同步關注的是訊息通訊機制(synchronous communication/

asynchronous communication),同步與非同步是對應於呼叫者與被呼叫者,它們是執行緒之間的關係,兩個執行緒之間要麼是同步的,要麼是非同步的,

所謂同步,就是在發出乙個*呼叫*時,在沒有得到結果之前,該*呼叫*就不返回。但是一旦呼叫返回,就得到返回值了。

換句話說,就是由*呼叫者*主動等待這個*呼叫*的結果。

而非同步則是相反,*呼叫*在發出之後,這個呼叫就直接返回了,所以沒有返回結果。換句話說,當乙個非同步過程呼叫發出後,呼叫者不會立刻得到結果。而是在*呼叫*發出後,*被呼叫者*通過狀態、通知來通知呼叫者,或通過**函式處理這個呼叫。

典型的非同步程式設計模型比如node.js、ajax

舉個通俗的例子:

你打**問書店老闆有沒有《分布式系統》這本書,如果是同步通訊機制,書店老闆會說,你稍等,」我查一下",然後開始查啊查,等查好了(可能是5秒,也可能是一天)告訴你結果(返回結果)。

而非同步通訊機制,書店老闆直接告訴你我查一下啊,查好了打**給你,然後直接掛**了(不返回結果)。然後查好了,他會主動打**給你。在這裡老闆通過「回電」這種方式來**。

2.阻塞與非阻塞

阻塞和非阻塞關注的是程式在等待呼叫結果(訊息,返回值)時的狀態.

阻塞與非阻塞是對同乙個執行緒來說的,在某個時刻,執行緒要麼處於阻塞,要麼處於非阻塞,阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。呼叫執行緒只有在得到結果之後才會返回。

非阻塞呼叫指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒。

1同步阻塞方式:

傳送方傳送請求之後一直等待響應。

接收方處理請求時進行的io操作如果不能馬上等到返回結果,就一直等到返回結果後,才響應傳送方,期間不能進行其他工作。

2同步非阻塞方式:

傳送方傳送請求之後,一直等待響應。

接受方處理請求時進行的io操作如果不能馬上的得到結果,就立即返回,取做其他事情。

但是由於沒有得到請求處理結果,不響應傳送方,傳送方一直等待。

當io操作完成以後,將完成狀態和結果通知接收方,接收方再響應傳送方,傳送方才進入下一次請求過程。(實際不應用)

3非同步阻塞方式:

傳送方向接收方請求後,不等待響應,可以繼續其他工作。

接收方處理請求時進行io操作如果不能馬上得到結果,就一直等到返回結果後,才響應傳送方,期間不能進行其他操作。 (實際不應用)

4非同步非阻塞方式:

傳送方向接收方請求後,不等待響應,可以繼續其他工作。

接收方處理請求時進行io操作如果不能馬上得到結果,也不等待,而是馬上返回去做其他事情。

當io操作完成以後,將完成狀態和結果通知接收方,接收方再響應傳送方。(效率最高)

參考:

阻塞非阻塞與同步非同步

老張愛喝茶,廢話不說,煮開水。出場人物 老張,水壺兩把 普通水壺,簡稱水壺 會響的水壺,簡稱響水壺 1 老張把水壺放到火上,立等水開。同步阻塞 老張覺得自己有點傻 2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。同步非阻塞 老張還是覺得自己有點傻,於是變高階了,買了把會響笛的那種水壺...

同步 非同步與阻塞 非阻塞

怎樣理解阻塞非阻塞與同步非同步的區別?嚴肅的回答 知乎 知乎這個問題下的各個回答,以及這篇blog已經講的很清楚了。也有提到同步阻塞,和非同步非阻塞是繫結的。但也有對同步非阻塞,和非同步非阻塞的模型的闡釋,特此記錄解釋。在這套解釋中,同步和非同步的語義不只是立即返回與否,還是獲取結果已完成的方式是通...

同步非同步與阻塞非阻塞

同步非同步,阻塞非阻塞他們針對的物件是不一樣的。對於呼叫者來說是阻塞跟非阻塞,被呼叫者是同步跟非同步。同步通訊和非同步通訊 阻塞與非阻塞 同步阻塞 非阻塞 多路io復用,都是同步io,非同步必定是非阻塞的。真正的非同步io需要cpu的深度參與。換句話說,只有使用者執行緒在操作io的時候根本不去考慮i...