文章

区分“并发”(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 进行授权