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


当前回答

并发是并行的广义形式。例如,并行程序也可以称为并发程序,但反向不成立。

可以在单个处理器上并发执行(多个线程,由调度器或线程池管理)在单个处理器上无法并行执行,但在多个处理器上无法。(每个处理器一个进程)分布式计算也是一个相关的主题,它也可以被称为并发计算,但反过来却不是,就像并行一样。

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

其他回答

同意:具有共享资源潜力的多个执行流

前任:两个线程竞争I/O端口。

视差:将问题分成多个相似的块。

前任:通过对文件的每一半运行两个进程来解析大文件。

派克的“并发”概念是一个有意的设计和实现决策。具有并发能力的程序设计可能表现出行为上的“并行性”;这取决于运行时环境。

你不希望一个不是为并发而设计的程序表现出并行性。:-)但就相关因素(功耗、性能等)而言,这是一个净收益,您需要最大程度的并发设计,以便主机系统可以在可能的情况下并行执行。

派克的Go编程语言将这一点发挥到了极致:他的函数都是可以同时正确运行的线程,也就是说,如果系统有能力,调用函数总是会创建一个与调用者并行运行的线程。一个拥有数百甚至数千个线程的应用程序在他的世界中是非常普通的。(我不是围棋专家,这只是我的看法。)

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

这个来源的解释对我很有帮助:

并发性与应用程序如何处理多个任务有关一个应用程序可以一次处理一个任务(按顺序)或同时处理多个任务(同时)。另一方面,并行性与应用程序处理每个单独的任务。应用程序可以处理该任务从开始到结束依次执行,或将任务拆分为子任务可以并行完成。正如您所看到的,应用程序可以是并发的,但不能是并行的。这意味着它同时处理多个任务,但是这些任务不分解为子任务。应用程序也可以是并行的,但不能是并发的。这意味着应用程序一次只能处理一个任务,而此任务被分解为可以并行处理的子任务。此外,应用程序既不能是并发的,也不能是并行的。这意味着它一次只能处理一个任务从未分解为并行执行的子任务。最后,应用程序也可以是并发和并行的,在它可以同时处理多个任务,也可以中断将每个任务分解为子任务以并行执行。然而并发性和并行性的好处可能会因此而丧失由于计算机中的CPU已经处于相当繁忙的状态仅具有并发性或并行性。结合起来可能会导致只有很小的性能增益或甚至性能损失。

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

Concurrency                 Concurrency + parallelism
(Single-Core CPU)           (Multi-Core CPU)
 ___                         ___ ___
|th1|                       |th1|th2|
|   |                       |   |___|
|___|___                    |   |___
    |th2|                   |___|th2|
 ___|___|                    ___|___|
|th1|                       |th1|
|___|___                    |   |___
    |th2|                   |   |th2|

在这两种情况下,我们都有并发性,这仅仅是因为我们有多个线程在运行。

如果我们在具有单个CPU内核的计算机上运行此程序,操作系统将在两个线程之间切换,允许一次运行一个线程。

如果我们在带有多核CPU的计算机上运行这个程序,那么我们就可以同时并行运行两个线程。