作者:JacobJenkov原文:http://tutorials.jenkov.com/j...或贡献~更新:2022-02-23并发和并行通常用于多线程程序。最早的并发和并行似乎指的是同一个概念,但实际上并发和并行其实是有不同含义的。在本并发和并行教程中,我将解释这些概念的含义。为清楚起见,在本文中我讨论了单个应用程序(单个进程)中的并发性和并行性。不跨多个应用程序、进程或计算机。并发与并行教程视频如果你喜欢视频,这里是本教程对应的视频版本:并发与并行教程视频什么是并发在同一时刻(并发)。如果计算机只有一个CPU,应用程序可能不会同时完成多个任务,但多个任务在应用程序内部一次完成。为了同时在多个任务上取得进展,CPU在执行过程中会在不同任务之间切换。如下图所示:什么是并行执行并行执行是指一台计算机有多个CPU或CPU核心,同时在多个任务上取得进展。但是,并行执行并不是指与并行性相同的现象。稍后我会回到并行性。Parallelexecution如下图所示:Parallelconcurrentexecution实现线程分布在多个CPU上的并行并发执行。因此,在同一CPU上执行的线程并发执行,而在不同CPU上执行的线程并行执行。下图说明了并行并发执行。了解并行性并行性意味着应用程序将其任务拆分为更小的子任务,这些子任务可以并行处理,例如在多个CPU上同时处理。因此,并行性并不是指与并行执行相同的执行模型,即使它们表面上看起来相似。要实现真正的并行,您的应用程序必须运行多个线程,每个线程都必须在单独的CPU/CPU内核/显卡GPU内核或类似的内核上运行。下图显示了一个更大的任务,它分为4个子任务。这4个子任务由运行在2个不同CPU上的4个不同线程执行。这意味着这些子任务中的一些是并行执行的(在同一个CPU上),一些是并行执行的(在不同的CPU上)。如果这4个子任务由4个线程在各自的CPU上执行(共4个CPU),那么任务的执行将是完全并行的。然而,将一个任务分解为与可用CPU一样多的子任务并不总是那么容易。通常更容易将任务分解为自然匹配手头任务的子任务,然后让线程调度程序负责在可用CPU之间分配线程。结合并发和并行总而言之,并发指的是多个任务在单个CPU上看似同时进行。另一方面,并??行性与应用程序如何并行执行单个任务有关,通常是将任务拆分为可以并行完成的子任务。两种执行方法可以组合在同一个应用程序中。我将在下面描述其中的一些组合。并发、非并行应用程序可以并发,但不能并行。这意味着它似乎同时(同时)在多个任务上取得进展,但应用程序会在每个任务上切换,直到任务完成。pthreads/CPU中没有真正的并行执行任务。并行,非并发应用程序也可以是并行的,但不是并发的。这意味着应用程序一次只能处理一个任务,并且这个任务被分解成可以并行处理的子任务。但是,每个任务(+子任务)在下一个任务被拆分并并行执行之前完成。既非并发也非并行此外,应用程序既不能并发也不能并行。这意味着它一次只能处理一个任务,并且任务永远不会分解为并行执行的子任务。这可能是小型命令行应用程序的情况,因为它只有一个作业,它太小而无法并行化。并发和并行最后,应用程序还可以通过两种方式实现并发和并行:第一种是简单的并行执行。如果应用程序启动多个线程,然后在多个CPU上执行,就会发生这种情况。第二种方式是应用程序同时处理多个任务,并将每个任务分解成子任务,并行执行。但在这种情况下,并发和并行的一些性能优势可能会丢失,因为计算机中的CPU比并发或并行处理更频繁。所以并发和并行可能只会带来很小的性能提升甚至性能损失。因此,不建议采用并发并行模型,除非有特殊用途,并且事先已经进行了充分的分析和衡量。(本文完)作者:JacobJenkov原文:http://tutorials.jenkov.com/j...翻译:潘神莲个人网站如果你有更好的翻译版本,欢迎??提issue或投稿~更新:2022-02-23
