concurrent and parallel phases 并发和并行的区别

在看g1gc文章的时候,把concurrent and parallel phases翻译成并发和并行阶段,感觉这2个词不是一个意思吗?为啥他原始文档要强调这2个词呢。深究一下,果然不是一个意思。

总体概念:
在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调用机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent)。而在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel)。 

并发编程:
       "并发"在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,从宏观外来看,好像是这些进程都在执行。
     使用多个线程可以帮助我们在单个处理系统中实现更高的吞吐量,如果一个程序是单线程的,这个处理器在等待一个同步I/O操作完成的时候,他仍然是空闲的。在多线程系统中,当一个线程等待I/O的同时,其他的线程也可以执行。
     这个有点像一个厨师做麻辣鸡丝的时候同时做香辣土豆条,总比先做麻辣鸡丝再做香辣土豆条效率要高,因为这样可以交替着做。
    上面这个情况是在单处理器(厨师)的系统处理任务(做菜)的情况,厨师只有一个,他在一个微观的时间点上,他只能做一件事情,这种情况就是虽然是多个线程,但是都是在同一个处理器上运行,只能算是并发,不是并行。要是这个时候有2个厨师(cpu),那么就是真的并行,并行加并发才能提高效率。
     但是多线程并不能一定能提高程序的执行效率,比如,你的项目经理给你分配了10个bug让你修改,你应该会一个一个去改,一般的人不会每个bug去改5分钟,直到改完为止,如果这样的话,上次改到什么地方都记不得了。在这总情况下并发并没有提高程序的执行效率,反而因为过多的上下文切换引入了一些额外的开销。
     因此在单cpu下只能实现程序的并发,但是无法实现程序的并行。
     现在cpu到了多核的时代,那么就出现了新的概念:并行。
     并行是真正的细粒度上的同时进行;既同一时间点上同时发生着多个并发;更加确切并且简单的来讲:就是每个cpu上运行一个程序,以达到同一时间点上每个cpu上运行一个程序。
   总结,计算机的计算原理是顺序执行的;即一台计算机同一时间点上只能完成一个运算;既然突破不了这个理论基础,那么就在其基础上去发展:为一台计算机内置多个cpu,这样就可以达到真正意义上的并行。

并发:意味着应用程序同时(并发)在一项以上的任务上取得进展,尽力压榨一个cpu的处理能力,抢占更多的执行时间片

并行:应用程序将其任务分解为较小的子任务,这些子任务可以并行处理,例如在多个CPU上同时进行。重点是多个cpu。

理解:

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

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

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

  普通解释:

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

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

  专业术语:

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

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

例子:

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

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

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

总结:

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

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

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

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

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

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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章