1. 程式人生 > >同步/異步/阻塞/非阻塞/並發/並行

同步/異步/阻塞/非阻塞/並發/並行

通過 分布式系 直接 操作 就是 在操作 手機 執行 ron

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的性質(支持並發或並行)

同步/異步/阻塞/非阻塞/並發/並行