并行执行和并行执行之间的区别是什么?我从未完全能够理解这种区别。

标记将并发定义为同时运行两个进程的方式,但是我认为并行性是完全相同的东西,即:分离的线程或进程可以在单独的处理器上运行。

此外,如果我们考虑使用异步I / O之类的东西,那么我们是在处理并发性还是并行性?

评论

简而言之-并发:许多不同的操作会同时发生。并行:同一操作一次分解成小块。

@Oded,我理解这些词的意思,但是我无法理解其中的含义。您有具体的例子吗?

@Oded,我真的不同意您的看法,在它们的定义(通用的或适用于编程的定义)中,“并发”和“并行”的概念均未提及有关操作数或“大小”的任何内容。 >
当您说“小块”时,@ Oded。

@Oded:是的,但这似乎是您和ShivanDragon之间误解的根源。

#1 楼

并发和并行性是两个相关但截然不同的概念。

并发本质上意味着任务A和任务B都需要彼此独立发生,并且A开始运行,然后B在A被启动之前开始完成。

完成并发的方式有很多种。其中之一就是并行性-让多个CPU同时处理不同的任务。但这不是唯一的方法。另一个是通过任务切换,它的工作方式如下:任务A工作到某个点,然后工作的CPU停止并切换到任务B,处理一段时间,然后再切换回任务A。时间片足够小,即使实际上它们实际上是由多任务CPU串行处理的,对于用户来说,这似乎都是并行运行的。

评论


情况B是异步IO的工作方式,不是吗?

–blz
13年3月15日在16:29

@blz:是的。这也是抢先式多任务处理的工作方式。主要区别在于,在异步IO上,程序决定放弃其时间并告诉CPU处理其他事情,而在抢占式多任务处理中,如果运行的线程在足够长的时间内没有自愿放弃CPU,则操作系统会抢占它。

–梅森·惠勒
13年3月15日在16:37

@MasonWheeler:如果我们只有1个CPU,那么我们只能有并发性,没有并行性。对?并行性可以通过1个以上的CPU来实现。对?如果是正确的,并且我们只有1个CPU,那么Java 8中的Streams毫无用处。

–阿尼什·米塔尔(Anish Mittal)
19年2月23日在12:02



关于前几点。至于最后一个,并行性是您从Streams获得的唯一好处吗?我不是Java开发人员,但是我的印象是Java Streams大致等同于LINQ,并且在表现力和易于开发方面具有真正的优势。

–梅森·惠勒
19年2月23日在13:28

#2 楼

这两个概念是相关的,但有所不同。

并发意味着两个或多个计算在同一时间范围内发生,并且它们之间通常存在某种依赖性。

并行是指两个或多个计算同时发生。

大胆地说,并发描述了一个问题(两件事需要一起发生),而并行则描述了解决方案(两个处理器内核用于同时执行两件事) )。

并行化是实现并发的一种方法,但它并不是唯一的方法。另一个流行的解决方案是交错处理(也称为协程):将两个任务分解为原子步骤,然后在两者之间来回切换。

到目前为止,非并行并发的最著名示例是JavaScript如何可行:只有一个线程,并且任何异步回调都必须等待,直到前一段代码完成执行为止。要知道这一点很重要,因为它可以保证您编写的任何函数都是原子函数-在回调返回之前,没有回调可以中断它。但这也意味着“忙循环”将不起作用-您无法设置超时然后循环直到它触发为止,因为循环将阻止超时回调的执行。

评论


您说并发意味着在同一时间范围内发生两个或多个计算,并且它们之间通常存在某种依赖关系。但是写这个接受答案的用户说,并发本质上意味着任务A和任务B都需要彼此独立发生。那么结论是什么?

–nbro
15年3月13日在12:07



你能解释为什么JavaScript的模型是并发的吗?根据并发的定义,应在同一时间范围内进行两次或多次计算。但是在JavaScript中,使用单个队列对计算进行了顺序排序。

– Damluar
16年4月21日在10:41

我所说的“在同一时间范围内”并不一定意味着“同时”,只是它们发生的整个时间范围是重叠的。这可以并行实现(例如,两个处理器核心,每个执行一个任务),但是也可以通过完全序列化执行来实现(首先执行任务1,记住结果,然后执行任务2,然后报告两者) ,或者将两者切碎并交织在一起。后者是JS所做的。

– tdammers
16年4月25日在11:41

#3 楼

我相信这个答案比现有答案更正确,对其进行编辑将改变其本质。我试图链接到各种资源或Wikipedia页面,以便其他人可以确认其正确性。


