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


当前回答

通过查阅字典,你可以看到并发(来自拉丁语)意味着一起运行、聚合、同意;因此,需要同步,因为在相同的资源上存在竞争。平行(来自希腊语)的意思是在侧面复制;从而在同一时间做同样的事情。

其他回答

并发是指两个或多个任务可以在重叠的时间段内启动、运行和完成。这并不一定意味着它们会同时运行。例如,在单核机器上进行多任务处理。

并行性是指任务实际上同时运行,例如在多核处理器上。


引用Sun的多线程编程指南:

并发:至少有两个线程正在进行时存在的条件。一种更为普遍的并行形式,可以将时间切片作为虚拟并行的一种形式。并行性:当至少两个线程同时执行时出现的情况。

我喜欢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的计算机上运行这个程序,那么我们就可以同时并行运行两个线程。

“并发”是指同时做任何事情。它们可能是不同的东西,也可能是相同的东西。尽管缺乏公认的答案,但这并不是关于“看起来是在同一时间”,而是真的在同一个时间。您需要多个CPU内核,或者在一个主机内使用共享内存,或者在不同主机上使用分布式内存,以运行并发代码。例如,同时并发运行的3个不同任务的流水线:Task-level-2必须等待Task-level-1完成的单元,而Task-level-3必须等待Task-level-2完成的工作单元。另一个例子是1-生产者与1-消费者的并发;或许多生产者和1-消费者;读者和作家;等

“并行”是指同时做相同的事情。它是并发的,但更重要的是,它是在同一时间发生的相同行为,最典型的是在不同的数据上。矩阵代数通常可以并行化,因为您有重复运行的相同操作:例如,可以使用相同的行为(和)在不同的列上同时计算矩阵的列和。在可用的处理器核之间划分(拆分)列是一种常见的策略,这样每个处理器核处理的工作量(列数)就接近相同。另一种拆分工作的方法是一袋一袋的任务,完成工作的员工会回到经理那里,经理会将工作分配出去,并动态地分配更多的工作,直到所有工作都完成。票务算法是另一种。

不仅仅是数字代码可以并行化。文件太频繁可以并行处理。在自然语言处理应用程序中,对于数百万个文档文件中的每一个,您可能需要计算文档中标记的数量。这是并行的,因为您正在计算每个文件的令牌,这是相同的行为。

换句话说,并行是指同时执行相同的行为。并发意味着同时,但不一定是相同的行为。并行是一种特殊类型的并发,在同一时间发生相同的事情。

例如,术语将包括原子指令、关键部分、互斥、旋转等待、信号量、监视器、屏障、消息传递、map reduce、心跳、铃声、票务算法、线程、MPI、OpenMP。

格雷戈里·安德鲁斯(Gregory Andrews)的著作是关于多线程、并行和分布式编程的顶级教科书。

并发与并行

Rob Pike在《并发不是并行性》中

并发是指同时处理许多事情。

并行是指同时做很多事情。

[并发理论]

并发-一次处理多个任务并行性-一次处理多个线程

我对并发性和并行性的看法

[同步与异步][Swift并发]