登 录
注 册
< 系统运维
Linux
计算机系统
系统工具
系统硬件组成
高速缓存
存储器及操作系统
Amdahl定理
信息表示和处理
内存有关错误
全球IP因特网
信号量同步线程
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
HBase
HBased对接Hive
Linux
Nginx高可用
Python
数据导出工具
Flink
3分钟搭建Flink SQL测试环境
Kafka
Kafka对接Flume
深度学习
卷积神经网络
数据结构与算法
选择合适的算法
MySQL
数据备份恢复
Hive
Hive调优参数大全
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
安全常识
一文读懂SSO
当前位置:
首页
>>
计算机系统
>>
Amdahl定理
Amdahl定理
2020-07-05 12:20:43 星期日 阅读:1769
![](/static/images/article_images/1693727597.814635.jpeg) 系统不仅仅只是硬件,系统是硬件和系统软件互相交织的集合体。它们必须共同协作以达到运行应用程序的最终目的。 Gene Amdahl对提升系统某一部分性能所带来的效果做出了简单却有见的观察。这个观察被称为Amdahl定律。 其主要思想是: `当我们对系统的某个部分加速时,对系统整体性能的影响取决于该部分的重要性和加速程度。` *(举个生活中的列子:比如早上上班需要坐4条地铁,即S1线、6号线、10号线和1号线,现在6号线的运行速度加快了,对整个上班的通勤时间长短的影响取决于6号线需要坐几站,以及6号线在此基础上加速到多少。如果6号线只需要坐一站,那不管6号线有多快,对整个上班通勤时间的影响不是很大。但如果6号线坐的站很多,基本占了通勤线路的80%以上,那6号线的提速将会对通勤时间影响很大)* 假设系统执行某个应用程序需要时间为T_old(上班通勤的总时间),假设系统某部分所需执行时间与该时间的比列为a(乘坐6号线所需时间与整个通勤时间的比列),而该部分性能提升比列为k(6号线提速K倍)。即该部分初始所需要的时间为a*T_old(6号线加速前需要运行的时间),现在需要的时间为(a * T_old) / k 。因此,6号线加速后的总共需要的执行时间: ``` T_new = (a * T_old ) / k + ( 1 - a ) * T_old # 由此可计算得出 T_old / T_new = 1 / [ (1 - a ) + a / k ] ``` 下面具体来计算一下: ``` 还是刚才的问题,早上上班需要坐4条地铁,总共通勤时间为100分钟。其中6号线需要乘坐60分钟(a = 60 / 100 = 60%) , 现在6号线提速3倍(k= 3 ),则现在所需要的时间为: T_new = (0.6 * 100 / 3 ) + ( 1 - 0.6 ) * 100 = 60分钟 T_old / T_new = 100 / 60 = 1.67 ``` 也就是说,6号线加速三倍的情况下,通勤时间由100分钟降为60分钟,快了1.67倍。 这个计算结果表明,虽然我们对系统的一个主要部分做出了重大改进(6号线提速3倍),但是获得的系统加速比却明显小于这部分的加速比。这就是Amdahl定律的主要观点——要想要显著加速整个系统,必须提升全系统中相当大的部分的速度。 Amdahl定律有一个有趣的特殊加速情况是`考虑k趋向于正无穷时的效果`,这就意味着我们可以去系统中的某一部分将其加速到一个点,在这个点上,这部分花费的时间可以忽略不计(上面列子中,当6号线加到足够快时,我们可以忽略6号线的乘坐时间)。于是我们得到: ``` T_new = (1 - a ) * T_old 基于上面的例子 T_new = ( 1 - 0.6 ) * 100 = 40 T_old / T_new = 100 / 40 = 2.5 ``` 如果60%的系统能够加速到不花时间的程度,我们获得的净加速比将仍然只有2.5倍。所以,Amdahl定律描述了改善任何过程的一般原则。如果我们想把性能提高2倍或者更高的比列,只有通过优化系统的大部分组件才能获得。 ####并发和并行 数字计算机的整个发展历史中,我们有两个需求是驱动进步的持续动力: 1、我们要计算机做得更多; 2、我们想要计算机运行得更快 专业术语并发:指的是同时具有多个活动的系统; 专业术语并行:指的是用并发来使一个系统运行的更快; 并行可以在计算机系统的多个抽象层次上运用,以下分别展开介绍。 #####1、线程级并发 使用线程,我们可以在一个进程中执行多个控制流。传统意义上,并发执行只是模拟出来的,是通过一台计算机在它正在执行的进程间快速切换来实现的,就好像一个杂耍艺人保持多个球在空中飞舞一样。这种情况下,即使处理器必须在多个任务间切换,大多数实际的计算机也都是一个处理器来完成的。这种配置称为单处理器系统。 当构建一个由单操作系统内核控制的多处理器组成的系统时,我们就得到了一个多处理器系统。多处理器系统是将多个CPU(称为核)集成到一个集成电路芯片上。其中微处理器芯片有4个CPU核,每个核都有自己的L1和L2高速缓存,其中L1的高速缓存又分为两部分(即:一个保存最近取到的指令,另一个存放数据)。这些核共享更高层次的高速缓存,以及到主存接口。 `超线程`,有时称为同时多线程,是一项允许一个CPU执行多个控制流的技术。`假设一个线程必须等到某些数据被装载到高速缓存中,那CPU就可以继续执去执行另一个线程`。举例来说,Intel Core i7处理器可以让每个核执行两个线程,所以一个4核的系统实际上可以并行执行8个线程。 多处理器的使用可以从两方面提高系统性能。 1、减少了在执行多个任务时的模拟并发需要; 2、可以使应用程序运行得更快;当然这必须要求程序是以多线程方式书写的。 #####2、指令级并行 在较低的抽象层次上,现代处理器可以同时执行多条指令的属性称为指令级并行。 早期的微处理器Intel 8086,需要3至10个时钟周期来执行一条指令。最近的处理器可以保持每个时钟周期执行2至4条指令的执行速率。其实每条指令从开始到结束,大约20个或者更多的时钟周期,但是处理器使用了非常多的聪明技巧来同时处理多达100条指令。也就是流水线pipelining的作用。在流水线中,将执行一条指令所需要的活动划分为不同的步骤,将处理器的硬件组织成一系列的阶段。每个阶段执行一个步骤。这些阶段可以并行的执行。 如果处理器可以达到比一个时钟周期执行一条指令更快的执行速率,就称为超标量(super scalar)处理器。大多数现代处理器都支持超标量操作。 #####3、单指令、多数据并行 在最低层次上,许多现代处理拥有特殊的硬件。允许一条指令产生多个可以并行执行的操作。这种方式成为单指令、多数据,即SIMD。