并发和并行之间的区别是什么?
当前回答
我认为在这个问题上有两种不同的观点导致了混淆:程序员的观点(并发/并行编程)与计算机/操作系统的观点(并行/并行执行)。
这里回答了计算机的观点。
程序员的观点:
并发编程:程序员编写代码时知道代码将由多个线程执行,无论出于何种原因。原因可能是:在等待I/O时更好地利用CPU,通过不同线程处理Web请求,通过在独立于主线程的线程中运行计算,运行周期性后台任务,使GUI做出响应。程序员必须应用互斥构造、锁定/解锁、等待条件/信号、处理死锁等。多个线程可以在单个处理器/内核上运行(从计算机的角度来看是并发的),也可以在多个内核上运行。
并行编程:程序员知道程序将在具有多个处理器/内核的计算机上运行,并希望利用多个内核。程序员将CPU密集型计算划分为多个子任务,在一个线程中运行每个子任务,一旦线程完成,其结果将合并为总结果(分而治之)。例如,将一些矩阵处理代码划分为并行处理矩阵部分的任务。每个核心将使用子任务执行一个线程(如果线程数大于内核数,则同时执行多个线程)。程序员也必须在这里应用并发的编程构造,但她也关注将任务划分为子任务并合并结果。例如,在Java中,程序员可以使用ParallelStreams来分割数据并自动合并结果。如果程序员知道程序将在单核处理器上执行,那么将CPU密集型任务拆分为多个线程是没有好处的。摘自Doug Leah的《Java并发编程:设计原则和模式》,1999年第2版,第343页:
并行程序专门设计为利用多个CPU来解决计算密集型问题。
其他回答
这篇惊人的博客节选:
并发和并行之间的区别:并发是指两个任务可以在重叠的时间段。并行性是指任务在例如在多核处理器上。并发是独立执行进程的组成,而并行是同时执行(可能相关)计算。并发是指同时处理许多事情。相似一次做很多事情。应用程序可以是并发的,但不能是并行的,这意味着它同时处理多个任务,但没有两个任务在同一时刻执行。应用程序可以是并行的,但不能是并发的,这意味着它在多核CPU中同时处理一个任务的多个子任务时间应用程序既不能并行,也不能并发,这意味着它一次一个地、顺序地处理所有任务。应用程序既可以是并行的,也可以是并发的,这意味着它在多核CPU中同时处理多个任务时间
同意:具有共享资源潜力的多个执行流
前任:两个线程竞争I/O端口。
视差:将问题分成多个相似的块。
前任:通过对文件的每一半运行两个进程来解析大文件。
假设你有一个有两个线程的程序。程序可以通过两种方式运行:
Concurrency Concurrency + parallelism
(Single-Core CPU) (Multi-Core CPU)
___ ___ ___
|th1| |th1|th2|
| | | |___|
|___|___ | |___
|th2| |___|th2|
___|___| ___|___|
|th1| |th1|
|___|___ | |___
|th2| | |th2|
在这两种情况下,我们都有并发性,这仅仅是因为我们有多个线程在运行。
如果我们在具有单个CPU内核的计算机上运行此程序,操作系统将在两个线程之间切换,允许一次运行一个线程。
如果我们在带有多核CPU的计算机上运行这个程序,那么我们就可以同时并行运行两个线程。
通过查阅字典,你可以看到并发(来自拉丁语)意味着一起运行、聚合、同意;因此,需要同步,因为在相同的资源上存在竞争。平行(来自希腊语)的意思是在侧面复制;从而在同一时间做同样的事情。
我认为在这个问题上有两种不同的观点导致了混淆:程序员的观点(并发/并行编程)与计算机/操作系统的观点(并行/并行执行)。
这里回答了计算机的观点。
程序员的观点:
并发编程:程序员编写代码时知道代码将由多个线程执行,无论出于何种原因。原因可能是:在等待I/O时更好地利用CPU,通过不同线程处理Web请求,通过在独立于主线程的线程中运行计算,运行周期性后台任务,使GUI做出响应。程序员必须应用互斥构造、锁定/解锁、等待条件/信号、处理死锁等。多个线程可以在单个处理器/内核上运行(从计算机的角度来看是并发的),也可以在多个内核上运行。
并行编程:程序员知道程序将在具有多个处理器/内核的计算机上运行,并希望利用多个内核。程序员将CPU密集型计算划分为多个子任务,在一个线程中运行每个子任务,一旦线程完成,其结果将合并为总结果(分而治之)。例如,将一些矩阵处理代码划分为并行处理矩阵部分的任务。每个核心将使用子任务执行一个线程(如果线程数大于内核数,则同时执行多个线程)。程序员也必须在这里应用并发的编程构造,但她也关注将任务划分为子任务并合并结果。例如,在Java中,程序员可以使用ParallelStreams来分割数据并自动合并结果。如果程序员知道程序将在单核处理器上执行,那么将CPU密集型任务拆分为多个线程是没有好处的。摘自Doug Leah的《Java并发编程:设计原则和模式》,1999年第2版,第343页:
并行程序专门设计为利用多个CPU来解决计算密集型问题。
推荐文章
- 什么是ORM,它是如何工作的,我应该如何使用它?
- 我能在服务器端应用程序(PHP、Ruby、Python等)上读取URL的哈希部分吗?
- 多少个参数是太多?
- 对于不可变集合上的非突变“add”方法,最好的名称是什么?
- foo到底是什么意思?
- foreach和map有区别吗?
- 设计模式:工厂vs工厂方法vs抽象工厂
- 为什么处理排序数组比未排序数组慢?
- 构造函数何时抛出异常是正确的?
- Thread start()和Runnable run()有什么区别
- 什么是“一级”对象?
- 什么时候应该使用Debug.Assert()?
- 为什么浮点数不准确?
- IOException:进程不能访问文件“文件路径”,因为它正在被另一个进程使用
- 地图和字典的区别是什么?