關於同步異步與阻塞非阻塞與的理解

2019-11-27     軟體測試開發技術棧

最近聊到一個關於同步異步 阻塞非阻塞 理解的問題。我們以下面這個例子大概的說一下關於這個問題的理解。


我平時比較喜歡喝粥,那就拿煮粥舉個例子吧,煮粥有幾種方式如下:

方式一:我將洗好的米放到電飯煲里,並且一直站在那裡,每隔一段時間就看下粥煮好沒。——同步阻塞

  • 同步體現在:每隔一段時間就看下粥煮好沒。
  • 阻塞體現在:等待粥煮的過程中,一直站在那裡,不能做其他事情。

方式二:我將洗好的米放到電飯煲里,這次不在一直站在那裡,而是炒個西紅柿雞蛋,但是還是會每隔一段時間過去看下粥煮好沒。——同步非阻塞

  • 同步體現在:每隔一段時間就看下粥煮好沒。
  • 非阻塞體現在:等待粥煮的過程中,去炒了個西紅柿雞蛋,只是時不時會看下粥煮好沒。

為提高生活的幸福感,家裡電飯煲升級換代,在雙十一買了一款支持WiFi的智能電飯。

方式三:同樣,我將洗好的米放到電飯煲里,電飯煲提示"開始煮粥" ,我一直站在那裡,但是不會再每隔一段時間去看粥煮好了沒,粥煮好後電飯煲會通過手機鈴聲自動的通知我。——異步阻塞

  • 異步體現在:提示"開始煮粥"後,不需要去看,粥煮好後,電飯煲會自動通知我。
  • 阻塞體現在:等待粥煮的過程中,一直站在那裡,不能做其他事情;

方式四:再次煮粥的時候,我想了想,既然電飯煲會自動通過手機通知我,我還站在那裡幹嘛,於是我不在傻傻的等著,而是去炒個西紅柿雞蛋,粥煮好電飯煲後自動通知我。——異步非阻塞

  • 異步體現在:提示"開始煮粥"後,不需要去看,粥煮好後,電飯煲自動通知我。
  • 非阻塞體現在:等待電飯煲自動通知我的過程中,去炒了個西紅柿雞蛋,只需要接收電飯煲通知即可。

通過上面這個例子,我們可以看到同步/異步關注的是「煮粥完成消息」通知的方式(消息通知機制),而阻塞/非阻塞關注的是等待「煮粥完成消息」通知過程中的狀態(是否做其他任務)

總結一下

同步異步 主要是從消息通知機制角度來說的,涉及IO通知機制。同步指的是發起調用後,被調用者處理消息,沒處理完之前,調用者需要不斷輪詢數據是否處理完成,或者一直在等待處理完成,必須等處理完才直接返回結果,調用者在主動等待結果。而異步指的是發起調用後,被調用者直接返回,但並沒有返回結果,等處理完消息後,通過狀態或回調函數等形式來通知調用者,調用者被動接收結果。(由此看來,似乎同步的實時性比較好,異步的並發性能比較好)

阻塞非阻塞 主要是從程序(線程)等待消息通知時的狀態角度來說的,涉及CPU線程調度。阻塞指的是調用結果返回之前,該執行線程會被掛起,線程不能做其它事情,只能等待,只有等到調用結果返回了,才能繼續往下執行。非阻塞指的是在沒有獲取調用結果時,不是一直等待,線程可以繼續往下執行,做其他事情,此時如果是同步的,通過輪詢的方式檢查有沒有調用結果返回,如果是異步的,會通知回調。

同步異步與阻塞非阻塞它們修飾的對象不一樣,阻塞非阻塞,是指進程需要的數據如果未就緒,需不需要等待; 同步異步,是指數據準備好後進行訪問的機制,訪問數據的時候,需不需要等待IO處理完成,同步需要等待IO完成,異步是IO完成後通知進程進行處理。

文章來源: https://twgreatdaily.com/ByiPvm4BMH2_cNUgKphc.html