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


当前回答

我真的很喜欢这个来自另一个答案的图形表示——我认为它比上面的许多答案更好地回答了这个问题

并行与并发当两个线程并行运行时,它们都同时运行。例如,如果我们有两个线程A和B,那么它们的并行执行将如下所示:

CPU 1:A------------------------>

CPU 2:B------------------------->

当两个线程同时运行时,它们的执行会重叠。重叠可以通过以下两种方式之一发生:线程同时执行(即并行执行,如上所述),或者它们的执行在处理器上交错执行,如下所示:

CPU 1:A---------->B---------->A---------->B--------->

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

来源:此处的另一个答案

希望这会有所帮助。

其他回答

我真的很喜欢这个来自另一个答案的图形表示——我认为它比上面的许多答案更好地回答了这个问题

并行与并发当两个线程并行运行时,它们都同时运行。例如,如果我们有两个线程A和B,那么它们的并行执行将如下所示:

CPU 1:A------------------------>

CPU 2:B------------------------->

当两个线程同时运行时,它们的执行会重叠。重叠可以通过以下两种方式之一发生:线程同时执行(即并行执行,如上所述),或者它们的执行在处理器上交错执行,如下所示:

CPU 1:A---------->B---------->A---------->B--------->

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

来源:此处的另一个答案

希望这会有所帮助。

它们解决不同的问题。并发性解决了CPU资源稀缺和任务多的问题。因此,您可以通过代码创建线程或独立的执行路径,以便在稀缺资源上共享时间。直到最近,由于CPU的可用性,并发性一直是讨论的焦点。

并行性解决了找到足够的任务和适当的任务(可以正确分割的任务)并将它们分配到大量的CPU资源上的问题。当然,并行性一直都存在,但由于多核处理器非常便宜,所以它正走到最前沿。

只是为了给其他好答案添加更多的澄清:

基于处理的抽象(CPU作为一个完全可以想象的例子)能够在同一时刻运行唯一的任务的前提,

并发是一个关于处理抽象的故事:它可以在不同的任务之间切换。

并行是一个关于我们有多个处理抽象的故事(例如,我们的CPU有多个内核)。因此,这是我们的系统能够同时执行多个任务的原因(字面意思)。但这里没有提到处理的特定抽象(它们是否并发)。

这里的重点是这些故事的内容。

因此,当您阅读公认答案时,请注意:

并发是指两个或多个任务可以在重叠的时间段。

严格地说,我们可以根据这个定义得出结论,并行性本身就是并发性的前提。

我认为在这个问题上有两种不同的观点导致了混淆:程序员的观点(并发/并行编程)与计算机/操作系统的观点(并行/并行执行)。

这里回答了计算机的观点。

程序员的观点:

并发编程:程序员编写代码时知道代码将由多个线程执行,无论出于何种原因。原因可能是:在等待I/O时更好地利用CPU,通过不同线程处理Web请求,通过在独立于主线程的线程中运行计算,运行周期性后台任务,使GUI做出响应。程序员必须应用互斥构造、锁定/解锁、等待条件/信号、处理死锁等。多个线程可以在单个处理器/内核上运行(从计算机的角度来看是并发的),也可以在多个内核上运行。

并行编程:程序员知道程序将在具有多个处理器/内核的计算机上运行,并希望利用多个内核。程序员将CPU密集型计算划分为多个子任务,在一个线程中运行每个子任务,一旦线程完成,其结果将合并为总结果(分而治之)。例如,将一些矩阵处理代码划分为并行处理矩阵部分的任务。每个核心将使用子任务执行一个线程(如果线程数大于内核数,则同时执行多个线程)。程序员也必须在这里应用并发的编程构造,但她也关注将任务划分为子任务并合并结果。例如,在Java中,程序员可以使用ParallelStreams来分割数据并自动合并结果。如果程序员知道程序将在单核处理器上执行,那么将CPU密集型任务拆分为多个线程是没有好处的。摘自Doug Leah的《Java并发编程:设计原则和模式》,1999年第2版,第343页:

并行程序专门设计为利用多个CPU来解决计算密集型问题。

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

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


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

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