同步/異步/阻塞/非阻塞/並發/並行
1. 概念
1.1 同步和異步
同步和異步關註的是消息通信機制 (synchronous communication/ asynchronous communication)
所謂同步,就是在發出一個調用時,在沒有得到結果之前,該調用就不返回。但是一旦調用返回,就得到返回值了。
換句話說,就是由調用者主動等待這個調用的結果。
而異步則是相反,調用在發出之後,這個調用就直接返回了,所以沒有返回結果。換句話說,當一個異步過程調用發出後,調用者不會立刻得到結果。而是在調用發出後,被調用者通過狀態、通知來通知調用者,或通過回調函數處理這個調用。
舉個通俗的例子:
你打電話問書店老板有沒有《分布式系統》這本書,如果是同步通信機制,書店老板會說,你稍等,”我查一下",然後開始查啊查,等查好了(可能是5秒,也可能是一天)告訴你結果(返回結果)。
1.2 阻塞和非阻塞
阻塞和非阻塞關註的是程序在等待調用結果(消息,返回值)時的狀態.
阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之後才會返回。
非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。
還是上面的例子:
你打電話問書店老板有沒有《分布式系統》這本書,你如果是阻塞式調用,你會一直把自己“掛起”,直到得到這本書有沒有的結果,如果是非阻塞式調用,你不管老板有沒有告訴你,你自己先一邊去玩了, 當然你也要偶爾過幾分鐘check一下老板有沒有返回結果。
1.3 並發和並行
並發:當有多個線程在操作時,如果系統只有一個CPU,操作系統只能把CPU運行時間劃分成若幹個時間段,再將時間段分配給各個線程執行,在一個時間段的快速的切換不同的線程代碼運行。(幾件事可以換著做,但在某一時刻只能做一件事)
並行:當系統有多個CPU時,可以存在當一個CPU執行一個線程時,另一個CPU可以執行另一個線程,兩個線程互不搶占CPU資源,可以同時進行。(可以同時做多件事)
舉個例子:
小A吃飯吃到一半,電話來了,小A一直到吃完了以後才去接。既不支持並發也不支持並行
小A吃飯吃到一半,電話來了,小A停了下來接了電話,接完後繼續吃飯。支持並發
小A吃飯吃到一半,電話來了,小A一邊打電話一邊吃飯。支持並行
2. 深入理解
2.1 同步阻塞
你打電話問書店老板有沒有《分布式系統》這本書,如果是同步阻塞,書店老板會說,你稍等,”我查一下",然後開始查啊查,等查好了(可能是5秒,也可能是一天)告訴你結果(返回結果)。而你在這期間只能眼巴巴舉著電話等待結果,啥也幹不了,直到電話那頭返回結果。
同步:老板這種通知結果的方式(讓你不要掛電話等待,相當於調用不返回)就是同步方式
阻塞:在等待結果期間你啥都幹不了(相當於調用結果返回之前,當前線程會被掛起),就是阻塞
2.2 同步非阻塞
還是上面的例子,但是在等待結果的過程中你把手機開到免提放電腦旁邊,然後啟動了LOL,快樂的等待。
同步:老板這種通知結果的方式依然是同步方式
非阻塞:在等待結果期間你可以打LOL(相當於在不能立刻得到結果之前,該調用不會阻塞當前線程),即非阻塞
2.3 異步阻塞
如果書店老板直接告訴你我查一下啊,查好了打電話給你,然後直接掛電話了(不返回結果)。你在家裏幹等著(阻塞),然後查好了,他會主動打電話給你。
異步:老板說完直接掛電話了(相當於調用在發出之後,這個調用就直接返回了,沒有返回結果),直到查到信息後再打電話通知你(通過回電回調)
阻塞:你在這期間幹等著(進程的狀態即為阻塞)
2.4 異步非阻塞
書店老板通知方式不變(異步),但是這期間你不用幹等著,而是可以做別的事情(非阻塞)
3. 總結
總的來說,同步異步針對的是調用者和被調用者的消息通信機制,阻塞非阻塞是描述調用者調用期間的狀態,並發並行是CPU的性質(支持並發或並行)
同步/異步/阻塞/非阻塞/並發/並行