1. 程式人生 > >同步非同步,阻塞非阻塞 詳細解釋

同步非同步,阻塞非阻塞 詳細解釋

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

阻塞非阻塞:可以簡單理解為需要做一件事能不能立即得到返回應答,如果不能立即獲得返回,需要等待,那就阻塞了,否則就可以理解為非阻塞。
同步非同步: 你總是做完一件再去做另一件,不管是否需要時間等待,這就是同步;非同步呢則反之,你可以同時做幾件事,並非一定需要一件事做完再做另一件事。同步簡單理解成一問一答同步進行,非同步可以簡單理解為不必等一個問題有答了再去問另一個問題,儘管問,有答了再通知你。

舉個例子:
我去買一本書,立即買到了,這就是非阻塞;
如果恰好書店沒有,我就等一直等到書店有了這本書買到了才走,這就是阻塞;
如果書店恰好沒有,我就告訴書店老闆,書來了告訴我一聲讓我來取或者直接送到我家,然後我就走了,這就是非同步。
那同步呢? 前面兩種情況,非阻塞和阻塞都可以稱為同步。
如果說書店有這書,我還讓老闆通知我以後來取就沒這個必要了。

反映在程式設計方面就是 使用者程序 呼叫 系統呼叫。(使用者程序對應我,核心 對應 書店老闆,書對應資料資源data , 買書就是一個系統呼叫了)
這阻塞非阻塞與同步非同步IO機制,都是伴隨計算機系統發展,用來解決一些出現的問題。阻塞非阻塞、同步非同步可以組合,但是沒必要組合,應該說是不同的IO機制,沒必要糾結怎麼區分,如果定要組合心裡才爽,可以 這樣認為:阻塞非阻塞都是同步,非同步就沒什麼阻塞不阻塞了,都非同步了還阻塞啥,肯定是非阻塞了。(非同步非阻塞聽起來多彆扭)

unix網路程式設計中說到:
將IO模型分為五類:阻塞IO,非阻塞IO,IO複用,訊號驅動,非同步IO
其中阻塞IO就是那種recv, read,一直等,等到有了拷貝了資料才返回;
非阻塞就是不用等,立即返回,設定描述符為非阻塞就行了,但是要程序自己一直檢查是否可讀;
IO複用其實也是阻塞的,不過可以用來等很多描述符;
訊號驅動採用訊號機制等待;
非同步IO就不用等待了,當他告知你的時候,已經可以返回了,資料都拷貝好了。

posix.1嚴格定義的非同步IO是要求沒有任何一點阻塞,而上述的前面四個(阻塞IO,非阻塞IO,IO複用,訊號驅動)都不同程度阻塞了,而且都有一個共同的阻塞: 核心拷貝資料到程序空間的這段時間需要等待。