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

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

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

同步和異步

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

阻塞和非阻塞

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

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

例子:

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

同步:我親自去銀行取錢。

異步:我派我朋友(子線程)去銀行幫我取錢。

阻塞:銀行取錢需要排隊,只能一直排隊等着。

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

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

同步非阻塞:我去銀行取錢,然後直接取號,接下來我可以坐在椅子上玩手機(線程可以做其他事),等到叫號時再去取錢。

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

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

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

異步調用期間,我可以幹自己的事,然後朋友把取錢結果通知給我即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章