随着多核时代的来临,我们越来越多地听到“并发”(concurrent)、“并行”(parallel)这样的词汇
。然而这两个术语究竟的区别究竟在哪里,似乎大家并没有一致意见。
从汉语的角度讲,“并发”与“并行”似乎没有什么本质差别;至于从英语的角度
讲,"concurrent"和"parallel"有没有差别我就不太清楚了。但是,从计算机科学的角度看,这两个术语
还是有本质差别的。
在我看来,所谓“并发”,是指一个过程在 **逻辑上** 是由许多同时执行的线索组成的,但是在 **物理
上** 这些线索不一定是同时执行的。比如在单处理器机器上,我们的进程、线程只能并发,不能并行。至
于“并行”,则恰恰相反,是指一个过程在 **物理上** 包含了许多同时进行的工作,但是在 **逻辑上**
并不一定是包含许多同时执行的线索的。比如我们在大规模科学计算领域总是听到“将程序并行化”之类
的说法,就是因为认为这些算法在逻辑上是串行的,只是在实现的时候进行了并发优化。另外一个例子来
自教科书"Computer Architecture: a quantitative approach",它里面大量地叙述了如何开发“指令级
并行”和“线程级并行”,就是因为这些内容是针对在物理上同时处理指令的。
当然,一个系统也可以既是并发的又是并行的,例如在多处理器系统上面的多线程(或多进程)web服务器
就是这样。至此,我们发现“并发”和“并行”这两个极为接近的术语竟然含义是正交的,完全不相关!
在科学界,类似这样的例子还有不少,比如“精确”和“准确”这两个词,在《大学物理试验》课程中就
辨析过,前者是指标准差小,而后者指均值与真值接近,呵呵,又是正交的概念。