本文記錄了本人在複習網絡編程的過程中,關於同步/異步,阻塞/非阻塞這幾個重要概念的理解。特舉了幾個通俗易懂的例子來幫助理解和記憶,如果理解有誤,歡迎各位指正。
如果定義很難看懂,可以先看底下的例子,再返回來看看這些定義,會好理解很多。
同步和異步
同步和異步是針對應用程序和內核的交互而言的,同步指的是用戶進程觸發IO操作並等待或者輪詢地去查看IO操作是否就緒,而異步是指用戶進程觸發IO操作後便開始做自己的事情,而當IO操作已經完成的時候會通知進程已經執行完畢。
阻塞和非阻塞
阻塞和非阻塞是針對進程在訪問數據的時候,根據IO操作的就緒狀態來採取的不同的方式,說白了是一種讀取或者寫入操作方法的實現方式,阻塞方式下讀取或者寫入函數一直等待,而非阻塞模式下,讀取或者寫入方法會立即返回一個狀態值。
阻塞和非阻塞與同步異步沒有任何關係,同步異步強調的是消息的通信機制(是自己去觸發IO操作並等待結果?還是讓其它線程觸發IO操作讓線程告訴自己執行結果),而阻塞/非阻塞強調的是等待IO操作結果時程序的狀態(是幹別的事?還是什麼也不幹)
例子:
我(進程)需要去銀行取錢(IO操作),以下是不同機制下我取錢的方式。
同步:我親自去銀行取錢。
異步:我派我朋友(子線程)去銀行幫我取錢。
阻塞:銀行取錢需要排隊,只能一直排隊等着。
非阻塞:取錢的時候銀行發一個號碼給你,叫到你的號的時候你再過來取錢。
同步阻塞:我去銀行取錢,取錢的櫃檯前排起了長龍,我需要排隊等待。
同步非阻塞:我去銀行取錢,然後直接取號,接下來我可以坐在椅子上玩手機(線程可以做其他事),等到叫號時再去取錢。
同步調用期間,我需要自己等待取錢結果。
異步阻塞:我讓朋友去銀行取錢,取錢的櫃檯前排起了長龍,朋友需要排隊等待。
異步非阻塞:我讓朋友去銀行取錢,朋友取號,然後朋友可以躺在大堂地板上玩手機,等到叫號時再去取錢。
異步調用期間,我可以幹自己的事,然後朋友把取錢結果通知給我即可。