是什么方面的区别并发和并行执行?我从来没有完全能够理解这种区别。
该标签将并发定义为同时运行两个进程的方式,但是我认为并行性是完全相同的事情,即:可能在单独的处理器上运行的单独的线程或进程。
另外,如果我们考虑使用异步I / O之类的东西,那么我们是在处理并发性还是并行性?
是什么方面的区别并发和并行执行?我从来没有完全能够理解这种区别。
该标签将并发定义为同时运行两个进程的方式,但是我认为并行性是完全相同的事情,即:可能在单独的处理器上运行的单独的线程或进程。
另外,如果我们考虑使用异步I / O之类的东西,那么我们是在处理并发性还是并行性?
Answers:
并发和并行是两个相关但截然不同的概念。
并发本质上意味着任务A和任务B都需要彼此独立发生,并且A开始运行,然后B在A完成之前开始。
有多种完成并发的方法。其中之一就是并行性-让多个CPU同时处理不同的任务。但这不是唯一的方法。另一个是通过任务切换,它的工作方式如下:任务A工作到某个点,然后工作的CPU停止并切换到任务B,处理一段时间,然后再切换回任务A。时间片足够小,即使实际上它们实际上是由多任务CPU串行处理的,对于用户来说,这似乎都是并行运行的。
这两个概念是相关的,但有所不同。
并发意味着在同一时间范围内发生两个或多个计算,并且它们之间通常存在某种依赖关系。
并行是指同时进行两个或多个计算。
大胆地说,并发描述了一个问题(两件事需要一起发生),而并行描述了一个解决方案(两个处理器内核用于同时执行两件事)。
并行是实现并发的一种方法,但不是唯一的方法。另一个流行的解决方案是交错处理(也称为协程):将两个任务分解为原子步骤,然后在两者之间来回切换。
迄今为止,最不知名的非并行并发示例是JavaScript的工作方式:只有一个线程,并且任何异步回调都必须等到之前的代码块执行完毕。要知道这一点很重要,因为它可以确保您编写的任何函数都是原子函数-在返回之前,任何回调都不能中断它。但这也意味着“忙循环”将不起作用-您无法设置超时然后循环直到它触发为止,因为循环将阻止超时回调的执行。
Concurrency means that two or more calculations happen within the same time frame, and there is usually some sort of dependency between them.
但是写那个接受答案的用户说Concurrency means, essentially, that task A and task B both need to happen independently of each other
。那么结论是什么?
我相信这个答案比现有答案更正确,对其进行编辑将改变其本质。我试图链接到各种资源或Wikipedia页面,以便其他人可以确认正确性。
并发:系统的一种属性,使程序,算法或问题的各个单元可以无序或部分顺序执行,而不会影响最终结果1 2。
一个简单的例子是连续添加:
0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45
由于加法的交换性质,可以在不影响正确性的情况下重新排列这些顺序。以下安排将得出相同的答案:
(1 + 9) + (2 + 8) + (3 + 7) + (4 + 6) + 5 + 0 = 45
在这里,我将数字分为几对,总计为10,这使我更容易得出正确的答案。
并行计算:一种计算类型,其中许多计算或过程的执行同时进行3 4。因此,并行计算利用并发性来同时执行程序,算法或问题的多个单元。
继续以连续加法为例,我们可以并行执行总和的不同部分:
Execution unit 1: 0 + 1 + 2 + 3 + 4 = 10
Execution unit 2: 5 + 6 + 7 + 8 + 9 = 35
然后最后,我们对每个工人的结果求和10 + 35 = 45
。
同样,这种并行性仅是可能的,因为连续的添加具有并发性。
但是,并发不仅可以被并行性利用。考虑在单核系统上抢占:一段时间后,系统可能会在多个运行中的进程上取得进展,而其中任何一个都没有完成。确实,您的异步I / O示例是并发的常见示例,不需要并行处理。
混乱
上面是相对简单的。我怀疑人们会感到困惑,因为字典定义不一定与上面概述的内容匹配:
字典将“并发”定义为出现的事实,而在计算语言中的定义是程序,属性或系统的潜在属性。尽管相关,但这些东西并不相同。
个人建议
我建议在确保或预期同时执行时使用术语“并行”,而在不确定是否要使用同时执行时不建议使用“并发”。
因此,我将描述在多核上并行模拟喷气发动机。
我将Makefiles描述为并发的一个例子。Makefile声明每个目标的依赖性。当目标依赖于其他目标时,这将创建部分排序。全面,正确地定义了关系和配方后,这将建立并发属性:存在部分顺序,以便可以重新安排某些任务的顺序,而不会影响结果。同样,可以利用此并发性同时构建多个规则,但是无论是否采用并行性,并发性都是Makefile的属性。
并发执行是并行执行的一般形式。例如,并行程序也可以称为并发,但是反向不是真的。
有关详细信息,请阅读此研究论文 并行编程的概念
tdammer的声明已接近尾声,剩下的就是重点。他说:
“大胆地说,并发描述了一个问题(两件事需要一起发生),而并行描述了一个解决方案(两个处理器内核用于同时执行两件事”)
让我们来分析一下单词。
当前意味着此时此刻正在发生的,实际的,相关的。骗子是指反对,反对,不赞同。
平行是指在相同方向上没有交叉,而不会彼此阻碍。
因此,并发意味着要争夺相同的资源。并行性则没有。并行进程可能正在使用相同的资源,但不认为是问题,这不是问题。对于并发,这是一个要处理的问题。
显然,这些术语在不同的文化中使用不同。
我的理解如下:
并行是一种加快处理速度的方法。无论您是在单个内核,多个内核甚至在GPU上执行矩阵乘法,结果都是一样的(否则您的程序就坏了)。它不会向某些程序添加新功能,而只是提高速度。
尽管并发是您无法按顺序执行的事情。例如,在等待下一个请求的同时,为3个客户端提供3个不同的网页。(尽管您可以像以前那样通过交错在某种程度上模拟它。)请注意,并发程序的行为是不确定的。例如,目前尚不清楚,将首先完全服务3个客户中的哪个。您可以运行很多测试,并且每次完成请求的顺序都会得到不同的结果。运行时系统应保证a)将为所有客户提供服务,b)在合理的时间内。
通常,并行计算的工作马不了解也不关心并行性。虽然并发任务通常显式采用进程间或线程间通信,例如阻塞队列,同步和锁定机制。
在我看来,从应用程序编程的角度来看,这两个概念之间没有区别,并且两个单词混淆起来也是令人困惑的。我认为线程交织是在不太可能使用多核的时代带来的,以模拟多核处理。为什么我们对这种过时的心态有一个词?
梅森·惠勒和企鹅给出了相同的答案。具有任务切换功能或多核功能的一个内核是并发的,严格来说,多核=并行。
我的观点是,这两个术语应合而为一,我努力避免说“并发”。我猜在OS编程级别上,区别很重要,但是从应用程序程序员的角度来看,这并不太重要。我已经编写了mapReduce,Spark,MPI,cuda,openCL和多线程c ++,而我从来不必停止思考该作业是使用交错线程还是使用多个内核。
例如,当我编写多线程c ++时,有时不确定要获得多少个内核,尽管有一些方法可以要求获得多少个内核,如此处所述https://stackoverflow.com/questions/2166425/如何结构化AC应用程序使用多核处理器。在spark中,我只是映射并减少操作,不知道jvm在硬件级别如何处理它们。我认为在GPU上每个线程都分配给它自己的简单处理器,但是无论何时出现问题,我总是同步我的线程。使用MPI,可以明确指定机器之间的通信,但是我们可以交错运行在单个内核上的多台机器上的功能,并通过适当的单线程功能组合结果。如果我们使用MPI来协调一堆单核机器,每台机器都具有多线程,该怎么办?有什么区别?我不会说。称其为“平行”并完成它。