并发和并行之间的区别是什么?


当前回答

我非常喜欢Paul Butcher对这个问题的回答(他是《七周内的七个并发模型》的作者):

虽然它们经常被混淆,但并行性和并发性是不同的事情。并发性是问题域的一个方面代码需要同时处理多个(或接近同时)事件。相反,并行性是解决方案的一个方面您希望通过处理使程序运行更快的域并行处理问题的不同部分。有些方法是适用于并发,有些适用于并行,有些则适用于两者。了解您面临的问题,并选择合适的工具工作

其他回答

并发:如果一个处理器解决了两个或多个问题。

并行性:如果一个问题由多个处理器解决。

在我看来,理解这两者最简单、最优雅的方式是这样的。并发允许交错执行,因此会产生并行的错觉。例如,这意味着并发系统可以在您用Word编写文档的同时运行Youtube视频。底层操作系统是一个并发系统,使这些任务能够交错执行。由于计算机执行指令的速度如此之快,这就给人一种同时做两件事的感觉。

平行性是指这样的事情实际上是平行的。在上面的示例中,您可能会发现视频处理代码在一个内核上执行,而Word应用程序在另一个内核中运行。注意,这意味着并发程序也可以并行!使用线程和进程构建应用程序,使程序能够利用底层硬件,并可能并行完成。

那为什么不让一切都平行呢?一个原因是因为并发是一种结构化程序的方式,是一种促进关注点分离的设计决策,而并行常常以性能的名义使用。另一个问题是,有些事情根本上无法完全并行完成。这方面的一个例子是在队列的后面添加两件事——不能同时插入这两件事。一定要有东西在前面,另一个在后面,否则你会把队伍弄得一团糟。虽然我们可以交错这种执行(因此我们得到了一个并发队列),但不能让它并行。

希望这有帮助!

如果你想向一个9岁的孩子解释这一点。

我真的很喜欢这个来自另一个答案的图形表示——我认为它比上面的许多答案更好地回答了这个问题

并行与并发当两个线程并行运行时,它们都同时运行。例如,如果我们有两个线程A和B,那么它们的并行执行将如下所示:

CPU 1:A------------------------>

CPU 2:B------------------------->

当两个线程同时运行时,它们的执行会重叠。重叠可以通过以下两种方式之一发生:线程同时执行(即并行执行,如上所述),或者它们的执行在处理器上交错执行,如下所示:

CPU 1:A---------->B---------->A---------->B--------->

因此,出于我们的目的,并行可以被认为是并发的一种特殊情况

来源:此处的另一个答案

希望这会有所帮助。

我喜欢Rob Pike的演讲:并发不是并行(这更好!)(幻灯片)(谈话)

Rob通常谈论Go,并且通常以直观直观的解释来解决并发与并行的问题!下面是一个简短的总结:

任务:让我们烧掉一堆过时的语言手册!一次一个!

并发:任务有许多并发分解!一个例子:

并行性:如果至少有2个地鼠同时工作或不工作,则前面的配置会并行出现。