1. 程式人生 > >並發與並行的區別 The differences between Concurrency and Parallel

並發與並行的區別 The differences between Concurrency and Parallel

並發與並行 mark 並行執行 程序 log tween 計算 線程 currency

邏輯控制流

在程序加載到內存並執行的時候(進程),操作系統會通過讓它和其他進程分時段占用CPU(CPU slices)讓它產生自己獨占CPU的假象(同時通過虛擬內存讓它產生獨占內存的假象)。在CPU在執行一個進程的指令時,被執行的許多指令連接起來(也可以理解為程序計數器PC的變化)就構成了“邏輯控制流”。

邏輯控制流的概念也不局限於進程,它在異常處理程序、線程、Java進程中均有體現。而“並發(concurrency)”和”並行(parallel)“都是對邏輯控制流而言的。


並發

當兩個邏輯控制流交替執行的時候,我們就稱它們是”並發(concurrency)“的。更確切的說,對於邏輯控制流A、B,如果B被執行晚於A被執行的開始且早於A被執行的結束,那麽A和B就是並發的。例如下圖:

技術分享圖片

其中A和B是並發的,因為B的執行晚於A的開始且早於A的結束。但是B和C就不是並發的,因為C的執行並沒有早於B的結束。同理A和C是並發的。

註意到並發和cpu的個數或者計算機的個數是沒有關系的,只要兩個邏輯流滿足上面的關系我們就稱它們並發。


並行

如果兩個邏輯控制流同時(一個cpu時段內)在不同的cpu(多核)或者計算機上被執行,我們就稱其為並行。例如下圖:

技術分享圖片

其中A和C、B和D之間就是並行執行的。

註意到並行要求具有多個處理核心。




另外,我在網上看到一組很有意思的漫畫,講解了並發和並行的區別,分享一下(圖片來自https://code.google.com/archive/p/rspace/source/concur/source):

假設一只老鼠正在燒書,其中書就代表要被執行的指令,火爐代表cpu,老鼠把書一本本運送並燒掉的過程就構成了邏輯控制流。

技術分享圖片

現在有兩只老鼠(兩個邏輯控制流)在燒書,例如下面這個圖,由於只有一個火爐,一個老鼠燒書的時候,另外一個就要等著(保存上下文),直到燒完後輪到他燒(上下文切換),即他們燒書是交替進行的,我們就說他們在並發。(多個火爐滿足這樣的交替關系我們也可以說他們在並發):

技術分享圖片

當兩只老鼠燒書同時進行時,我們就說它們是並行的,例如下面這個例子,由於有兩個火爐(多核),燒書本身可以同時發生:

技術分享圖片




參考:

  1. 《深入理解計算機系統》第三版
  2. Rob Pike - ‘Concurrency Is Not Parallelism’

並發與並行的區別 The differences between Concurrency and Parallel