并发性:系统的属性,该属性使程序,算法或问题的单元得以执行在不影响最终结果的情况下无序或不完整12。

一个简单的示例是连续添加:

0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45


由于加法的交换性质,可以在不影响正确性的情况下重新排列它们的顺序;以下排列将得出相同的答案:

(1 + 9) + (2 + 8) + (3 + 7) + (4 + 6) + 5 + 0 = 45


这里我将数字分组为对,这些数字对总计为10,使我更容易得出正确的

并行计算:一种并行执行许多计算或过程执行的计算类型34。因此,并行计算利用并发属性来执行并行计算的多个单元。程序,算法或问题同时进行。

继续以连续加法为例,我们可以并行执行总和的不同部分:

Execution unit 1:  0 + 1 + 2 + 3 + 4 = 10
Execution unit 2:  5 + 6 + 7 + 8 + 9 = 35


然后最后,我们对每个工作人员的结果求和以得到10 + 35 = 45。再次,这种并行性是唯一可能的,因为连续的加法具有并发性。

并发不仅可以被并行性利用。考虑在单核系统上抢占:一段时间后,系统可能会在多个运行中的进程上取得进展,而其中任何一个都没有完成。确实,您的异步I / O示例是不需要并行性的并发常见示例。


混淆

上面是相对简单的。我怀疑人们会感到困惑,因为字典定义不一定与上面概述的内容匹配:


并发:同时发生或同时存在或并排5。
并发:事实同时发生或同时存在的两个或多个事件或情况,在Google上搜索时:“定义:并发性”。

字典将“并发性”定义为发生的事实,而计算本地语言是程序,属性或系统的潜在属性。尽管相关,但这些东西并不相同。


个人建议

我建议在保证或预期同时执行时使用术语“并行”,并且如果不确定是否要执行同时执行,则在不确定或无关紧要时使用“并发”一词。

因此,我将模拟在多个核上并行模拟喷气发动机。

I将描述Makefile作为并发的一个例子。 Makefile声明每个目标的依赖性。当目标依赖于其他目标时,这将创建部分排序。全面,正确地定义了关系和配方后,便建立了并发属性:存在部分顺序,以便可以重新安排某些任务的顺序,而不会影响结果。同样,可以利用此并发性同时构建多个规则,但是无论是否采用并行性,并发性都是Makefile的属性。

#4 楼

并发执行是并行执行的一般形式。例如,并行程序也可以称为并发,但反向调用不正确。


可以在单个处理器上执行并行执行(多个线程,由调度程序管理)。
不能并行执行可能在单个处理器上但在多个处理器上。 (每个处理器一个进程)

有关详细信息,请阅读此研究论文
并发编程的概念

评论


“不可能在单个处理器上而是在多个处理器上并行执行”-当然,除了处理器内有并行执行路径(例如利用指令级并行性的系统(又名“超标量”架构,例如奔腾,Intel Cortex和大多数其他高端处理器之后的英特尔处理器)以及单指令多数据,也称为数据并行架构(例如MMX / SSE) /等等)。更不用说像数据流处理器之类的奇特的安排了。

–法律
18年2月28日在20:04

是的,并发意味着所有多个线程都可以使用上下文切换来一次工作,这由调度程序管理。并行处理意味着多个线程在不同的处理器/机器中同时工作。

– Akash5288
19年11月19日在7:29

#5 楼

并行处理是并行处理的子集。

并行处理描述了两个异步发生的任务,这意味着任务的执行顺序是不确定的。通过交织可执行指令,两个线程可以在同一处理器内核上同时运行。例如,线程1运行10毫秒,线程2运行10毫秒,等等。并行处理是一种并行处理,其中一组以上的指令正在同时执行。这可能是多个系统在处理分布式计算中的一个常见问题,或者是同一系统上的多个内核。

#6 楼

显然,这些术语在不同的文化中使用不同。

我的理解如下:

并行是一种加快处理速度的方法。无论您是在单个内核,多个内核甚至在GPU上进行矩阵乘法,结果都是一样的(否则您的程序就坏了)。它并不会向某些程序中添加新功能,而只是提高速度。

并发是关于无法按顺序执行的操作。例如,在等待下一个请求的同时,为3个客户端提供3个不同的网页。 (尽管您可以像以前那样通过交织在某种程度上模拟它。)
请注意,并发程序的行为是不确定的。例如,目前尚不清楚,将首先完全服务3个客户中的哪个。您可以运行相当多的测试,并且每次完成请求的顺序都会得到不同的结果。运行时系统应确保:a)将为所有客户提供服务,b)在合理的时间内。

