简明理解
举个栗子
- 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
- 你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
- 你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。
总结
- 并发的关键是你有处理多个任务的能力,不一定要同时。
- 并行的关键是你有同时处理多个任务的能力。
- 所以它们最关键的点就是:是否是『同时』。
概念解释
顾名思义,「并发」强调的是可以一起「出『发』」,「并行」强调的是可以一起「执『行』」。
并发(concurrent)
与 顺序(sequential)
与可以一起出发的并发(concurrent)
相对的是不可以一起出发的顺序(sequential)
:
- 顺序:上一个开始执行的任务完成后,当前任务才能开始执行
- 并发:无论上一个开始执行的任务是否完成,当前任务都可以开始执行
也就是说,A B 顺序执行的话,A 一定会比 B 先完成,而并发执行则不一定。
并行(parallel)
与 串行(serial)
与可以一起执行的并行(parallel)
相对的是不可以一起执行的串行(serial)
:
- 串行:有一个任务执行单元,从物理上就只能一个任务、一个任务地执行
- 并行:有多个任务执行单元,从物理上就可以多个任务一起执行
也就是说,在任意时间点上,串行执行时必然只有一个任务在执行,而并行则不一定。
总结
综上,并发
与并行
并不是互斥的概念,只是前者关注的是任务的抽象调度、后者关注的是任务的实际执行。而它们又是相关的,比如并行一定会允许并发。
所以题目中的例子:
- 单核 CPU 多任务:并发(不必等上一个任务完成才开始下一个任务)、串行(只有一个实际执行任务的 CPU 核)
- 多线程:并发、串行(所有线程都在同一个核上执行);并发、并行(不同线程在不同的核上执行)