「并行」和「并发」
从中文字面上还是挺难区分「并行」和「并发」的,两者都带着一个「并」,似乎是个同义词。而在计算机科学中,「并行」和「并发」完全是两个不同的概念。两者并非互斥,也有相关联,但含义绝不可混淆。
英文辨析
「并行」的英文是 parallel
,「并发」的英文是 concurrent
。有意思的是,台湾将前者翻译成「平行」,后者翻译成「并行」。可见中文翻译基本是词不达意的。要区分两者还需从英文原文着手。
Parallel
parallel
的中文直译为「平行」。英文解释为:
(of lines, planes, surfaces, or objects) side by side and having the same distance continuously between them.
parallel
强调的是 side by side
,本意是个空间概念,在计算机科学中借用了这个词,引申并赋予了时间上的含义。
Concurrent
concurrent
,即 con-current
,是个合成词,其中 con-
是拉丁语前缀,表示with、together,中文意思是「共同」、「一起」、「互相」;而 current
则表示「当前」、「现在」。英文解释为:
existing, happening, or done at the same time.
concurrent
的中文直译为「同时」,是个时间概念。而台湾将其翻译成「并行」似乎也没什么问题。
计算机科学中的含义
很多开发者经常将「并发计算」和「并行计算」两者混淆。他们虽然有相似之处,但是使用的场景并不相同。
Parallel computing
「并行计算」的同时性是物理上的,是指系统拥有多个计算单元,比如:多内核、多CPU、多主机,而多个计算单元可以同时运行不同的任务。和「并行计算」相对应的是「串行计算」。
并行计算中,有时任务会被分解成多个可以独立处理的子任务,并在完成后合并得到最终结果。所以 MapReduce 也属于并行计算的范畴。
Concurrent computing
「并发计算」的同时性是逻辑上的。「并发计算」使用「时间片」技术实现「虚拟并行计算」。它可以是并行的,也可以是非并行的。
使用协程、线程、进程都可以实现「并发计算」,而并不需要多个CPU内核。
总结
「并行」和「并发」都有同时运行任务的意思,但是两者侧重点不同。前者表示多个计算单元同时执行任务,后者表示任务被设计成可以交替执行。
此外,两者「同时」的含义也不同。「同时」是个比较泛泛的概念,可以指「同一时间点」,也可以指「同一时间段」。比如「他上学期同时加入棒球社和足球社」。这里的「同时」并非说「他」有分身之术,可以同时出现在棒球场和足球场,而是指在「上学期」这个时间段内,他既打棒球,又踢足球。「并发」定义里的「同时」也差不多是这个意思。
举个例子,假设我需要吃完100碗面条,对于「并发计算」来说,在只有一个人吃面的情况下,如果并发数是10,那么吃面人可以挑出10碗面,每碗吃一口,轮流着吃。这样过了一段时间,看起来10碗面都减少了,就好像10碗面同时在被吃一样。当然也可以再安排几个人一起吃,不过这并不是重点,重点在于吃法。一口一口吃面相当于时间片(timeslice),吃一口换一碗面相当于上下文切换(context switch)。而对于「并行计算」来说,那就至少安排两个吃面人,他们可以每碗轮流吃一口,也可以专心致志吃其中一碗面,甚至还可以安排三个吃面人,一个人专门负责吃浇头、一个人专门负责喝汤、一个人专门负责吃面。重点在于有多个人在吃,而吃面的方式并不重要。