【高并发趣事一】——Amdahl(阿姆达尔定律)与Gustafson(古斯塔夫森定律)

简介: 【高并发趣事一】——Amdahl(阿姆达尔定律)与Gustafson(古斯塔夫森定律)

在高并发程序设计中有非常重要的两个定律,这个两个定律从不同角度诠释了加速比与系统串行化程度、CPU核心数之间的关系,他们使我们在做高并发程序设计的理论依据:


Amdahl(阿姆达尔定律)

Gustafson(古斯塔夫森定律)


一、Amdahl(阿姆达尔定律)


1.1 加速比定义


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


所谓加速比就是优化前的耗时和优化后的耗时的比值。加速比越高,表明优化效果越明显。


下图是该公式的推导过程:其中n表示处理器个数,T表示时间,T1表示优化前耗时(也就是一个CPU耗时),Tn表示使用n个处理器优化后的耗时。F是程序中只能串行执行的比例。


20200719174156411.png



根据这个公式,如果CPU处理器数量趋于无穷,那么加速比与系统的串行化比例成反比,也就说 如果系统中有50%的代码必须串行化,那么系统的最大加速比为2.


我们在看下面一个例子:

2020071917493447.png


如果一个程序完成需要5个步骤,每个步骤的耗时都为100,在串行情况下耗时为500,现在如果步骤2和步骤5可以并行处理,那么我们在双核的机器上耗时为 400.所以加速比为  500 / 400 =1.25;


202007191751554.png


由于5个步骤中有三个步骤必须串行化,所以串行比为 3 / 5 =0.6,即F = 0.6,且双核 处理器N=2。加入加速比 得:


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


在极端情况下,假定并行处理器个数为无穷大,也就说 步骤2和步骤5的耗时为0.即使这样,系统整体耗时依然大于300,使用加速比计算公式,N趋于无穷大,有加速比= 1/F,且F=0.6,固有加速比= 1.67.即加速比的极限为 500/300 = 1.67.


由此可见,为了提高系统的速度,仅仅增加CPU的数量并不一定能达到我们预期的效果。需要从根本上修改程序的串行行为,提高系统内可并行化的模块比重,在此基础上,合理增加并行处理器数量,才能以最小的投入,得到最大的加速比。


1.2  Gustafson(古斯塔夫森定律)


该定律也试图说明处理器个数,串行化比例和加速比之间的关系,但是和阿姆达定律的角度不同,加速比的定义仍然被定义为优化前的系统耗时除以 优化后的系统耗时。


 

20200719194012622.png

从上面的公式我们可以看出两个公式截然不同,Gustafson定律中,我们可以更容易的发现,如果串行化比例很小,并行化比例很大,那么加速比就是处理器个数,只要不断的累加处理器数,就能获得更快的速度。


二、是否矛盾


两个定律的结论不同,这是不是说两个定律中有一个是错误的呢,其实不然,两者的差异其实是因为这两个定律对一个客观事实从不同角度去审视的后果,他们的侧重点不同。


Amdahl强调,当串行化比例一定时,加速比是有上限的,不管你堆叠多少个CPU参与计算,都不能突破上限。


而Gustafson 定律的出发点不同,对Gustafson定律来说,如果可被并行化的代码所占比例足够大,那么加速比就能随着CPU的数量线性增长。


所以这两者并不矛盾,从极端的角度来说,如果系统中没有可以被并行化的代码,那么对于两个定律,其 加速比是1,反之,如果系统中可被并行化的代码比例100%,那么两个定律得到的加速比都是处理器个数。

目录
相关文章
|
SQL 安全 Java
【高并发趣事三】——双重检查锁定与延迟初始化
【高并发趣事三】——双重检查锁定与延迟初始化
304 0
【高并发趣事三】——双重检查锁定与延迟初始化
|
存储 Java 编译器
【高并发趣事二】——JMM及程序中的幽灵
【高并发趣事二】——JMM及程序中的幽灵
235 0
【高并发趣事二】——JMM及程序中的幽灵
|
11月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
监控 算法 Java
企业应用面临高并发等挑战,优化Java后台系统性能至关重要
随着互联网技术的发展,企业应用面临高并发等挑战,优化Java后台系统性能至关重要。本文提供三大技巧:1)优化JVM,如选用合适版本(如OpenJDK 11)、调整参数(如使用G1垃圾收集器)及监控性能;2)优化代码与算法,减少对象创建、合理使用集合及采用高效算法(如快速排序);3)数据库优化,包括索引、查询及分页策略改进,全面提升系统效能。
328 0
|
算法 Java 调度
高并发架构设计三大利器:缓存、限流和降级问题之使用Java代码实现令牌桶算法问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之使用Java代码实现令牌桶算法问题如何解决
430 0
|
监控 网络协议 Java
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
443 0
|
设计模式 安全 NoSQL
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
322 0
|
设计模式 安全 Java
Java面试题:如何实现一个线程安全的单例模式,并确保其在高并发环境下的内存管理效率?如何使用CyclicBarrier来实现一个多阶段的数据处理任务,确保所有阶段的数据一致性?
Java面试题:如何实现一个线程安全的单例模式,并确保其在高并发环境下的内存管理效率?如何使用CyclicBarrier来实现一个多阶段的数据处理任务,确保所有阶段的数据一致性?
285 0
|
设计模式 存储 缓存
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
364 0
|
存储 安全 Java
Java面试题:假设你正在开发一个Java后端服务,该服务需要处理高并发的用户请求,并且对内存使用效率有严格的要求,在多线程环境下,如何确保共享资源的线程安全?
Java面试题:假设你正在开发一个Java后端服务,该服务需要处理高并发的用户请求,并且对内存使用效率有严格的要求,在多线程环境下,如何确保共享资源的线程安全?
359 0

热门文章

最新文章