● 并发与并行视频教程
● 并发
● 并行执行
● 并行并发执行
● 并行
● 并发和并行组合
○ 并发、非并行
○ 并行、非并发
○ 既非并发也非并行
○ 既是并发也是并行
术语“并发”和“并行”通常与多线程程序有关。 最开始的时候,几乎可以认为并发和并行是指的相同的概念。 但是,并发和并行实际上具有不同的含义。 在此并发与并行教程中,我将解释这些概念的含义。
为了清楚起见,在本文中,我着眼于单个应用程序-单个进程中的并发和并行。 不讨论多个应用程序、进程或计算机之间的并发和并行。
并发与并行视频教程
如果你喜欢视频,请在此处查看本教程的视频版本:并发与并行性教程视频(原链接到油管,如果大家有需要可留言)
并发
并发意味着应用程序正在同时完成一项以上的任务,或者至少在表面上似乎是在同一时间(并发)上完成一项以上的任务。
如果计算机只有一个CPU,则应用程序可能无法在同一时间同时完成一项以上的任务,而需要在应用程序中处理一次执行一项以上的任务。 为了同时完成多个任务,CPU在执行过程中会在不同任务之间切换。 如下图所示:
并行执行
并行执行是指计算机具有一个以上的CPU或CPU内核,并且同时在多个任务上进行处理。 但是,并行执行与并行是有区别的, 稍后我将回到并行这一主题中去。 并行执行如下图所示:
并行并发执行
可能有并行并发执行,其中线程分布在多个CPU之间。 因此,在同一CPU上执行的线程是同时执行的,而在不同CPU上执行的线程是并行执行的。 下图说明了并行并发执行。
并行
术语并行是指应用程序将其任务分解为较小的子任务,这些子任务可以并行处理,例如在多个CPU上同时进行。 因此,并行与并行并发执行所引用的执行模型不同,即使它们在表面上看起来相似。
为了实现真正的并行,你的应用程序必须运行多个线程-每个线程必须在单独的CPU / CPU内核/图形卡GPU内核或类似内核上运行。
下图说明了一个较大的任务,该任务被分为4个子任务。 这4个子任务由4个不同的线程执行,这些线程在2个不同的CPU上运行。 这意味着,这些子任务的部分同时执行(在同一CPU上执行),而部分并行执行(在不同的CPU上执行)。
相反,如果4个子任务是由在每个CPU上运行的4个线程(总共4个CPU)执行的,则该任务的执行将是完全并行的。 但是,将一个任务分解成与可用CPU数量一样多的子任务并不总是那么容易。 通常,将一个任务分解为与当前任务自然匹配的多个子任务,然后让线程调度程序负责在可用CPU之间分配线程是比较容易的。
并发和并行组合
概括地说,并发是指单个CPU如何看似同时(又称AKA)在多个任务上取得进展。
另一方面,并行性与应用程序如何并行执行单个任务有关-通常通过将任务拆分为可以并行完成的子任务来实现。
这两种执行样式可以在同一应用程序中组合。 我将在下面介绍其中的一些组合。
并发、非并行
一个应用程序可以是并发的,但不能是并行的。 这意味着它似乎同时(同时)在一个以上的任务上取得了进展,但是应用程序在每个任务的取得进展之间切换-直到任务完成为止。 没有真正并行执行在并行线程/ CPU中执行的任务。
并行、非并发
一个应用程序也可以是并行的,但不能是并发的。 这意味着该应用程序一次只能处理一个任务,并且该任务被分解为可以并行处理的子任务。 但是,每个任务(+子任务)在拆分下一个任务并并行执行之前已完成。
既非并发也非并行
另外,一个应用程序既不能是并发的,也不能是并行的。 这意味着它一次只能处理一个任务,并且该任务永远不会分解为子任务以并行执行。 对于小型命令行应用程序可能是这种情况,其中只有一个作业太小而无法并行化。
既是并发也是并行
最后,应用程序还可以通过两种方式同时并发和并行:
第一种方式是简单的并行并发执行。 如果应用程序启动了多个线程,然后在多个CPU上执行,则会发生这种情况。
第二种方式是应用程序既可以同时处理多个任务,又可以将每个任务分解为多个子任务以并行执行。 但是,在这种情况下,并发性和并行性的某些好处可能会丢失,因为计算机中的CPU已经足够合理地仅使用并发性或并行性。 结合使用它可能只会导致很小的性能提升,甚至会导致性能下降。 在盲目采用并发并行模型之前,请确保进行分析和衡量。
译自:Concurrency vs. Parallelism
Jakob Jenkov
Last update: 2020-11-17