併發(Concurrent)和並行(parallel)的區別

併發(Concurrent)和並行(parallel)

併發與並行的區別是什麼?

術語 併發(Concurrent)和並行(parallel) 經常用於與多線程程序相關的情況。但是併發和並行到底是什麼意思,這兩個術語有什麼不同呢?

併發

併發性意味着應用程序同時(併發地)處理多個任務。如果計算機只有一個CPU,應用程序可能不會在同一時間處理多個任務,但是在應用程序內一次處理多個任務。在開始下一個任務之前,它不會完全完成一個任務。相反,CPU在不同的任務之間切換,直到任務完成。

在這裏插入圖片描述

即使只有一個線程在其中運行,也可以有一個併發應用程序。

並行

並行性意味着應用程序將其任務分割成更小的子任務,這些子任務可以並行處理,例如在多個cpu上同時處理。

在這裏插入圖片描述

爲了實現真正的並行,您的應用程序必須有多個線程在運行,或者至少能夠調度任務在其他線程、進程、cpu、顯卡等中執行。

栗子:

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

併發的關鍵是你有處理多個任務的能力,不一定要同時。
並行的關鍵是你有同時處理多個任務的能力。

Erlang 之父畫的一張說明併發與並行的圖

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

在這裏插入圖片描述

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

併發和並行的詳細比較

正如您所看到的,併發性與應用程序如何處理其工作上的多個任務有關。應用程序可以一次(順序地)處理一個任務,也可以同時(併發地)處理多個任務。
另一方面,並行性與應用程序如何處理每個單獨的任務有關。應用程序可以從頭到尾連續地處理任務,或者將任務分解成可以並行完成的子任務。
如您所見,應用程序可以是併發的,但不能是並行的。這意味着它同時處理多個任務,但是線程一次只執行一個任務。在並行線程/ cpu中不存在任務的並行執行。
應用程序也可以是並行的,但不能是併發的。這意味着應用程序一次只能處理一個任務,這個任務被分解爲可以並行處理的子任務。但是,每個任務(+子任務)在分解和並行執行下一個任務之前完成。
此外,應用程序既不能併發也不能並行。這意味着它一次只能處理一個任務,並且該任務不會被分解成多個子任務並行執行。
最後,應用程序也可以是併發的,也可以是並行的,因爲它可以同時處理多個任務,還可以將每個任務分解爲多個子任務,以便並行執行。然而,在這個場景中,併發性和並行性的一些好處可能會丟失,因爲計算機中的cpu已經相當繁忙地處理併發性或並行性。組合它可能只會導致很小的性能提升甚至性能損失。在盲目地採用並行模型之前,請確保進行了分析和度量。

翻譯自

Concurrency vs. Parallelism

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章