作者: 雅各布·詹科夫
原文: http://tutorials.jenkov.com/java-concurrency/concurrency-vs-parallelism.html
翻譯: 潘深練的個人網(wǎng)站 如您有更好的翻譯版本斥滤,歡迎 ?? 提交 issue 或投稿哦~
更新: 2022-02-23
并發(fā)性和并行性通常用于與多線程程序相關(guān)的将鸵,最早并發(fā)性和并行性似乎指的是相同的概念,但其實并發(fā)和并行實際上有不同的含義佑颇。在這個并發(fā)與并行教程中顶掉,我將解釋這些概念的含義。
為了清楚起見挑胸,在本文中一喘,我討論在單個應(yīng)用程序(單個進程)中的并發(fā)性和并行性。不在多個應(yīng)用程序嗜暴、進程或計算機之間凸克。
并發(fā)與并行教程視頻
如果您喜歡視頻,這里有本教程對應(yīng)的視頻版本: 并發(fā)與并行教程視頻
什么是并發(fā)
并發(fā)是指在一個應(yīng)用程序中同時存在多個任務(wù)在執(zhí)行闷沥,同時刻或者說看起來是同一時刻(并發(fā))萎战。
如果計算機只有一個CPU,應(yīng)用程序可能不會在同一時間完成多個任務(wù)舆逃,但在應(yīng)用程序內(nèi)部一次完成多個任務(wù)蚂维。要同時在多個任務(wù)上取得進展,CPU會在執(zhí)行期間在不同的任務(wù)之間切換路狮。如下圖所示:
什么是并行執(zhí)行
并行執(zhí)行是指計算機具有多個 CPU 或 CPU 內(nèi)核虫啥,并同時在多個任務(wù)上取得進展。但是奄妨,并行執(zhí)行并不是指與并行性相同的現(xiàn)象 涂籽。稍后我將回到并行性。并行執(zhí)行如下圖所示:
并行并發(fā)執(zhí)行
可以進行并行并發(fā)執(zhí)行砸抛,其中線程分布在多個 CPU 中评雌。因此,在同一個 CPU 上執(zhí)行的線程是并發(fā)執(zhí)行的直焙,而在不同 CPU 上執(zhí)行的線程是并行執(zhí)行的景东。下圖說明了并行并發(fā)執(zhí)行。
理解并行性
并行性意味著一個應(yīng)用程序?qū)⑵淙蝿?wù)拆分成更小的子任務(wù)奔誓,這些子任務(wù)可以并行處理斤吐,例如在多個CPU上同時處理。因此厨喂,并行性并不是指與并行執(zhí)行相同的執(zhí)行模型和措,即使它們表面上看起來很相似。
為了實現(xiàn)真正的并行性杯聚,您的應(yīng)用程序必須運行多個線程臼婆,每個線程必須在單獨的 CPU/CPU 內(nèi)核/顯卡 GPU 內(nèi)核或類似內(nèi)核上運行。
下圖顯示了一個更大的任務(wù)幌绍,它被分為4個子任務(wù)颁褂。這4個子任務(wù)由4個不同的線程執(zhí)行,它們運行在2個不同的CPU上傀广。這意味著颁独,這些子任務(wù)的部分是并行執(zhí)行的(在同一CPU上執(zhí)行的),而部分是并行執(zhí)行的(在不同CPU上執(zhí)行的)伪冰。
如果這4個子任務(wù)由4個線程在各自的CPU上執(zhí)行(總共4個CPU)誓酒,那么任務(wù)的執(zhí)行將是完全并行的。然而,要將一個任務(wù)分解成與可用CPU數(shù)量一樣多的子任務(wù)并不總是那么容易靠柑。通常寨辩,將一個任務(wù)分解為多個子任務(wù)更容易,這些子任務(wù)與手頭的任務(wù)自然匹配歼冰,然后讓線程調(diào)度器負責在可用CPU之間分配線程靡狞。
并發(fā)和并行組合
綜上所述,并發(fā)性指的是多個任務(wù)在單個CPU上看似同時取得進展隔嫡。
另一方面甸怕,并行性與應(yīng)用程序如何并行執(zhí)行單個任務(wù)有關(guān),通常是通過將任務(wù)拆分為可以并行完成的子任務(wù)腮恩。
這兩種執(zhí)行方式可以在同一個應(yīng)用程序中組合梢杭。我將在下面介紹其中一些組合。
并發(fā)秸滴,非并行
應(yīng)用程序可以是并發(fā)的武契,但不能是并行的。這意味著它似乎同時(同時)在多個任務(wù)上取得進展缸榛,但應(yīng)用程序會在每個任務(wù)上取得進展之間切換吝羞,直到任務(wù)完成。在并行線程/CPU中沒有真正的任務(wù)并行執(zhí)行内颗。
并行钧排,不并發(fā)
應(yīng)用程序也可以是并行的,但不能是并發(fā)的均澳。這意味著應(yīng)用程序一次只能處理一個任務(wù)恨溜,而這個任務(wù)被分解成可以并行處理的子任務(wù)。但是找前,每個任務(wù)(+子任務(wù))都是在下一個任務(wù)被拆分并并行執(zhí)行之前完成的糟袁。
既不并發(fā)也不并行
此外,應(yīng)用程序既不能是并發(fā)的躺盛,也不能是并行的项戴。這意味著它一次只能處理一個任務(wù),而且任務(wù)永遠不會分解為并行執(zhí)行的子任務(wù)槽惫。小型命令行應(yīng)用程序可能就是這種情況周叮,因為它只有一個作業(yè),太小了界斜,無法并行化适掰。
并發(fā)且并行
最后结窘,應(yīng)用程序還可以通過兩種方式同時并發(fā)和并行:
第一種是簡單的并行執(zhí)行恭金。如果應(yīng)用程序啟動多個線程鳞仙,然后在多個CPU上執(zhí)行,就會發(fā)生這種情況。
第二種方式是應(yīng)用程序同時處理多個任務(wù)开缎,并將每個任務(wù)分解為子任務(wù)棕叫,同時以并行的方式執(zhí)行。但是在這種情況下啥箭,并發(fā)和并行的一些性能優(yōu)勢可能會丟失谍珊,因為計算機中的 CPU 基于在頻繁于并發(fā)或并行處理。所以并發(fā)且并行急侥,可能只會帶來微小的性能提升甚至可能是性能損失。因此侮邀,除非有特殊目的并且已經(jīng)提前進行了充分分析和測量坏怪,否則不建議采用并發(fā)并行模型。
(本篇完)
作者: 雅各布·詹科夫
原文: http://tutorials.jenkov.com/java-concurrency/concurrency-vs-parallelism.html
翻譯: 潘深練的個人網(wǎng)站 如您有更好的翻譯版本绊茧,歡迎 ?? 提交 issue 或投稿哦~
更新: 2022-02-23