1. 程式人生 > >001 並發並行的區別(舉例、圖例、系統說明)

001 並發並行的區別(舉例、圖例、系統說明)

執行過程 處理 評論 RoCE 區別 圖解 image 當前 www

並發與並行區別

簡單舉例:

你吃飯吃到一半,電話來了,你一直到吃完了以後才去接,這就說明你不支持並發也不支持並行。
你吃飯吃到一半,電話來了,你停了下來接了電話,接完後繼續吃飯,這說明你支持並發。
你吃飯吃到一半,電話來了,你一邊打電話一邊吃飯,這說明你支持並行。

並發的關鍵是你有處理多個任務的能力,不一定要同時。
並行的關鍵是你有同時處理多個任務的能力。
所以我認為它們最關鍵的點就是:是否是『同時』。

並發就是指代碼邏輯上可以並行,有並行的潛力,但是不一定當前是真的以物理並行的方式運行。
並發指的是代碼的性質,並行指的是物理運行狀態。

系統說明

如果某個系統支持兩個或者多個動作(Action)同時存在,那麽這個系統就是一個並發系統。如果某個系統支持兩個或者多個動作同時執行,那麽這個系統就是一個並行系統。並發系統與並行系統這兩個定義之間的關鍵差異在於“存在”這個詞。

在並發程序中可以同時擁有兩個或者多個線程。這意味著,如果程序在單核處理器上運行,那麽這兩個線程將交替地換入或者換出內存。這些線程是同時“存在”的——每個線程都處於執行過程中的某個狀態。如果程序能夠並行執行,那麽就一定是運行在多核處理器上。此時,程序中的每個線程都將分配到一個獨立的處理器核上,因此可以同時運行。

我相信你已經能夠得出結論——“並行”概念是“並發”概念的一個子集。也就是說,你可以編寫一個擁有多個線程或者進程的並發程序,但如果沒有多核處理器來執行這個程序,那麽就不能以並行方式來運行代碼。因此,凡是在求解單個問題時涉及多個執行流程的編程模式或者執行行為,都屬於並發編程的範疇。

摘自:《並發的藝術》 — 〔美〕布雷謝斯

圖例說明


Erlang 之父 Joe Armstrong 用一張5歲小孩都能看懂的圖解釋了並發與並行的區別。

並發是兩個隊列交替使用一臺咖啡機,並行是兩個隊列同時使用兩臺咖啡機,如果串行,一個隊列使用一臺咖啡機,那麽哪怕前面那個人便秘了去廁所呆半天,後面的人也只能死等著他回來才能去接咖啡,這效率無疑是最低的。

有評論裏說,並發是不是一個線程,並行是多個線程?

答:並發和並行都可以是很多個線程,就看這些線程能不能同時被(多個)cpu執行,如果可以就說明是並行,而並發是多個線程被(一個)cpu 輪流切換著執行。

技術分享圖片


參考:https://www.zhihu.com/question/33515481

001 並發並行的區別(舉例、圖例、系統說明)