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


当前回答

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

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

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

其他回答

并发编程关注的是看似重叠的操作,主要关注的是由于非确定性控制流而产生的复杂性。与并发程序相关的定量成本通常是吞吐量和延迟。并发程序通常受IO限制,但并不总是如此,例如并发垃圾收集器完全在CPU上。并发程序的教学示例是网络爬虫。该程序启动对网页的请求,并在下载结果可用时同时接受响应,从而累积一组已访问的网页。控制流是非确定性的,因为每次运行程序时,响应不一定以相同的顺序接收。这种特性会使调试并发程序变得非常困难。有些应用程序基本上是并发的,例如web服务器必须同时处理客户端连接。Erlang可能是未来最有前途的高度并发编程语言。并行编程涉及为提高吞吐量的特定目标而重叠的操作。通过使控制流具有确定性,避免了并发编程的困难。通常,程序生成并行运行的子任务集,父任务仅在每个子任务完成后才继续。这使得并行程序更容易调试。并行编程的难点是针对粒度和通信等问题的性能优化。后者在多核环境中仍然是一个问题,因为将数据从一个缓存传输到另一个缓存会产生相当大的成本。密集矩阵矩阵乘法是并行编程的一个教学示例,它可以通过使用Straasen的分治算法和并行攻击子问题来有效地解决。Cilk可能是共享内存计算机(包括多核)上最有前途的高性能并行编程语言。

从我的回答中复制:https://stackoverflow.com/a/3982782

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

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

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

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

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

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--------->

因此,出于我们的目的,并行可以被认为是并发的一种特殊情况

来源:此处的另一个答案

希望这会有所帮助。

要补充其他人所说的话:

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