并发与并行的区别是什么?

在网上看到说并发是多个任务交替使用CPU,同一时刻还是只有一个任务在跑,并行是多个任务同时跑。。。但是,多线程叫做并发,多线程程序在多核CPU上面,在…
关注者
1,355
被浏览
1,085,597

154 个回答

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

你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。

你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

并发的关键是你有处理多个任务的能力,不一定要同时。

并行的关键是你有同时处理多个任务的能力。

所以我认为它们最关键的点就是:是否是『同时』。

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

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

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

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

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

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

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

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

所以题目中的例子:

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