赞
踩
并发(Concurrent)与并行(Parallel)是一个大家比较容易混淆的概念。大家在解释并发与并行的时候一般这样说:
以上说法也是可以理解的,大家都是基于场景来描述的。为了搞清楚这个问题,我查阅了一些资料,发现这篇译文:并发不是并行,它更好中的图片很好的说明了并发与并行的区别。
网络上找到的定义如下:
并发(Concurrent):以可独立执行的进程集合的方式编程(进程是出了名的难定义,这里是通常意义上的进程,不是Linux进程)。
并行(Parallel):以可同时执行的(可能相关的)计算指令方式编程。
我的理解:
并发(Concurrent):是一种构造程序的方式,把任务分解为一个个独立运行的小任务。通信是协调这些小任务的手段。
并行(Parallel):以分组的方式,同时执行每一组并发任务。
两者的区别:并发是同时处理(dealing)很多的事情,并行是同时做(doing)很多的事情。
以上的讲解太抽象了,我们通过实例来讲解,举例如下:
我们的问题:把一堆废弃的说明书运到火炉里,一只地鼠会花费很长时间。
一只地鼠,使用一辆推车,将书装到车上,运输到火炉旁,将书卸到火炉。
有两只地鼠,一只地鼠,使用一辆推车,将书装到车上,运输到火炉旁,将书卸到火炉。另一只地鼠出于等待中,显然增加更多的地鼠是无法解决效率问题的,也需要同时增加推车。(当然有人说两只地鼠轮流使用一辆推车,这样可以让地鼠得到休息,这样它们干活更快,也可以提高效率。)
两只地鼠,两辆推车,分别使用各自的推车,将书装到车上,运输到火炉旁,将书卸到火炉。这样会提高运输效率,但它们会在装书和卸书时进行排队,降低了效率。
基于方案一的改进,将书堆拆分成两部分,同时增加一个火炉。该方案有两种可能:
1、只地鼠运一次上面那堆书,然后第二只地鼠再运一次下面那堆书。一次只允许一只地鼠运送,这样就不是并行的。
2、两只地鼠,两辆推车,分别使用各自的推车,把各自书堆的书装到车上,运输到各自的火炉旁,将书卸到火炉。这样提高了运输效率,而且在装书和卸书时不会进行排队,提高了装卸的效率。
三只地鼠在工作,一只负责把书装到车上,一只负责运输,一只负责把书卸到火炉。每只地鼠做一个独立的任务。
四只地鼠在工作,一只负责把书装到车上,一只负责运输,一只负责把书卸到火炉,一只负责运回空推车。每只地鼠做一个独立的任务。
观察结论:我们在一个已有的设计(指三个地鼠的那个设计)中添加一个并发的步骤(第四只地鼠)增强了系统的性能。更多的地鼠干了更多的活,系统运行得更好。并发比简单的并行对问题要有更深的洞察。
我们有四个并发的步骤:
- 1. 把书装到车上;
- 2. 把推车运到火炉旁;
- 3. 把书卸到火炉里;
- 4. 运回空推车。
不同的并发设计能以不同的方式来并行。
增加一个方案六的分组,使两个分组并行执行。
两只地鼠,再加上一个中转堆。这也是一种用并发来解决问题的方案。
增加一个方案八的分组,使两个分组并行执行。
在多地鼠并发模型中引入中转堆
增加一个方案十的分组,使两个分组并行执行。
我们有很多方法把问题分解,这才是并发设计。一旦我们分解了问题,并行就自然而然的产生了。
回到两者的区别这个问题上:
并发是同时处理(dealing)很多的事情,如方案六,同时处理一下四个并发步骤:
- 1. 把书装到车上;
- 2. 把推车运到火炉旁;
- 3. 把书卸到火炉里;
- 4. 运回空推车。
并行是同时做(doing)很多的事情,如方案十一,分为两组同时执行任务。这就是我对并发与并行的理解。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。