简明理解

举个栗子

  • 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
  • 你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
  • 你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

总结

  • 并发的关键是你有处理多个任务的能力,不一定要同时。
  • 并行的关键是你有同时处理多个任务的能力。
  • 所以它们最关键的点就是:是否是『同时』。

概念解释

顾名思义,「并发」强调的是可以一起「出『发』」,「并行」强调的是可以一起「执『行』」。

并发(concurrent)顺序(sequential)

与可以一起出发的并发(concurrent)相对的是不可以一起出发的顺序(sequential)

  • 顺序:上一个开始执行的任务完成后,当前任务才能开始执行
  • 并发:无论上一个开始执行的任务是否完成,当前任务都可以开始执行

也就是说,A B 顺序执行的话,A 一定会比 B 先完成,而并发执行则不一定。

并行(parallel)串行(serial)

与可以一起执行的并行(parallel)相对的是不可以一起执行的串行(serial)

  • 串行:有一个任务执行单元,从物理上就只能一个任务、一个任务地执行
  • 并行:有多个任务执行单元,从物理上就可以多个任务一起执行

也就是说,在任意时间点上,串行执行时必然只有一个任务在执行,而并行则不一定。

总结

综上,并发并行不是互斥的概念,只是前者关注的是任务的抽象调度、后者关注的是任务的实际执行。而它们又是相关的,比如并行一定会允许并发。

所以题目中的例子:

  • 单核 CPU 多任务:并发(不必等上一个任务完成才开始下一个任务)、串行(只有一个实际执行任务的 CPU 核)
  • 多线程:并发、串行(所有线程都在同一个核上执行);并发、并行(不同线程在不同的核上执行)