原文链接:Concurrency != Parallelism

以下为翻译,原文有简单明了的示意图,文中略。


我很享受听 Carl Hewitt 谈论计算机,他经常重复的一句话是“并发不是并行”(concurrency is not parallelism)。对我来说,这没有真正的区别,老实说,我也从来没有费心去钻研。

上周我偶尔发现了 Rob Pike 关于这个主题的演讲

但当人们听到「并发」这个词的时候,他们常常会想到「并行」,一个相关但却非常不同的概念。在编程中,并发是独立运行的进程的组合,而并行是(可能相关的)计算的同时执行。并发是指同时“处理”很多事情,并行是指同时“做”很多事情。

这使我终于对这个做了点研究,以下是我的发现。

注意:和生活中大多数事情一样,很多人认为两者之间没有真正的区别。

并发

并发就是在同一时间间隔内执行任务。此处重要的细节是这些任务不一定同时执行,但他们可以被划分为可交错执行的(interleaved)更小的任务。

厨房是一个并发发生的好例子。想象一个厨师一边切生菜的同时,时不时检查烤箱里的东西。他得停止切菜去检查烤箱,检查完烤箱才能重新开始切菜,如此重复直到完成。

如你所见,并发主要是关于“调配任务”。没有并发,厨师必须等到烤箱里的肉好了才能切生菜。

并行

另一方面,并行就是指“同时执行“任务,顾名思义任务是平行执行的。

还是以厨房为例,现在我们有两个厨师,一个可以照料烤箱,同时另一个切生菜。我们可以分配工作,代价是得有另一个厨师。

并行是并发的子集:在你能同时执行多个任务之前,你首先得管理多个任务。


其实这两个概念在一般的编程工作中也不太会涉及到。了解两者的区别,对我们的生活有些什么帮助?我倒是想起了公开课 Learning How to Learn 里关于 Multitasking 和 Interleaving 的内容:

大家普遍认为 Multitaksing 是同时执行不止一项任务(并行),比如手上捧着书在读,耳机里还放着英语听力。然而要一心多用其实很难,需要专门的训练,而且效果未必好。Multitasking 应该注重的是 Context Switching(并发)。

课程里还介绍了 Interleaving

The best way to learn that is by practicing jumping back and forth between problems or situations that require different techniques or strategies. This is called interleaving.

最好的学习方法是练习在需要不同技巧或策略的问题或情境之间来回跳跃,这称为交错

以上说的是在学习过程中同一主题下不同场景的切换(并发),我认为在不同主题之间的切换(并发)可能也会有帮助。