java高并发系列 - 第3天:有关并行的两个重要定律

有关为何要使用并行程序的问题前面已经进行了简单的探讨。总的来讲,最重要的应该是处于两个目的。java

第一,为了得到更好的性能;算法

第二,因为业务模型的须要,确实须要多个执行实体。并发

在这里,我将更加关注第一种状况,也就是有关性能的问题。将串行程序改造为并发程序,通常来讲能够提升程序的总体性能,可是究竟能提升多少,甚至说到底是否真的能够提升,仍是一个须要研究的问题。目前,主要有两个定律对这个问题进行解答,一个是Amdahl定律,另一个是Gustafson定律。高并发

Amdahl(阿姆达尔)定律

Amdahl定律是计算机科学中很是重要的定律。它定义了串行系统并行化后的加速比的计算公式和理论上线。性能

加速比定义:加速比 = 优化前系统耗时 / 优化后系统耗时优化

所谓加速比就是优化前耗时与优化后耗时的比值。加速比越高,代表优化效果越明显。图1.8显示了Amdahl公式的推到过程,其中n表示处理器个数,T表示时间,T1表示优化前耗时(也就是只有1个处理器时的耗时),Tn表示使用n个处理器优化后的耗时。F是程序中只能串行执行的比例。线程

根据这个公式,若是CPU处理器数量趋于无穷,那么加速比与系统的串行化比例成反比,若是系统中必须有50%的代码串行执行,那么系统的最大加速比为2。3d

假设有一个程序分为如下步骤执行,每一个执行步骤花费100个单位时间。其中,只有步骤2和步骤5能够并行,步骤一、三、4必须串行,如图1.9所示。在全串行的状况下,系统合计耗时为500个单位时间。blog

若步骤2和步骤5并行化,假设在双核处理器上,则有如图1.10所示的处理流程。在这种状况下,步骤2和步骤5的耗时将为50个单位时间。故系统总体耗时为400个单位时间。根据加速比的定义有:基础

加速比 = 优化前系统耗时 / 优化后系统耗时 = 500/400 = 1.25

因为5个步骤中,3个步骤必须串行,所以其串行化比例为3/5=0.6,即 F = 0.6,且双核处理器的处理器个数N为2。代入加速比公式得:

加速比 = 1/(0.6+(1-0.6)/2)=1.25

在极端状况下,假设并行处理器个数为无穷大,则有如图1.11所示的处理过程。步骤2和步骤5的处理时间趋于0。即便这样,系统总体耗时依然大于300个单位时间。使用加速比计算公式,N趋于无穷大,有加速比 = 1/F,且F=0.6,故有加速比=1.67。即加速比的极限为500/300=1.67。

因而可知,为了提升系统的速度,仅增长CPU处理的数量并不必定能起到有效的做用。须要从根本上修改程序的串行行为,提升系统内可并行化的模块比重,在此基础上,合理增长并行处理器数量,才能以最小的投入,获得最大的加速比。

注意:根据Amdahl定律,使用多核CPU对系统进行优化,优化的效果取决于CPU的数量,以及系统中串行化程序的比例。CPU数量越多,串行化比例越低,则优化效果越好。仅提升CPU数量而不下降程序的串行化比例,也没法提升系统的性能。

阿姆达尔定律图示

为了更好地理解阿姆达尔定律,我会尝试演示这个定定律是如何诞生的。

首先,一个程序能够被分割为两部分,一部分为不可并行部分B,一部分为可并行部分1 – B。以下图:

在顶部被带有分割线的那条直线表明总时间 T(1)。

下面你能够看到在并行因子为2的状况下的执行时间:

并行因子为3的状况:

举个例子

一个业务会串行调用2个方法,m1,m2,m1耗时100ms,m2耗时400ms,m2内部串行执行了4个无依赖的任务,每一个任务100ms,以下图:

m2内部的4个任务无依赖的,便可以并行进行处理,4个任务同时并行,当cpu数量大于等于4的时候,可让4个任务同时进行,此时m2耗时最小,即100ms,cpu为2个的时候,同时只可以执行2个任务,其余2个任务处于等待cpu分配时间片状态,此时m2耗时200ms;当cpu超过4个的时候,或者趋于无限大的时候,m2耗时仍是100ms,此时cpu数量再怎么增长对性能也没有提高了,此时须要提高的是任务能够并行的数量。

从阿姆达尔定律能够看出,程序的可并行化部分能够经过使用更多的硬件(更多的线程或CPU)运行更快。对于不可并行化的部分,只能经过优化代码来达到提速的目的。所以,你能够经过优化不可并行化部分来提升你的程序的运行速度和并行能力。你能够对不可并行化在算法上作一点改动,若是有可能,你也能够把一些移到可并行化放的部分。

Gustafson定律

Gustafson定律也试图说明处理器个数、串行化比例和加速比之间的关系,如图1.12所示,可是Gustafson定律和Amdahl定律的角度不一样。一样,加速比都被定义为优化前的系统耗时除以优化后的系统耗时。

根据Gustafson定律,咱们能够更容易地发现,若是串行化比例很小,并行化比例很大,那么加速比就是处理器的个数。只要不断地累加处理器,就能得到更快的速度。

Amdahl定律和Gustafson定律结论有所不一样,并非说其中有个是错误的,只是两者从不一样的角度去看待问题的结果,他们的侧重点有所不一样。

Amdahl强调:当串行换比例必定时,加速比是有上限的,无论你堆叠多少个CPU参与计算,都不能突破这个上限。
Gustafson定律关系的是:若是可被并行化的代码所占比例足够大,那么加速比就能随着CPU的数量线性增加。

总的来讲,提高性能的方法:想办法提高系统并行的比例,同时增长CPU数量。

java高并发系列交流群

相关文章
相关标签/搜索