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

2021-06-20 04:48:31 字數 1359 閱讀 8269

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

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

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

舉個例子:

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

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

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

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

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

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

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

unix網路程式設計中說到:

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

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

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

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

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

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

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

對unix來講:阻塞式i/o(預設),非阻塞式i/o(nonblock),i/o復用(select/poll/epoll)都屬於同步i/o,因為它們在資料由核心空間複製回程序緩衝區時都是阻塞的(不能幹別的事)。只有非同步i/o模型(aio)是符合非同步i/o操作的含義的,即在「a資料準備完成」、「b由核心空間拷貝回緩衝區」 後通知程序,在等待通知的這段時間裡可以幹別的事。

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

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

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

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

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

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