区分“并发”(Concurrency)和“并行”(Parallelism)
区分“并发”(Concurrency)和“并行”(Parallelism)
区分“并发”(Concurrency)和“并行”(Parallelism)是计算机科学中最常见的问题之一。最一针见血的区分方法是记住这句话:
并发是“应对”(Dealing with)多件事情的能力;并行是“同时做”(Doing)多件事情的能力。
为了让你更容易理解,我们可以从以下几个维度来进行详细区分:
1. 经典的“咖啡机比喻”
Erlang 语言之父 Joe Armstrong 曾画过一张非常经典的图来解释两者的区别:
- 并发 (Concurrency): 两队人排队,共用一台咖啡机。
- 大家交替着使用咖啡机,虽然两队人的任务都在向前推进,但在任何一个确切的瞬间,只有一个人在接咖啡。
- 并行 (Parallelism): 两队人排队,拥有两台咖啡机。
- 两队人各用各的咖啡机,在同一个瞬间,有两个人正在同时接咖啡。
2. 核心概念的对比
| 维度 | 并发 (Concurrency) | 并行 (Parallelism) |
|---|---|---|
| 时间维度 | 同一时间段内发生(例如在1秒内交替完成了3件事) | 同一时刻发生(例如在第0.1秒,3件事同时在做) |
| 微观状态 | 任务是交替执行的(Context Switch,上下文切换) | 任务是同时执行的 |
| 硬件要求 | 单核 CPU 就可以实现并发 | 必须有 多核 CPU 或多台物理设备 |
| 侧重点 | 程序的结构设计和任务调度(如何把大任务拆分成小任务交替处理) | 程序的物理执行(如何分配给不同的处理核心去加速计算) |
3. 具体场景举例
场景一:一个人做家务(并发) 你在厨房里做饭,先切菜,然后把水烧上。在等水烧开的5分钟里,你没有闲着,而是去客厅扫了地,然后又跑回厨房把菜下锅。
- 分析:你只有一个“大脑/身体”(单核),但你通过在不同任务之间快速切换,在半小时(同一时间段)内完成了切菜、烧水、扫地三个任务。这就是并发。
场景二:两个人做家务(并行) 你在厨房切菜做饭,你的一位家人在客厅扫地。
- 分析:你们有两个“身体”(多核),在下午6点05分这个同一时刻,做饭和扫地这两件事在物理上同时发生。这就是并行。
4. 它们之间的关系
- 并发是一种更宽泛的概念:并发强调的是程序被设计成能够处理多个独立的任务。一个支持并发的程序,如果跑在单核CPU上,它就是纯并发(交替执行);如果跑在多核CPU上,它就可以利用多核被并行执行。
- 并行是并发的子集/实现方式之一:并行需要硬件支持。没有多核硬件,就谈不上真正的并行;但即使没有多核硬件,我们依然可以通过时间片轮转(Time-slicing)来实现并发。
总结
- 如果你在讨论程序的逻辑结构,说“系统能同时处理上万个用户的请求”,这通常指的是并发。
- 如果你在讨论底层的计算加速,说“利用显卡的数千个核心来加速AI模型训练”,这通常指的是并行。
本文由作者按照 CC BY 4.0 进行授权