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


当前回答

这篇惊人的博客节选:

并发和并行之间的区别:并发是指两个任务可以在重叠的时间段。并行性是指任务在例如在多核处理器上。并发是独立执行进程的组成,而并行是同时执行(可能相关)计算。并发是指同时处理许多事情。相似一次做很多事情。应用程序可以是并发的,但不能是并行的,这意味着它同时处理多个任务,但没有两个任务在同一时刻执行。应用程序可以是并行的,但不能是并发的,这意味着它在多核CPU中同时处理一个任务的多个子任务时间应用程序既不能并行,也不能并发,这意味着它一次一个地、顺序地处理所有任务。应用程序既可以是并行的,也可以是并发的,这意味着它在多核CPU中同时处理多个任务时间

其他回答

(我很惊讶这样一个根本问题多年来都没有得到正确和巧妙的解决……)

简而言之,并发性和并行性都是计算的财产。

至于区别,以下是罗伯特·哈珀的解释:

首先要理解的是并行性与并发无关。并发与程序(或其组件)的不确定性组成有关。并行性与具有确定性行为的程序的渐近效率有关。并发是关于管理不可管理的事件:事件的发生是出于我们无法控制的原因,我们必须对此做出反应。用户单击鼠标时,窗口管理器必须做出响应,即使显示需要注意。这种情况本质上是不确定性的,但我们也在确定性设置中采用形式上的不确定性,假装组件以任意顺序发出事件信号,并且我们必须在事件发生时对其作出响应。非确定性组合是一种强大的程序结构思想。另一方面,并行性是关于确定性计算的子组之间的依赖性。其结果毋庸置疑,但有许多方法可以实现,有些方法比其他方法更有效。我们希望充分利用这些机会。

它们可以是程序中的各种正交财产。阅读此博客文章以获取更多插图。这篇文章稍微讨论了编程中组件的差异,比如线程。

注意,线程或多任务都是为更具体的目的服务的计算实现。它们可以与并行性和并发性相关,但不是以一种基本的方式。因此,它们很难成为开始解释的好条目。

还有一个亮点:(物理)“时间”几乎与这里讨论的财产无关。时间只是一种衡量实施的方式,以显示财产的重要性,但远非本质。仔细考虑一下“时间”在时间复杂性中的作用——这或多或少是相似的,即使在这种情况下,度量也往往更重要。

假设你有一个有两个线程的程序。程序可以通过两种方式运行:

Concurrency                 Concurrency + parallelism
(Single-Core CPU)           (Multi-Core CPU)
 ___                         ___ ___
|th1|                       |th1|th2|
|   |                       |   |___|
|___|___                    |   |___
    |th2|                   |___|th2|
 ___|___|                    ___|___|
|th1|                       |th1|
|___|___                    |   |___
    |th2|                   |   |th2|

在这两种情况下,我们都有并发性,这仅仅是因为我们有多个线程在运行。

如果我们在具有单个CPU内核的计算机上运行此程序,操作系统将在两个线程之间切换,允许一次运行一个线程。

如果我们在带有多核CPU的计算机上运行这个程序,那么我们就可以同时并行运行两个线程。

我将尝试用一个有趣且易于理解的示例进行解释。:)

假设一个组织组织了一场国际象棋比赛,10名棋手(棋艺相同)将挑战一名职业冠军棋手。由于国际象棋是一场1:1的比赛,因此组织者必须以高效的方式进行10场比赛,以便尽快完成整个比赛。

希望以下场景能够轻松描述进行这10场比赛的多种方式:

1) 串行-让我们假设专业人员与每个人逐一进行游戏,即与一个人开始和结束游戏,然后与下一个人开始下一场游戏,依此类推。换句话说,他们决定按顺序进行游戏。因此,如果一场比赛需要10分钟才能完成,那么10场比赛将需要100分钟,同样假设从一场比赛到另一场比赛的过渡需要6秒,那么对于10场比赛,则需要54秒(约1分钟)。

因此整个活动将在101分钟内完成(最差进场)

2) 同时-让我们假设职业球员轮到下一个球员,所以所有10名球员同时上场,但职业球员不是一次两个人,他轮到下一个人上场。现在假设一名职业球员需要6秒才能轮到他,而一名职业选手与两名选手的转换时间为6秒,那么回到第一名选手的总转换时间为1分钟(10x6秒)。因此,当他回到第一个与他一起开始比赛的人身边时,已经过去了2分钟(10xtime_per_turn_by-campion+10xtransition_time=2分钟)

假设所有玩家都需要45秒才能完成他们的回合,那么根据SERIAL事件的每场10分钟,游戏结束前的回合数应为600/(45+6)=11回合(约)

因此,整个事件将在11xtime_per_turn_by-player_&_champion+11xtransition_time_across_10_players=11x51+11x60sec=561+660=1221sec=20.35min(大约)内完成

从101分钟提高到20.35分钟(更好的方法)

3) 平行-假设组织者获得了一些额外的资金,因此决定邀请两名职业冠军选手(两人能力相同),并将同一组10名选手(挑战者)分成两组,每组5人,并将他们分配给两名冠军,即每组一人。现在,赛事在这两组比赛中并行进行,即至少有两名选手(每组一名)与各自组的两名职业选手进行比赛。

然而,在该组中,职业选手一次只带一名选手(即按顺序),因此无需任何计算,您可以很容易地推断出整个比赛将在101/2=50.5分钟内完成

看到从101分钟到50.5分钟的进步(好方法)

4) 并发+并行-在上述场景中,假设两名冠军选手将与各自组中的5名选手同时比赛(读第二分),因此现在跨组的比赛是并行运行的,但在组内,他们是同时运行的。

因此,一组游戏将在11xtime_per_turn_by-playerer_&_champion+1extransition_time_across_5_layers=11x51+11x30=600+330=930秒=15.5分钟(大约)内完成

因此,整个活动(包括两个这样的平行跑步组)大约将在15.5分钟内完成

看到从101分钟到15.5分钟的改进(最佳方法)

注意:在上述场景中,如果您用10个类似的工作替换10个玩家,用两个CPU核心替换两个职业玩家,则以下顺序仍然正确:

串行>并行>并发>并发+并行

(注意:此顺序可能会因其他情况而改变,因为此顺序高度依赖于作业之间的相互依赖性、作业之间的通信需求以及作业之间的转换开销)

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

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

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

让我们想象一个有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 > ....

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

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

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

想象一下,通过观看视频教程学习一种新的编程语言。你需要暂停视频,应用代码中所说的内容,然后继续观看。这就是并发性。

现在你是一名职业程序员了。你喜欢在编码时听平静的音乐。这就是平行主义。

正如Andrew Gerrand在GoLang博客中所说

并发是指同时处理许多事情。相似一次做很多事情。

享受