怎樣理解阻塞非阻塞與同步非同步的區別?

2021-06-22 20:11:07 字數 1170 閱讀 2937

因為中文語意的問題,很多時候確實會導致混用,而且語境不一樣意義也可能不一樣。如果只是從計算機程式設計這個角度說, 討論最多的也是io 模型 ,阻塞非阻塞 和 同步非同步說的應該是不同的東西。

阻塞非阻塞:可以簡單理解為需要做一件事能不能立即得到返回應答,如果不能立即獲得返回,需要等待,那就阻塞了,否則就可以理解為非阻塞。

同步非同步: 你總是做完一件再去做另一件,不管是否需要時間等待,這就是同步;非同步呢則反之,你可以同時做幾件事,並非一定需要一件事做完再做另一件事。同步簡單理解成一問一答同步進行,非同步可以簡單理解為不必等乙個問題有答了再去問另乙個問題,儘管問,有答了再通知你。

舉個例子: 

我去買一本書,立即買到了,這就是非

阻塞;如果恰好書店沒有,我就等一直等到書店有了這本書買到了才走,這就是阻塞;

如果書店恰好沒有,我就告訴書店老闆,書來了告訴我一聲讓我來取或者直接送到我家,然後我就走了,這就是非同步。

那同步呢? 前面兩種情況,非阻塞和阻塞都可以稱為同步。

如果說書店有這書,我還讓老闆通知我以後來取就沒這個必要了。

反映在程式設計方面就是 使用者程序 呼叫 系統呼叫。(使用者程序對應我,核心 對應 書店老闆,書對應資料資源data , 買書就是乙個系統呼叫了)

這阻塞非阻塞與同步非同步io機制,都是伴隨計算機系統發展,用來解決一些出現的問題。阻塞非阻塞、同步非同步可以組合,但是沒必要組合,應該說是不同的io機制,沒必要糾結怎麼區分,如果定要組合心裡才爽,可以 這樣認為:阻塞非阻塞都是同步,非同步就沒什麼阻塞不阻塞了,都非同步了還阻塞啥,肯定是非阻塞了。(非同步非阻塞聽起來多彆扭)

unix網路程式設計中說到:

將io模型分為五類:阻塞io,非阻塞io,io復用,訊號驅動,非同步io

其中阻塞io就是那種recv, read,一直等,等到有了拷貝了資料才返回;

非阻塞就是不用等,立即返回,設定描述符為非阻塞就行了,但是要程序自己一直檢查是否可讀;

io復用其實也是阻塞的,不過可以用來等很多描述符;

訊號驅動採用訊號機制等待;

非同步io就不用等待了,當他告知你的時候,已經可以返回了,資料都拷貝好了。

posix.1嚴格定義的非同步io是要求沒有任何一點阻塞,而上述的前面四個(阻塞io,非阻塞io,io復用,訊號驅動)都不同程度阻塞了,而且都有乙個共同的阻塞: 核心拷貝資料到程序空間的這段時間需要等待。 (這麼說上面的舉例中: 必須要書送到我家,否則都不算非同步,糾結。。。)

怎樣理解 同步 非同步 阻塞 非阻塞

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

怎樣理解阻塞非阻塞與同步非同步的區別?

因為中文語意的問題,很多時候確實會導致混用,而且語境不一樣意義也可能不一樣。如果只是從計算機程式設計這個角度說,討論最多的也是io 模型 阻塞非阻塞和同步非同步說的應該是不同的東西。阻塞非阻塞 可以簡單理解為需要做一件事能不能立即得到返回應答,如果不能立即獲得返回,需要等待,那就阻塞了,否則就可以理...

怎樣理解阻塞非阻塞與同步非同步的區別?

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