并发和并行之间的区别是什么?
当前回答
派克的“并发”概念是一个有意的设计和实现决策。具有并发能力的程序设计可能表现出行为上的“并行性”;这取决于运行时环境。
你不希望一个不是为并发而设计的程序表现出并行性。:-)但就相关因素(功耗、性能等)而言,这是一个净收益,您需要最大程度的并发设计,以便主机系统可以在可能的情况下并行执行。
派克的Go编程语言将这一点发挥到了极致:他的函数都是可以同时正确运行的线程,也就是说,如果系统有能力,调用函数总是会创建一个与调用者并行运行的线程。一个拥有数百甚至数千个线程的应用程序在他的世界中是非常普通的。(我不是围棋专家,这只是我的看法。)
其他回答
(我很惊讶这样一个根本问题多年来都没有得到正确和巧妙的解决……)
简而言之,并发性和并行性都是计算的财产。
至于区别,以下是罗伯特·哈珀的解释:
首先要理解的是并行性与并发无关。并发与程序(或其组件)的不确定性组成有关。并行性与具有确定性行为的程序的渐近效率有关。并发是关于管理不可管理的事件:事件的发生是出于我们无法控制的原因,我们必须对此做出反应。用户单击鼠标时,窗口管理器必须做出响应,即使显示需要注意。这种情况本质上是不确定性的,但我们也在确定性设置中采用形式上的不确定性,假装组件以任意顺序发出事件信号,并且我们必须在事件发生时对其作出响应。非确定性组合是一种强大的程序结构思想。另一方面,并行性是关于确定性计算的子组之间的依赖性。其结果毋庸置疑,但有许多方法可以实现,有些方法比其他方法更有效。我们希望充分利用这些机会。
它们可以是程序中的各种正交财产。阅读此博客文章以获取更多插图。这篇文章稍微讨论了编程中组件的差异,比如线程。
注意,线程或多任务都是为更具体的目的服务的计算实现。它们可以与并行性和并发性相关,但不是以一种基本的方式。因此,它们很难成为开始解释的好条目。
还有一个亮点:(物理)“时间”几乎与这里讨论的财产无关。时间只是一种衡量实施的方式,以显示财产的重要性,但远非本质。仔细考虑一下“时间”在时间复杂性中的作用——这或多或少是相似的,即使在这种情况下,度量也往往更重要。
在电子学中,串行和并行表示一种静态拓扑,决定电路的实际行为。当没有并发时,并行性是确定性的。
为了描述动态的、与时间相关的现象,我们使用了术语顺序和并发。例如,可以通过特定的任务序列(例如配方)获得特定的结果。当我们与某人交谈时,我们会产生一系列单词。然而,在现实中,许多其他过程在同一时刻发生,因此,与某一行动的实际结果一致。如果很多人在同一时间谈话,同时进行的谈话可能会干扰我们的顺序,但这种干扰的结果事先不知道。并发性引入了不确定性。
串行/并行和顺序/并行表征是正交的。数字通信就是一个例子。在串行适配器中,数字消息沿同一通信线路(例如,一根电线)临时(即顺序)分布。在并行适配器中,这也在并行通信线路(例如多条电线)上进行划分,然后在接收端进行重构。
让我们想象一个有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 > ....
这是一个在并行基础结构上复制的顺序过程(尽管仍部分序列化)。
在这两种情况下,假设孩子之间有完美的沟通,结果会提前确定。
如果有其他人与您同时与第一个孩子交谈,那么我们将同时进行处理。我们不知道基础设施将考虑哪个过程,因此最终结果尚未提前确定。
我喜欢Rob Pike的演讲:并发不是并行(这更好!)(幻灯片)(谈话)
Rob通常谈论Go,并且通常以直观直观的解释来解决并发与并行的问题!下面是一个简短的总结:
任务:让我们烧掉一堆过时的语言手册!一次一个!
并发:任务有许多并发分解!一个例子:
并行性:如果至少有2个地鼠同时工作或不工作,则前面的配置会并行出现。
“并发”是指有多件事情正在进行。
“并行性”是指并发的事情同时进行。
没有并行性的并发示例:
单个内核上有多个线程。Win32消息队列中有多条消息。MARS连接上有多个SqlDataReader。浏览器选项卡中有多个JavaScript承诺。
然而,请注意,并发性和并行性之间的区别通常是一个视角问题。从执行代码(可观察到的效果)的角度来看,上述示例是非并行的。但即使在单个内核中也存在指令级并行性。有一些硬件与CPU并行工作,然后在完成时中断CPU。在执行窗口过程或事件处理程序时,GPU可能正在绘制到屏幕。当您仍然获取上一个查询的结果时,DBMS可能正在为下一个查询遍历B树。执行Promise.resolve()时,浏览器可能正在进行布局或联网。等等。。。
好了。世界一如既往地混乱;)
并行性是每个CPU或多个CPU(在单个主板上)在多个内核上同时执行进程。
并发是指通过使用划分CPU时间(时间片)的调度算法在单个内核/CPU上实现并行性。进程是交错的。
单位:单个CPU中有1个或多个内核(几乎所有现代处理器)主板上有1个或多个CPU(想想老式服务器)一个应用程序就是一个程序(想想Chrome浏览器)一个程序可以有一个或多个进程(认为每个Chrome浏览器选项卡都是一个进程)一个进程可以有一个程序中的一个或多个线程(Chrome选项卡在一个线程中播放Youtube视频,另一个线程生成评论部分,另一个用于用户登录信息)因此,一个程序可以有一个或多个执行线程1个进程是线程+OS分配的内存资源(堆、寄存器、堆栈、类内存)