并行与并发的区别

  很多人不是特别明白并发编程和并行编程的区别所在,有很多人很容易搞混淆,觉得二者近似相等,本文将用几个浅显易懂的例子,来说明一下什么是并发和并行。

1、任务与多任务

       关于什么是进程,什么是线程,这里不打算多说,关于每一种开发语言的多线程处理技术语法上有所区别,原理很多类似,可以查阅相关的参考书。什么是任务呢?其实很简单,在我们生活中,比如我今天要学一首歌,要在操场上散步1000米,然后还要向老师电话汇报研究成果,这是今天的三个任务。在编程语言中,实现某一个任务的一般单元就是“函数”。

2、顺序执行

      上面三个任务,如果在一般的单线程执行的程序里面,分别定义三个函数,然后依次顺序执行,即执行完第一个在执行第二个,然后执行第三个,即我先把一首歌学会,然后在操场上散步1000米,然后再给老师汇报,这样做效率低下。

  我们可以有一个更加高效的办事方法,我在散步的时候,顺便打电话给老说汇报一下今天的成果,然后边散步边听歌,便跟着学,这样效果就高很多,这里的是“并行执行”。

3、并发和并行的一些理解——concurrency  and  parallellism

      并发和并行都是完成多任务更加有效率的方式,但还是有一些区别的,并发(concurrency),并行(parallellism),可见他们的确是有区别的。下面通过一些具体的例子进行说明。

  例子一:

  假设一个有三个学生需要辅导作业,帮每个学生辅导完作业是一个任务

  顺序执行:老师甲先帮学生A辅导,辅导完之后再取给B辅导,最后再去给C辅导,效率低下 ,很久才完成三个任务

  并发:老师甲先给学生A去讲思路,A听懂了自己书写过程并且检查,而甲老师在这期间直接去给B讲思路,讲完思路再去给C讲思路,让B自己整理步骤。这样老师就没有空着,一直在做事情,很快就完成了三个任务。与顺序执行不同的是,顺序执行,老师讲完思路之后学生在写步骤,这在这期间,老师是完全空着的,没做事的,所以效率低下。

  并行:直接让三个老师甲、乙、丙三个老师“同时”给三个学生辅导作业,也完成的很快。

  例子二:

  顺序执行:你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。

  并发:你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。

  并行:你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。此处注意理解:是同时吃,同时说,要真严格的说的话,需要2张嘴才是并行。

4、理解:

  (1)并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。

  (2)并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。

  (3)在一台处理器上“同时”(这个同时实际上市交替“”)处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群

  普通解释:

  并发:交替做不同事情的能力

  并行:同时做不同事情的能力

  专业术语:

  并发:不同的代码块交替执行

  并行:不同的代码块同时执行

5、总结:

  如果某个系统支持两个或者多个动作(Action)同时存在,那么这个系统就是一个并发系统。

  如果某个系统支持两个或者多个动作同时执行,那么这个系统就是一个并行系统。

  并发系统与并行系统这两个定义之间的关键差异在于“存在”这个词。

  在并发程序中可以同时拥有两个或者多个线程。这意味着,如果程序在单核处理器上运行,那么这两个线程将交替地换入或者换出内存。这些线程是同时“存在”的——每个线程都处于执行过程中的某个状态。

  如果程序能够并行执行,那么就一定是运行在多核处理器上。此时,程序中的每个线程都将分配到一个独立的处理器核上,因此可以同时运行。

  我相信你已经能够得出结论——“并行”概念是“并发”概念的一个子集。也就是说,你可以编写一个拥有多个线程或者进程的并发程序,但如果没有多核处理器来执行这个程序,那么就不能以并行方式来运行代码。因此,凡是在求解单个问题时涉及多个执行流程的编程模式或者执行行为,都属于并发编程的范畴。

  并发就是指代码逻辑上可以并行,有并行的潜力,但是不一定当前是真的以物理并行的方式运行。并发指的是代码的性质,并行指的是物理运行状态。

  顾名思义,并发强调的是一起出发,并行强调的是一起执行。并发的反义是顺序,并行的反义是串行。并发并行并不是互斥概念,只不过并发强调任务的抽象调度,并行强调任务的实际执行。

 

posted @ 2018-07-30 16:02  古兰精  阅读(27313)  评论(4编辑  收藏  举报