并发和并行之间的区别是什么?
当前回答
我喜欢Rob Pike的演讲:并发不是并行(这更好!)(幻灯片)(谈话)
Rob通常谈论Go,并且通常以直观直观的解释来解决并发与并行的问题!下面是一个简短的总结:
任务:让我们烧掉一堆过时的语言手册!一次一个!
并发:任务有许多并发分解!一个例子:
并行性:如果至少有2个地鼠同时工作或不工作,则前面的配置会并行出现。
其他回答
假设你有一个有两个线程的程序。程序可以通过两种方式运行:
Concurrency Concurrency + parallelism
(Single-Core CPU) (Multi-Core CPU)
___ ___ ___
|th1| |th1|th2|
| | | |___|
|___|___ | |___
|th2| |___|th2|
___|___| ___|___|
|th1| |th1|
|___|___ | |___
|th2| | |th2|
在这两种情况下,我们都有并发性,这仅仅是因为我们有多个线程在运行。
如果我们在具有单个CPU内核的计算机上运行此程序,操作系统将在两个线程之间切换,允许一次运行一个线程。
如果我们在带有多核CPU的计算机上运行这个程序,那么我们就可以同时并行运行两个线程。
我真的很喜欢这个来自另一个答案的图形表示——我认为它比上面的许多答案更好地回答了这个问题
并行与并发当两个线程并行运行时,它们都同时运行。例如,如果我们有两个线程A和B,那么它们的并行执行将如下所示:
CPU 1:A------------------------>
CPU 2:B------------------------->
当两个线程同时运行时,它们的执行会重叠。重叠可以通过以下两种方式之一发生:线程同时执行(即并行执行,如上所述),或者它们的执行在处理器上交错执行,如下所示:
CPU 1:A---------->B---------->A---------->B--------->
因此,出于我们的目的,并行可以被认为是并发的一种特殊情况
来源:此处的另一个答案
希望这会有所帮助。
太好了,让我用一个场景来展示我的理解。假设有三个孩子:A,B,C。A和B说话,C听。对于A和B,它们是平行的:A: 我是A。B: 我是B。
但对于C来说,他的大脑必须同时进行听A和B的过程,这可能是:我是我A是B。
“并发”是指同时做任何事情。它们可能是不同的东西,也可能是相同的东西。尽管缺乏公认的答案,但这并不是关于“看起来是在同一时间”,而是真的在同一个时间。您需要多个CPU内核,或者在一个主机内使用共享内存,或者在不同主机上使用分布式内存,以运行并发代码。例如,同时并发运行的3个不同任务的流水线:Task-level-2必须等待Task-level-1完成的单元,而Task-level-3必须等待Task-level-2完成的工作单元。另一个例子是1-生产者与1-消费者的并发;或许多生产者和1-消费者;读者和作家;等
“并行”是指同时做相同的事情。它是并发的,但更重要的是,它是在同一时间发生的相同行为,最典型的是在不同的数据上。矩阵代数通常可以并行化,因为您有重复运行的相同操作:例如,可以使用相同的行为(和)在不同的列上同时计算矩阵的列和。在可用的处理器核之间划分(拆分)列是一种常见的策略,这样每个处理器核处理的工作量(列数)就接近相同。另一种拆分工作的方法是一袋一袋的任务,完成工作的员工会回到经理那里,经理会将工作分配出去,并动态地分配更多的工作,直到所有工作都完成。票务算法是另一种。
不仅仅是数字代码可以并行化。文件太频繁可以并行处理。在自然语言处理应用程序中,对于数百万个文档文件中的每一个,您可能需要计算文档中标记的数量。这是并行的,因为您正在计算每个文件的令牌,这是相同的行为。
换句话说,并行是指同时执行相同的行为。并发意味着同时,但不一定是相同的行为。并行是一种特殊类型的并发,在同一时间发生相同的事情。
例如,术语将包括原子指令、关键部分、互斥、旋转等待、信号量、监视器、屏障、消息传递、map reduce、心跳、铃声、票务算法、线程、MPI、OpenMP。
格雷戈里·安德鲁斯(Gregory Andrews)的著作是关于多线程、并行和分布式编程的顶级教科书。
并行编程执行有两种类型:非并行并行编程和并行并行编程(也称为并行)。
关键的区别在于,在人类看来,非并行并发中的线程似乎同时运行,但实际上它们并不运行。在非并行并发中,线程通过时间切片快速切换并轮流使用处理器。虽然并行有多个处理器可用,但多个线程可以同时在不同的处理器上运行。
参考文献:编程语言中的并发简介