并发与并行

参考了一些资料,摘录汇总并发(concurrency)和并行(parallelism)的联系和区别。


并发是同一时间处理(dealing with)多件事情的能力;并行是同一时间执行(doing)多件事情的能力。

并发指能够让多个任务逻辑交叉执行程序设计,并行指物理同时执行。

并发是问题域中的概念——程序要被设计成能够处理多个同时(或者几乎同时)发生的事件;并行则是方法域中的概念——通过将问题的多个部分并行执行,来加速解决问题。

严格来说,并行并不是并发的子集。人们通常认为并行等同于多核,但现代计算机在不同层次上都使用了并行技术。比如说,单核的运行速度现今仍能不断提升的原因是:单核包含的晶体管数量,如同摩尔定律预测的那样变得越来越多,而单核在位级和指令级两个层次上都能够并行地使用这些晶体管资源。并行架构包括:位级并行、指令级并行、数据级并行、任务级并行(大家通常认为的并行形式——多处理器)。在任务级并行这层中,并行是并发的子集。因为位级和指令级上的并行并不属于并发,处理的是同一个任务,并不存在多个任务,也就根本没有并发。

并发设计让并发执行成为可能,而并行是并发执行的一种模式。并发指的是程序的“结构”。当我们说这个程序是并发的,实际上,这句话应当表述成“这个程序采用了支持并发的设计”。正确的并发设计的标准是:使多个操作可以在重叠的时间段内进行(two tasks can start, run, and complete in overlapping time periods)。并发并不描述程序执行的状态,它描述的是一种设计,是程序的结构,比如“为每个任务开一个线程”的设计。并发设计和程序实际执行情况没有直接关联,但是正确的并发设计让并发执行成为可能。反之,如果程序被设计为执行完一个任务再接着执行下一个,那就不是并发设计了,因为做不到并发执行。

参考资料:

  1. Rob Pike’s talk:Concurrency Is Not Parallelism video slides
  2. 还在疑惑并发和并行?
  3. 《七周七并发模型》第一章
  4. 并发与并行的区别?