通常,并行计算的工作马不知道,也不知道它关心并行性。虽然并发任务通常显式地使用进程间或线程间通信,例如阻塞队列,同步和锁定机制。

#7 楼

在我看来,从应用程序编程的角度来看,这两个概念之间没有区别,并且两个单词令人困惑,这令人困惑。我认为线程交织是在不太可能使用多核的时代带来的,以模拟多核处理。为什么我们对这个过时的心态有一个词?

梅森·惠勒和企鹅给出了相同的答案。具有任务切换功能或多核功能的一个核心是并发的,严格来说,多核心=并行。

我的看法是,这两个术语应合并为一个,因此我努力避免说“并发”。我猜想在OS编程级别上,区别很重要,但是从应用程序程序员的角度来看,这并不太重要。我已经编写了mapReduce,Spark,MPI,cuda,openCL和多线程c ++,而我从来不必停止思考该作业是使用交错线程还是使用多个内核。

例如,当我编写多线程c ++时,我不确定要获得多少个内核,尽管有一些方法可以要求获得多少个内核,如此处所述https:// stackoverflow.com/questions/2166425/如何结构化AC应用程序使用多核处理器。在spark中,我只是映射并减少操作,不知道jvm在硬件级别如何处理它们。在GPU上,我认为每个线程都分配有自己的简单处理器,但是无论何时出现问题,我总是同步我的线程。使用MPI时,显式指定了机器之间的通信,但是我们可以交错运行在单个内核上的多台机器上的功能,并通过适当的单线程功能组合结果。而且,如果我们使用MPI来协调一堆单核机器,每台机器都具有多线程功能呢?有什么区别?我不会说。称其为“平行”并完成它。

评论


这种区别在今天仍然有意义。您最多只能拥有硬件所具有的CPU内核数量的并行性,但是许多程序一次会执行数百个并发计算,这远远超过硬件所具有的内核数量。如果不了解这种区别,可能会导致程序员无法理解为什么并行化程序的运行速度比单线程版本(或线程数量少)慢。

– Lie Ryan
17年2月12日在11:47



#8 楼

tdammer的声明已接近尾声,剩下的就是重点。他说:

“大胆地说,并发描述了一个问题(两件事需要一起发生),而并行描述了一个解决方案(两个处理器内核用于同时执行两件事””

让我们来分析一下这些单词。

当前的意思是现在发生的,实际的,与此刻相关的。
Con的意思是反对,反对而不是一致。

因此,并发意味着竞争同一资源,而并行则不是,并行过程可能使用相同的资源,但不是被认为是问题,这不是问题。并发性是要解决的问题。

评论


“当前意味着此时此刻正在发生的,实际的,相关的。骗局意味着反对,反驳,不吻合。” -需要引用。我强烈怀疑这两种说法。虽然“当前”可以具有英语中提到的含义,但不是“并发”一词中使用的含义

–绿巨人
18 Mar 1 '18 at 13:55



我认为从Latin并发的翻译是“一起运行”。前缀“ con”通常意味着在一起,例如在阴谋中(共呼吸)结果(在一起或跟随)结论(接近)等。这是令人讨厌的语言,某些事物可能具有相反的含义,制裁是我最喜欢的例子。

–user251748
18年1月1日在19:45

@no comprende在这种情况下(并发),一起运行似乎确实更合适。由于没有顺应...在荷兰语中,并发是一个名词,表示竞争者。 Courant很常见,到处都是。它也是报纸。现在正在活动的东西。 “ Rekening courant”是一个正在运行的帐户。我觉得并发意味着冲突。争夺相同资源。在同一个空间中运行。也许是因为荷兰语的意思(竞争对手)。

–马丁·马特
18-3-1在20:42



#9 楼

术语“并行”的另一种常见和特定用法是指阵列处理器。 (您计算机中的GPU就是一个很好的例子。)在这里,大量冗余的计算单元实际上是在同一时刻计算许多结果。

在这种情况下,“并发”稍微宽松一些:人们可能会说,在最后一秒钟的过程中,许多任务都在处理中,因此它们被“同时处理”,尽管在任何特定的纳秒级上,实际上只有其中一项正在处理。 br />
但是:“取决于。”在普通的人类对话中,这两个词具有相同的口语含义。因此,您可能需要进行澄清,以确定是否打算使用某些更精确的含义。