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


当前回答

如果你想向一个9岁的孩子解释这一点。

其他回答

要补充其他人所说的话:

并发性就像让一个玩杂耍的人玩多个球。不管看起来如何,玩杂耍的人每次只手抓/扔一个球。平行运动是让多个杂耍者同时变戏法。

并行性是每个CPU或多个CPU(在单个主板上)在多个内核上同时执行进程。

并发是指通过使用划分CPU时间(时间片)的调度算法在单个内核/CPU上实现并行性。进程是交错的。

单位:单个CPU中有1个或多个内核(几乎所有现代处理器)主板上有1个或多个CPU(想想老式服务器)一个应用程序就是一个程序(想想Chrome浏览器)一个程序可以有一个或多个进程(认为每个Chrome浏览器选项卡都是一个进程)一个进程可以有一个程序中的一个或多个线程(Chrome选项卡在一个线程中播放Youtube视频,另一个线程生成评论部分,另一个用于用户登录信息)因此,一个程序可以有一个或多个执行线程1个进程是线程+OS分配的内存资源(堆、寄存器、堆栈、类内存)

并发:如果一个处理器解决了两个或多个问题。

并行性:如果一个问题由多个处理器解决。

假设你有一个有两个线程的程序。程序可以通过两种方式运行:

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)的著作是关于多线程、并行和分布式编程的顶级教科书。