关于java:一文读懂并发与并行

44次阅读

共计 1759 个字符,预计需要花费 5 分钟才能阅读完成。

作者: 雅各布·詹科夫
原文: http://tutorials.jenkov.com/j…
翻译: 潘深练的集体网站 如您有更好的翻译版本,欢送 ❤️ 提交 issue 或投稿哦~
更新: 2022-02-23

并发性和并行性通常用于与多线程程序相干的,最早并发性和并行性仿佛指的是雷同的概念,但其实并发和并行实际上有不同的含意。在这个并发与并行教程中,我将解释这些概念的含意。

为了分明起见,在本文中,我探讨在单个应用程序(单个过程)中的并发性和并行性。不在多个应用程序、过程或计算机之间。

并发与并行教程视频

如果您喜爱视频,这里有本教程对应的视频版本: 并发与并行教程视频

什么是并发

并发是指在一个应用程序中同时存在多个工作在执行,同时刻或者说看起来是同一时刻(并发)。

如果计算机只有一个 CPU,应用程序可能不会在同一时间实现多个工作,但在应用程序外部一次实现多个工作。要同时在多个工作上获得停顿,CPU 会在执行期间在不同的工作之间切换。如下图所示:

什么是并行执行

并行执行是指计算机具备多个 CPU 或 CPU 内核,并同时在多个工作上获得停顿。然而,并行执行并不是指与并行性雷同的景象。稍后我将回到并行性。并行执行如下图所示:

并行并发执行

能够进行并行并发执行,其中线程散布在多个 CPU 中。因而,在同一个 CPU 上执行的线程是并发执行的,而在不同 CPU 上执行的线程是并行执行的。下图阐明了并行并发执行。

了解并行性

并行性意味着一个应用程序将其工作拆分成更小的子工作,这些子工作能够并行处理,例如在多个 CPU 上同时解决。因而,并行性并不是指与并行执行雷同的执行模型,即便它们外表上看起来很类似。

为了实现真正的并行性,您的应用程序必须运行多个线程,每个线程必须在独自的 CPU/CPU 内核 / 显卡 GPU 内核或相似内核上运行。

下图显示了一个更大的工作,它被分为 4 个子工作。这 4 个子工作由 4 个不同的线程执行,它们运行在 2 个不同的 CPU 上。这意味着,这些子工作的局部是并行执行的(在同一 CPU 上执行的),而局部是并行执行的(在不同 CPU 上执行的)。

如果这 4 个子工作由 4 个线程在各自的 CPU 上执行(总共 4 个 CPU),那么工作的执行将是齐全并行的。然而,要将一个工作分解成与可用 CPU 数量一样多的子工作并不总是那么容易。通常,将一个工作合成为多个子工作更容易,这些子工作与手头的工作天然匹配,而后让线程调度器负责在可用 CPU 之间调配线程。

并发和并行组合

综上所述,并发性指的是多个工作在单个 CPU 上看似同时获得停顿。

另一方面,并行性与应用程序如何并行执行单个工作无关,通常是通过将工作拆分为能够并行实现的子工作。

这两种执行形式能够在同一个应用程序中组合。我将在上面介绍其中一些组合。

并发,非并行

应用程序能够是并发的,但不能是并行的。这意味着它仿佛同时(同时)在多个工作上获得停顿,但应用程序会在每个工作上获得停顿之间切换,直到工作实现。在并行线程 /CPU 中没有真正的工作并行执行。

并行,不并发

应用程序也能够是并行的,但不能是并发的。这意味着应用程序一次只能解决一个工作,而这个工作被分解成能够并行处理的子工作。然而,每个工作(+ 子工作)都是在下一个工作被拆分并并行执行之前实现的。

既不并发也不并行

此外,应用程序既不能是并发的,也不能是并行的。这意味着它一次只能解决一个工作,而且工作永远不会合成为并行执行的子工作。小型命令行应用程序可能就是这种状况,因为它只有一个作业,太小了,无奈并行化。

并发且并行

最初,应用程序还能够通过两种形式同时并发和并行:

第一种是简略的并行执行。如果应用程序启动多个线程,而后在多个 CPU 上执行,就会产生这种状况。

第二种形式是应用程序同时解决多个工作,并将每个工作合成为子工作,同时以并行的形式执行。然而在这种状况下,并发和并行的一些性能劣势可能会失落,因为计算机中的 CPU 基于在频繁于并发或并行处理。所以并发且并行,可能只会带来渺小的性能晋升甚至可能是性能损失。因而,除非有非凡目标并且曾经提前进行了充沛剖析和测量,否则不倡议采纳并发并行模型。

(本篇完)

作者: 雅各布·詹科夫
原文: http://tutorials.jenkov.com/j…
翻译: 潘深练的集体网站 如您有更好的翻译版本,欢送 ❤️ 提交 issue 或投稿哦~
更新: 2022-02-23

正文完
 0