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


当前回答

并发是编程术语。它是关于多个任务的,这些任务开始运行并以无特定顺序在重叠的时间段内完成。并发性由操作系统管理。当多个线程想要访问同一资源时,线程会遇到竞争条件问题。此外,它们还存在死锁,彼此等待,阻止自己运行。例如,你想一边吃饭一边说话。首先你需要吞下嘴里的食物或停止咀嚼,然后你可以说话(你在划水),说话后你可以再咬一口。

并行性是一个硬件术语。它是关于在具有多个计算资源(如多核处理器)的硬件上同时运行的多个任务。如果你能在咀嚼食物时说话,这将是平行的。平行的一个例子是,一个人可以同时唱歌和跳舞。

其他回答

派克的“并发”概念是一个有意的设计和实现决策。具有并发能力的程序设计可能表现出行为上的“并行性”;这取决于运行时环境。

你不希望一个不是为并发而设计的程序表现出并行性。:-)但就相关因素(功耗、性能等)而言,这是一个净收益,您需要最大程度的并发设计,以便主机系统可以在可能的情况下并行执行。

派克的Go编程语言将这一点发挥到了极致:他的函数都是可以同时正确运行的线程,也就是说,如果系统有能力,调用函数总是会创建一个与调用者并行运行的线程。一个拥有数百甚至数千个线程的应用程序在他的世界中是非常普通的。(我不是围棋专家,这只是我的看法。)

将其视为服务队列,其中服务器只能服务队列中的第一个作业。

1个服务器,1个作业队列(有5个作业)->无并发,无并行性(只有一个作业被服务完成,队列中的下一个作业必须等待服务完成,并且没有其他服务器为其服务)

1个服务器,2个或多个不同的队列(每个队列有5个作业)->并发(因为服务器与队列中的所有第一个作业共享时间,相等或加权),仍然没有并行性,因为在任何时刻都有一个且唯一的作业在服务。

两个或多个服务器,一个队列->并行(两个作业同时完成),但没有并发(服务器不共享时间,第三个作业必须等待其中一个服务器完成)

2个或多个服务器,2个或更多不同的队列->并发性和并行性

换句话说,并发是共享完成作业的时间,它可能会占用相同的时间来完成作业,但至少它会提前开始。重要的是,可以将作业分割成更小的作业,这样可以进行交织。

并行性是通过更多并行运行的CPU、服务器、人员等实现的。

请记住,如果共享资源,则无法实现纯粹的并行性,但这正是并发性的最佳实际用途,它将承担另一项不需要该资源的工作。

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

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

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

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

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

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

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

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

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

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

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

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

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

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