1. 程式人生 > >同步 非同步 阻塞 非阻塞,傻傻分不清楚

同步 非同步 阻塞 非阻塞,傻傻分不清楚

前言

大家做socket程式設計時,經常會遇到同步 非同步 阻塞 非阻塞這種術語,很混亂,大家的解釋也是千奇百怪,下面就說下我的理解。

應該把它們拆分開來,同步與非同步是一個維度,阻塞與非阻塞是一個維度。

從資料通訊角度考慮

判斷是阻塞還是非阻塞,主要是看函式沒有資料接收時是否立刻返回,比如recv函式,如果它執行的時候有資料就接收資料,然後返回接收到的資料總和。沒有資料就一直等待直到有資料。那麼就是阻塞的,如果他執行的時候是有資料就接收資料,然後返回接收到的資料總和,沒有資料就立刻返回0,那麼他就是非阻塞的。

判斷是同步還是非同步的方法是:
同步:需要使用者程序主動將存放在核心緩衝區中的資料拷貝到使用者程序中。
非同步:核心會自動將資料從核心緩衝區拷貝到使用者緩衝區,然後再通知使用者。

其他

同步非同步也好,阻塞非阻塞也罷,都能說得通,不過同步非同步一般範圍更大些,既可以指某一特定資料處理過程,也可以指的一個業務處理流程,是一次解決呢還是分批處理。而阻塞非阻塞通常指的是資料接收處理這種特定情況。

舉個栗子:
如果你想吃一份宮保雞丁蓋飯:
同步阻塞:你到飯館點餐,然後在那等著,還要一邊喊:好了沒啊!
同步非阻塞:在飯館點完餐,就去遛狗了。不過溜一會兒,就回飯館喊一聲:好了沒啊!
非同步阻塞:遛狗的時候,接到飯館電話,說飯做好了,讓您親自去拿。 (電話通知)
非同步非阻塞:飯館打電話說,我們知道您的位置,一會給你送過來,安心遛狗就可以了。