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


当前回答

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

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

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

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

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

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

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

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

其他回答

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

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

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

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

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

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

为什么存在困惑

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

并发:同时存在、发生或完成(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。

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

苹果比橙子好吗?

并发性=>在共享资源的重叠时间段内执行多个任务时(可能最大化资源利用率)。

并行=>当单个任务被划分为可以同时执行的多个简单的独立子任务时。

摘自Robert Love的《Linux系统编程》一书:

并发、并行和竞争线程创建两个相关但不同的现象:并发和相似两者都是苦乐参半的,涉及线程的成本以及它的好处。并发是两个或两个以上的能力要在重叠的时间段中执行的线程。平行度为同时执行两个或多个线程的能力。并发可以在没有并行性的情况下发生:例如,多任务处理在单处理器系统上。并行性(有时强调为真正的并行性)是一种特殊的并发形式,需要多个处理器(或一个能够支持多个引擎的处理器例如GPU)。通过并发,多个线程可以但不一定同时进行。具有并行,线程实际上并行执行,允许多线程程序以利用多个处理器。并发是一种编程模式,一种解决问题的方法。并行性是一种硬件特性,可以通过并发实现。两者都很有用。

这一解释与公认的答案一致。事实上,这些概念远比我们想象的简单。不要认为它们是魔法。并发大约是一段时间,而并行大约是同时进行的。

“并发”是指有多件事情正在进行。

“并行性”是指并发的事情同时进行。


没有并行性的并发示例:

单个内核上有多个线程。Win32消息队列中有多条消息。MARS连接上有多个SqlDataReader。浏览器选项卡中有多个JavaScript承诺。

然而,请注意,并发性和并行性之间的区别通常是一个视角问题。从执行代码(可观察到的效果)的角度来看,上述示例是非并行的。但即使在单个内核中也存在指令级并行性。有一些硬件与CPU并行工作,然后在完成时中断CPU。在执行窗口过程或事件处理程序时,GPU可能正在绘制到屏幕。当您仍然获取上一个查询的结果时,DBMS可能正在为下一个查询遍历B树。执行Promise.resolve()时,浏览器可能正在进行布局或联网。等等。。。

好了。世界一如既往地混乱;)