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


当前回答

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

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

其他回答

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

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

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

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

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

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

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

这个来源的解释对我很有帮助:

并发性与应用程序如何处理多个任务有关一个应用程序可以一次处理一个任务(按顺序)或同时处理多个任务(同时)。另一方面,并行性与应用程序处理每个单独的任务。应用程序可以处理该任务从开始到结束依次执行,或将任务拆分为子任务可以并行完成。正如您所看到的,应用程序可以是并发的,但不能是并行的。这意味着它同时处理多个任务,但是这些任务不分解为子任务。应用程序也可以是并行的,但不能是并发的。这意味着应用程序一次只能处理一个任务,而此任务被分解为可以并行处理的子任务。此外,应用程序既不能是并发的,也不能是并行的。这意味着它一次只能处理一个任务从未分解为并行执行的子任务。最后,应用程序也可以是并发和并行的,在它可以同时处理多个任务,也可以中断将每个任务分解为子任务以并行执行。然而并发性和并行性的好处可能会因此而丧失由于计算机中的CPU已经处于相当繁忙的状态仅具有并发性或并行性。结合起来可能会导致只有很小的性能增益或甚至性能损失。

同意:具有共享资源潜力的多个执行流

前任:两个线程竞争I/O端口。

视差:将问题分成多个相似的块。

前任:通过对文件的每一半运行两个进程来解析大文件。

并发简单意味着多个任务正在运行(不需要并行)。例如,假设我们在任何时刻都有3个任务:多个任务可能正在运行,或者所有任务可能同时运行。

并行性意味着它们实际上是并行运行的。因此,在这种情况下,三者必须同时运行。

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

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

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

希望这有帮助!