并发(Concurrent)和并行(parallel)的区别

并发(Concurrent)和并行(parallel)

并发与并行的区别是什么?

术语 并发(Concurrent)和并行(parallel) 经常用于与多线程程序相关的情况。但是并发和并行到底是什么意思,这两个术语有什么不同呢?

并发

并发性意味着应用程序同时(并发地)处理多个任务。如果计算机只有一个CPU,应用程序可能不会在同一时间处理多个任务,但是在应用程序内一次处理多个任务。在开始下一个任务之前,它不会完全完成一个任务。相反,CPU在不同的任务之间切换,直到任务完成。

在这里插入图片描述

即使只有一个线程在其中运行,也可以有一个并发应用程序。

并行

并行性意味着应用程序将其任务分割成更小的子任务,这些子任务可以并行处理,例如在多个cpu上同时处理。

在这里插入图片描述

为了实现真正的并行,您的应用程序必须有多个线程在运行,或者至少能够调度任务在其他线程、进程、cpu、显卡等中执行。

栗子:

你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

并发的关键是你有处理多个任务的能力,不一定要同时。
并行的关键是你有同时处理多个任务的能力。

Erlang 之父画的一张说明并发与并行的图

Erlang 之父 Joe Armstrong 用一张5岁小孩都能看懂的图解释了并发与并行的区别

在这里插入图片描述

并发是两个队列交替使用一台咖啡机,并行是两个队列同时使用两台咖啡机,如果串行,一个队列使用一台咖啡机,那么哪怕前面那个人便秘了去厕所呆半天,后面的人也只能死等着他回来才能去接咖啡,这效率无疑是最低的

并发和并行的详细比较

正如您所看到的,并发性与应用程序如何处理其工作上的多个任务有关。应用程序可以一次(顺序地)处理一个任务,也可以同时(并发地)处理多个任务。
另一方面,并行性与应用程序如何处理每个单独的任务有关。应用程序可以从头到尾连续地处理任务,或者将任务分解成可以并行完成的子任务。
如您所见,应用程序可以是并发的,但不能是并行的。这意味着它同时处理多个任务,但是线程一次只执行一个任务。在并行线程/ cpu中不存在任务的并行执行。
应用程序也可以是并行的,但不能是并发的。这意味着应用程序一次只能处理一个任务,这个任务被分解为可以并行处理的子任务。但是,每个任务(+子任务)在分解和并行执行下一个任务之前完成。
此外,应用程序既不能并发也不能并行。这意味着它一次只能处理一个任务,并且该任务不会被分解成多个子任务并行执行。
最后,应用程序也可以是并发的,也可以是并行的,因为它可以同时处理多个任务,还可以将每个任务分解为多个子任务,以便并行执行。然而,在这个场景中,并发性和并行性的一些好处可能会丢失,因为计算机中的cpu已经相当繁忙地处理并发性或并行性。组合它可能只会导致很小的性能提升甚至性能损失。在盲目地采用并行模型之前,请确保进行了分析和度量。

翻译自

Concurrency vs. Parallelism

猜你喜欢

转载自blog.csdn.net/qq_34173920/article/details/106191047