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


当前回答

并发可以涉及同时运行或不同时运行的任务(它们确实可以在单独的处理器/内核中运行,但也可以在“滴答声”中运行)。重要的是,并发总是指完成一项更大任务的一部分。所以基本上这是一些计算的一部分。你必须聪明地知道你可以同时做什么,不可以做什么,以及如何同步。

并行性意味着你只是同时做一些事情。他们不需要参与解决一个问题。例如,您的线程可以分别解决一个问题。当然,同步的东西也适用,但从不同的角度来看。

其他回答

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

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

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

希望这有帮助!

并发编程关注的是看似重叠的操作,主要关注的是由于非确定性控制流而产生的复杂性。与并发程序相关的定量成本通常是吞吐量和延迟。并发程序通常受IO限制,但并不总是如此,例如并发垃圾收集器完全在CPU上。并发程序的教学示例是网络爬虫。该程序启动对网页的请求,并在下载结果可用时同时接受响应,从而累积一组已访问的网页。控制流是非确定性的,因为每次运行程序时,响应不一定以相同的顺序接收。这种特性会使调试并发程序变得非常困难。有些应用程序基本上是并发的,例如web服务器必须同时处理客户端连接。Erlang可能是未来最有前途的高度并发编程语言。并行编程涉及为提高吞吐量的特定目标而重叠的操作。通过使控制流具有确定性,避免了并发编程的困难。通常,程序生成并行运行的子任务集,父任务仅在每个子任务完成后才继续。这使得并行程序更容易调试。并行编程的难点是针对粒度和通信等问题的性能优化。后者在多核环境中仍然是一个问题,因为将数据从一个缓存传输到另一个缓存会产生相当大的成本。密集矩阵矩阵乘法是并行编程的一个教学示例,它可以通过使用Straasen的分治算法和并行攻击子问题来有效地解决。Cilk可能是共享内存计算机(包括多核)上最有前途的高性能并行编程语言。

从我的回答中复制:https://stackoverflow.com/a/3982782

要补充其他人所说的话:

并发性就像让一个玩杂耍的人玩多个球。不管看起来如何,玩杂耍的人每次只手抓/扔一个球。平行运动是让多个杂耍者同时变戏法。

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

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

在电子学中,串行和并行表示一种静态拓扑,决定电路的实际行为。当没有并发时,并行性是确定性的。

为了描述动态的、与时间相关的现象,我们使用了术语顺序和并发。例如,可以通过特定的任务序列(例如配方)获得特定的结果。当我们与某人交谈时,我们会产生一系列单词。然而,在现实中,许多其他过程在同一时刻发生,因此,与某一行动的实际结果一致。如果很多人在同一时间谈话,同时进行的谈话可能会干扰我们的顺序,但这种干扰的结果事先不知道。并发性引入了不确定性。

串行/并行和顺序/并行表征是正交的。数字通信就是一个例子。在串行适配器中,数字消息沿同一通信线路(例如,一根电线)临时(即顺序)分布。在并行适配器中,这也在并行通信线路(例如多条电线)上进行划分,然后在接收端进行重构。

让我们想象一个有9个孩子的游戏。如果我们将它们作为一条链处理,在开始时发送消息,在结束时接收消息,我们将进行串行通信。更多的单词组成了一系列的交流单元。

I like ice-cream so much. > X > X > X > X > X > X > X > X > X > ....

这是在串行基础结构上复制的顺序过程。

现在,让我们想象一下,把孩子们分成三组。我们把这个短语分成三部分,第一部分给左边的孩子,第二部分给中心线的孩子,等等。

I like ice-cream so much. > I like    > X > X > X > .... > ....
                          > ice-cream > X > X > X > ....
                          > so much   > X > X > X > ....

这是一个在并行基础结构上复制的顺序过程(尽管仍部分序列化)。

在这两种情况下,假设孩子之间有完美的沟通,结果会提前确定。

如果有其他人与您同时与第一个孩子交谈,那么我们将同时进行处理。我们不知道基础设施将考虑哪个过程,因此最终结果尚未提前确定。