1. 程式人生 > >理解同步/非同步和阻塞/非阻塞

理解同步/非同步和阻塞/非阻塞

本文記錄了本人在複習網路程式設計的過程中,關於同步/非同步阻塞/非阻塞這幾個重要概念的理解。特舉了幾個通俗易懂的例子來幫助理解和記憶,如果理解有誤,歡迎各位指正。

如果定義很難看懂,可以先看底下的例子,再返回來看看這些定義,會好理解很多。

同步和非同步

同步和非同步是針對應用程式和核心的互動而言的,同步指的是使用者程序觸發IO操作並等待或者輪詢地去檢視IO操作是否就緒,而非同步是指使用者程序觸發IO操作後便開始做自己的事情,而當IO操作已經完成的時候會通知程序已經執行完畢。

阻塞和非阻塞

阻塞和非阻塞是針對程序在訪問資料的時候,根據IO操作的就緒狀態來採取的不同的方式,說白了是一種讀取或者寫入操作方法的實現方式,阻塞方式下讀取或者寫入函式一直等待,而非阻塞模式下,讀取或者寫入方法會立即返回一個狀態值。

阻塞和非阻塞與同步非同步沒有任何關係,同步非同步強調的是訊息的通訊機制(是自己去觸發IO操作並等待結果?還是讓其它執行緒觸發IO操作讓執行緒告訴自己執行結果),而阻塞/非阻塞強調的是等待IO操作結果時程式的狀態(是幹別的事?還是什麼也不幹)

例子:

我(程序)需要去銀行取錢(IO操作),以下是不同機制下我取錢的方式。

同步:

我親自去銀行取錢。

非同步:

我派我朋友(子執行緒)去銀行幫我取錢。

阻塞:

銀行取錢需要排隊,只能一直排隊等著。

非阻塞:

取錢的時候銀行發一個號碼給你,叫到你的號的時候你再過來取錢。

同步阻塞:

我去銀行取錢,取錢的櫃檯前排起了長龍,我需要排隊等待。

同步非阻塞:

我去銀行取錢,然後直接取號,接下來我可以坐在椅子上玩手機(執行緒可以做其他事),等到叫號時再去取錢。

同步呼叫期間,我需要自己等待取錢結果。

非同步阻塞:

我讓朋友去銀行取錢,取錢的櫃檯前排起了長龍,朋友需要排隊等待。

非同步非阻塞:

我讓朋友去銀行取錢,朋友取號,然後朋友可以躺在大堂地板上玩手機,等到叫號時再去取錢。

非同步呼叫期間,我可以幹自己的事,然後朋友把取錢結果通知給我即可。