Concurrency vs Parallelism

February 20, 2008 – 11:18 pm

dining_philosophers.png一直对 Concurrency 的理解不是很清楚,很多相关的概念也就搞不清楚了。依稀地记得在哪里看到“并发(Concurrency)”和“并行(Parallelism)”并不是同一个概念,今天搜索了一下,发现果然是这样的。

如果对多个进程来讲,并行就是指他们真正意义上地同时执行,这只有在多核的机器上或者是在分布式的环境下才能实现。而并发则更宽泛一些,并发的进程可能是并行的,也可能不是。简单地说,如果有两个进程 P1 和 P2 是并发的,那么会有如下的一些可能的情况:

  • P1 先于 P2 执行。
  • P2 先于 P1 执行。
  • P1 和 P2 同时执行(Parallelism)。
  • P1 和 P2 交替地执行。
  • ……

例如,在现代操作系统中的多任务,我们同时打开浏览器、邮件阅读器、文件管理器、编辑器和音乐播放器之类的程序,他们看起来好像是在同时执行,但是如果只是在单核的 PC 机上,某一个时间段内其实只有一个程序在运行,只是操作系统在各个程序之间进行快速地切换,造成了“并行”的错觉。

虽然在单核情况下的并行和真正的并发有着本质上的不同,但是它们需要考虑的问题其实差不多的。例如上图中的哲学家吃饭问题,在真正并行的情况下,有可能有数个哲学家同时(拿起叉子【显然换成中国的筷子更能说明问题,可以只拿一个叉子吃饭,但是筷子却总是需要一双,以下就假设那是筷子好了】)吃饭,但是资源(筷子)是共享的,而且显然是不够 5 个人同时使用的,麻烦事就在这里出来了。

再考虑并发的情况,当然并发包括了并行的情况,所以也有可能有几个哲学家同时吃饭。那么除去并行的情况又如何呢?假设这 5 个哲学家都是机器人,他们需要电源才能运动,然而插座只有一个。看起来问题似乎是简化了,因为插座只有一个,一个时候只能有一个哲学家在动,但是情况并没有改善多少,离批处理的情况还差得很远。极端的情况(批处理)就是一个哲学家吃饭,知道吃饱为止,再放下筷子,然后是另一个哲学家吃,依次下去。但是更容易碰到的情况是:一个哲学家吃到一半(筷子还拿在手里呢),他的插头被拔掉了,然后另一个哲学家开始吃,这样筷子又成了需要特殊处理的共享资源了。

可以看到,即使抛开并行的情况不看,并发的模型也没有因此而简单多少。而我们针对并发做出来的编程模型对两种情况同样适用。现在这方面也越来越受到关注,将来的趋势会走向何方呢? :)

Post a Comment