Erlang 发明者 Joe Armstrong 在他的一篇博文中提到并发和并行的区别:
Concurrent = Two queues and one coffee machine.
Parallel = Two queues and two coffee machines.
并发是两个等待队列中的人同时去竞争一台咖啡机,谁先竞争到咖啡机谁使用;而并行是每个队列拥有自己的咖啡机,两个队列之间没有竞争的关系。因此,并发意味着多个执行实体(人)需要竞争资源(咖啡机),因此就不可避免带来竞争和同步的问题;而并行则是不同的执行实体拥有各自的资源,相互之间互不干扰。
ORACLE 在 Multithreaded Programming Guide(原文链接)中对并发和并行定义如下:
Concurrency | A condition that exists when at least two threads are making progress. A more generalized form of parallelism that can include time-slicing as a form of virtual parallelism. |
Parallelism | A condition that arises when at least two threads are executing simultaneously. |
Rob Pike 在 Concurrency is not parallelism 中提到
Concurrency is about dealing with lots of things at once.
Parallelism is about doing lots of things at once.
两者不一样,但是有关联。
Concurrency is about structure, parallelism is about execution.
Concurrency provides a way to structure a solution to solve a problem that may (but not necessarily) be parallelizable.
并发关乎结构,并行关乎执行。并发提供了一种方式让我们能够设计一种方案将问题(非必须的)并行的解决。
计算机在不同层次上都使用了并行技术
- 位级并行(Bit-level parallelism):基于处理器的字长,32位的CPU能在同一时间内处理字长为32位的二进制数据
- 指令级并行(Instruction-Level Parallelism):计算机处理问题是通过指令实现的。当指令之间不存在相关时,它们在流水线中是可以重叠起来并行执行
- 数据级并行(Data parallelism):单指令流多数据流(SIMD)是一种实现数据级并行的技术。SIMD结构的CPU有多个执行部件,但都在同一个指令部件的控制之下,中央控制器向各个处理单元发送指令,所有的计算都是同步的。以加法指令为例进行说明:单指令流单数据流(SISD)型CPU对加法指令译码后,执行部件先访问主存,取得第一个操作数,之后再一次访问主存,取得第二个操作数,随后才能进行求和运算;而在SIMD型CPU中,指令译码后,几个执行部件同时访问主存,一次性获得所有操作数进行运算。
- 任务并行(Task parallelism):在这个模型中,每一个线程执行一个分配到的任务,而这些线程则被分配(通常是操作系统内核)到该并行计算体系的各个计算节点中去。
并发是逻辑上的同时发生,并行是物理上的同时发生。