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


当前回答

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

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

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

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

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

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

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

来源:此处的另一个答案

希望这会有所帮助。

其他回答

只是为了给其他好答案添加更多的澄清:

基于处理的抽象(CPU作为一个完全可以想象的例子)能够在同一时刻运行唯一的任务的前提,

并发是一个关于处理抽象的故事:它可以在不同的任务之间切换。

并行是一个关于我们有多个处理抽象的故事(例如,我们的CPU有多个内核)。因此,这是我们的系统能够同时执行多个任务的原因(字面意思)。但这里没有提到处理的特定抽象(它们是否并发)。

这里的重点是这些故事的内容。

因此,当您阅读公认答案时,请注意:

并发是指两个或多个任务可以在重叠的时间段。

严格地说,我们可以根据这个定义得出结论,并行性本身就是并发性的前提。

为什么存在困惑

由于这两个词的字典含义几乎相同,因此存在混淆:

并发:同时存在、发生或完成(dictionary.com)平行:非常相似,经常同时发生(梅里亚姆·韦伯斯特)。

然而,它们在计算机科学和编程中的使用方式却截然不同。以下是我的解释:

并发性:可中断性并行性:独立性

那么,我所说的上述定义是什么意思?

我将用一个现实世界的类比来澄清。假设你必须在一天内完成两项非常重要的任务:

获取护照完成演示文稿

现在,问题是任务1需要你去一个极其官僚的政府办公室,这让你排队等候4个小时才能拿到护照。同时,任务2是你的办公室需要的,这是一项关键任务。两者都必须在特定的一天完成。

案例1:顺序执行

通常,你会开车去护照办公室2个小时,排队4个小时,完成任务,开车回去两个小时,回家,再睡5个小时,然后完成演讲。

案例2:并发执行

但你很聪明。你要提前计划。你随身携带一台笔记本电脑,在排队等候的时候,你开始做你的演讲。这样,一旦你回到家里,你只需要额外工作1小时而不是5小时。

在这种情况下,这两项任务都是由您完成的,只是零碎的。您在排队等候时中断了护照任务,并进行了演示。当您的号码被呼叫时,您中断了演示任务,并切换到护照任务。由于这两项任务的可中断性,节省时间基本上是可能的。

并发性,IMO,可以理解为ACID中的“隔离”属性。如果子事务可以以任何交错的方式执行,那么两个数据库事务被认为是隔离的,并且如果两个任务是顺序完成的,那么最终结果是相同的。记住,对于护照和演示任务,你是唯一的刽子手。

案例3:并行执行

现在,既然你是个聪明的家伙,你显然是个更高级的人,而且你有一个助手。所以,在你开始护照任务之前,你给他打电话,告诉他准备演示文稿的初稿。你花了一整天的时间完成护照任务,回来看看你的邮件,然后找到了演示稿。他做得很扎实,再过两个小时就完成了一些编辑。

现在,你的助手和你一样聪明,他能够独立工作,而不需要经常要求你澄清。因此,由于任务的独立性,它们由两个不同的执行者同时执行。

还和我在一起吗?好吧

案例4:并行但不并行

还记得你的护照任务吗,你必须在排队等候的地方?因为这是你的护照,你的助手不能排队等你。因此,护照任务具有可中断性(您可以在排队等候时停止它,稍后当您的号码被呼叫时再继续),但没有独立性(您的助手不能代替您等待)。

案例5:并行但不并发

假设政府办公室有一个安全检查来进入办公场所。在这里,您必须移除所有电子设备并将其提交给官员,他们只会在您完成任务后归还您的设备。

在这种情况下,护照任务既不可独立,也不可中断。即使你在排队,你也不能做其他事情,因为你没有必要的设备。

同样地,假设演示是高度数学化的,你需要100%集中至少5小时。你不能在排队等候护照任务时做这件事,即使你随身携带笔记本电脑。

在这种情况下,演示任务是独立的(您或您的助手可以投入5小时的精力),但不能中断。

案例6:并发和并行执行

现在,假设除了指派你的助手参加演示外,你还随身携带一台笔记本电脑来完成护照任务。在排队等候时,您会看到您的助手在共享幻灯片组中创建了前10张幻灯片。你对他的工作发表了评论,并做了一些更正。后来,当你回到家时,你只需要15分钟,而不是2个小时来完成草稿。

