在看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)同时存在,那么这个系统就是一个并发系统。
如果某个系统支持两个或者多个动作同时执行,那么这个系统就是一个并行系统。
并发系统与并行系统这两个定义之间的关键差异在于“存在”这个词。
在并发程序中可以同时拥有两个或者多个线程。这意味着,如果程序在单核处理器上运行,那么这两个线程将交替地换入或者换出内存。这些线程是同时“存在”的——每个线程都处于执行过程中的某个状态。
如果程序能够并行执行,那么就一定是运行在多核处理器上。此时,程序中的每个线程都将分配到一个独立的处理器核上,因此可以同时运行。
我相信你已经能够得出结论——“并行”概念是“并发”概念的一个子集。也就是说,你可以编写一个拥有多个线程或者进程的并发程序,但如果没有多核处理器来执行这个程序,那么就不能以并行方式来运行代码。因此,凡是在求解单个问题时涉及多个执行流程的编程模式或者执行行为,都属于并发编程的范畴。
并发就是指代码逻辑上可以并行,有并行的潜力,但是不一定当前是真的以物理并行的方式运行。并发指的是代码的性质,并行指的是物理运行状态。
顾名思义,并发强调的是一起出发,并行强调的是一起执行。并发的反义是顺序,并行的反义是串行。并发并行并不是互斥概念,只不过并发强调任务的抽象调度,并行强调任务的实际执行。