这是可能的,因为演示任务具有独立性(你们中的任何一个都可以完成)和可中断性(你们可以停止它,稍后再继续它)。因此,您同时执行了两个任务,并并行执行了演示任务。

比方说,除了过于官僚之外,政府办公室也是腐败的。因此,你可以出示你的身份证,输入它,开始排队等待你的号码被呼叫,贿赂一名警卫和其他人来保持你在队伍中的位置,偷偷溜出去,在号码被呼叫之前回来,然后自己继续等待。

在这种情况下,您可以同时并行执行护照和演示任务。你可以偷偷溜出去,你的位置由你的助手掌握。然后你们两个都可以进行演示等。


回到计算机科学

在计算世界中,以下是每种情况的典型场景:

情况1:中断处理。情况2:只有一个处理器,但由于I/O,所有正在执行的任务都有等待时间。案例3:当我们谈论map reduce或hadoop集群时经常会看到。案例4:我认为案例4很罕见。任务是并发但不是并行的,这是不常见的。但这可能会发生。例如,假设您的任务需要访问只能通过处理器1访问的特殊计算芯片。因此,即使处理器-2是空闲的,而处理器-1正在执行其他任务,特殊计算任务也不能在处理器-2上继续。病例5:同样罕见,但不像病例4那样罕见。非并发代码可以是受互斥锁保护的关键区域。一旦启动,它必须执行到完成。然而,两个不同的关键区域可以在两个不同处理器上同时进行。案例6:IMO,关于并行或并发编程的大多数讨论基本上都在讨论案例6。这是并行和并发执行的混合和匹配。

并发和Go

如果你明白Rob Pike为什么说并发性更好,你必须明白原因是什么。你有一个非常长的任务,其中有多个等待期,你需要等待一些外部操作,如文件读取、网络下载。在他的演讲中,他所说的是,“把这一长串的任务分解,这样你就可以在等待的时候做一些有用的事情。”这就是为什么他会和各种各样的地鼠谈论不同的组织。

现在,围棋的力量来自于使用围棋关键词和频道,让这一突破变得非常容易。此外,在运行时中有很好的底层支持来调度这些goroutine。

但本质上,并发比并行好吗?

苹果比橙子好吗?

要补充其他人所说的话:

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

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

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

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

希望这有帮助!

“并发”是指同时做任何事情。它们可能是不同的东西,也可能是相同的东西。尽管缺乏公认的答案,但这并不是关于“看起来是在同一时间”,而是真的在同一个时间。您需要多个CPU内核,或者在一个主机内使用共享内存,或者在不同主机上使用分布式内存,以运行并发代码。例如,同时并发运行的3个不同任务的流水线:Task-level-2必须等待Task-level-1完成的单元,而Task-level-3必须等待Task-level-2完成的工作单元。另一个例子是1-生产者与1-消费者的并发;或许多生产者和1-消费者;读者和作家;等

“并行”是指同时做相同的事情。它是并发的,但更重要的是,它是在同一时间发生的相同行为,最典型的是在不同的数据上。矩阵代数通常可以并行化,因为您有重复运行的相同操作:例如,可以使用相同的行为(和)在不同的列上同时计算矩阵的列和。在可用的处理器核之间划分(拆分)列是一种常见的策略,这样每个处理器核处理的工作量(列数)就接近相同。另一种拆分工作的方法是一袋一袋的任务,完成工作的员工会回到经理那里,经理会将工作分配出去,并动态地分配更多的工作,直到所有工作都完成。票务算法是另一种。

不仅仅是数字代码可以并行化。文件太频繁可以并行处理。在自然语言处理应用程序中,对于数百万个文档文件中的每一个,您可能需要计算文档中标记的数量。这是并行的,因为您正在计算每个文件的令牌,这是相同的行为。

换句话说,并行是指同时执行相同的行为。并发意味着同时,但不一定是相同的行为。并行是一种特殊类型的并发,在同一时间发生相同的事情。

例如,术语将包括原子指令、关键部分、互斥、旋转等待、信号量、监视器、屏障、消息传递、map reduce、心跳、铃声、票务算法、线程、MPI、OpenMP。

格雷戈里·安德鲁斯(Gregory Andrews)的著作是关于多线程、并行和分布式编程的顶级教科书。