第6章存储器层次结构
存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。
cPU寄存器保存着最常用的数据。
靠近CPU的小的、快速的高速缓存存储器作为一部分存储在相对慢速的主存储器中数据和指令的缓冲区域。
主存暂时存放存储在容量较大的、慢速磁盘上的数据,而这些磁盘常常又作为存储在通过网络连接的其他机器的磁盘或磁带上的数据的缓冲区域。
6.1 存储技术
6.1.1随机访问存储器
随机访问存储器分为两类-静态和动态的。
静态RAM(SRAM)比动态RAM(DRAM)更快,但也贵很多。
(SRAM用来作为高速缓存存储器,即可以在CPU芯片上,也可以不在CPU芯片上。
DRAM用来作为主存以及图形系统的帧缓冲区。)
1.静态RAM
(1)SRAM将每个位存储在一个双稳态存储器单元中。每个单元是用一个六晶体管电路来实现的。这个电路的一个属性是:它可以无限制地保持在两个不同的电压配置或状态之一,其他任何状态都是不稳定的。(双稳态)
(2)由于SRAM的双稳态特性,只要有电,它就会永远地保持它的值,即使有干扰,如电子噪音,当干扰消除,电路也能恢复到稳定值。
2.动态RAM
(1)DRAM将每个位存储为对电容的充电。
(2)泄露电流的各种因素会导致DRAM单元在10~100毫秒内失去电荷。
3.传统的DRAM
DRAM芯片中的单元(位)被分成了d个超单元,每个超单元都由w个DRAM单元组成, 一个d*w的DRAM共存储dw位信息。超单元被组织成一个r行c列的长方形阵列,rc=d。每个超单元的地址用(i,j)来表示(从零开始)。
4.存储器模块
(1)双列直插存储器模块:168个引脚,以64位为块传入/传出数据到存储控制器。
(2)单列直插存储器模块:72个引脚,以32位为块传入/传出数据到存储控制器。
5.增强的DRAM
(1)同步DRAM:SDRAM用与驱动存储器相同的外部时钟信号的上升沿来代替许多这样的控制信号。
(2)双倍数据数率同步DRAM:DDR SDARM是对SDRAM的一种增加,它通过使用时钟的两个边沿作为控制信号,从而使DRAM的速度翻倍。
6.非易失性存储器
(1)如果断电,DRAM和SRAM都会丢失信息。
(2)PROM:只能被编程一次。PROM每个存储单元有一种熔丝,只能用高电流熔断一次。
(3)可擦写可编程ROM(EPROM):紫外线光照射过窗口,EPROM就被清除为0,被擦除和重编程的次数为1000次。
(4)电子可擦除ROM(EEPROM):不需要一个物理上独立的编程设备,因此可以直接在印制电路卡上编程,能够编程的次数为10^5。
闪存:基于EEPROM,为大量的电子设备提供快速而持久的非易失性存储。
7.访问主存
(1)读事务从主存传送数据到CPU;写事务从CPU传送数据到主存。
(2)总线是一组并行的导线,能携带地址,数据,的控制信号。
6.1.2磁盘存储
- 磁盘制造
每个表面是由一组称为磁道(track)的同心圆组成;每个磁道被划分成一组扇区(sector);每个扇区包含相等数量的数据位(通常是512字节);这些数据编码在扇区上的磁性材料中。扇区之间由一些间隙(gap)分隔开,这些间隙中不存在数据位。间隙存储用来标识扇区的格式化位。 - 磁盘容量
磁盘容量是由以下技术因素决定的:
记录密度(位/英寸):磁道一英寸的段中可以放入的位数。
磁道密度(道/英寸):从盘片中心出发半径上一英寸的段内可以有的磁道数
面密度(位/平方英寸):记录密度与磁道密度的乘积。
旁注:对于与DRAM和SRAM容量相关的单位,通常K = 210,M = 220,G = 230,对于磁盘和网络这样的I/O设备容量相关的单位,通常K = 103,M = 106,G = 109。
- 磁盘操作
(1)任何时刻,所有的读写头都位于同一柱面上。
(2)在传动臂末端的读/写头在磁盘表面高度约0.1微米处一层薄薄的气垫上飞翔,速度大约为80km/h。磁盘以扇区大小的块来读写数据。
(3)对扇区的访问时间有三个主要部分组成:
1.寻道时间:为了读取某个目标扇区的内容,传动臂把读/写头首先定位到包含目标扇区的磁道上。所需时间即为寻道时间,约等于最大旋转时间。
2.旋转时间:定位到期望的磁道后,驱动器等待目标扇区的第一个位旋转到读/写头下。
Tmax rotation = 1/最大旋转数率
Tavg rotation = (1/2) × Tmax rotation
3.传送时间:Tavg transfer = (1/最大旋转数率) × (1/每磁道的平均扇区数)
- 逻辑磁盘块
现代磁盘构造复杂,有多个盘面,这些盘面上有不同的记录区。为了对操作系统隐藏这样的复杂性,现代磁盘将它们的构造简化为一个b个扇区大小的逻辑块的序列,编号为0,1,2,...b-1。磁盘中有一个小的硬件/固件设备,称为磁盘控制器,维护着逻辑块号的和实际(物理)磁盘扇区之间的映射关系。 - 连接到I/O设备
- 访问磁盘
- 商用磁盘的剖析
6.1.3固态硬盘
固态硬盘是一种基于闪存的存储技术,在某些情况下是传统旋转磁盘的极有吸引力的替代产品。
一个硬盘包由一个或者多个闪存芯片和内存翻译层组成,闪存芯片替代旋转磁盘中的机械驱动器,而闪存翻译层将对逻辑块的请求翻译成对底层物理设备的访问
6.1.4存储技术趋势
- 从我们对存储技术的讨论中,可以总结出几个很重要的思想。
- 不同的存储技术有不同的价格和性能折中。SRAM比DRAM快一点,而DRAM比磁盘要快很多。另一方面,快速存储总是比慢速存储要贵的。SRAM每字节的造价比DRAM高,DRAM的造价又比磁盘高得多。SSD位于DRAM和旋转磁盘之间。
- 不同存储技术的价格和性能属性以截然不同的速率变化着。
6.2 局部性
局部性有两种形式:时间局部性和空间局部性。在一个具有良好时间局部性的程序中,被引用过一次的存储器位置很可能在不远的将来再被多次引用;在一个具有良好空间局部性的程序中,如果一个存储器位置被引用了一次,那么程序很可能在不远的将来引用附近的一个存储器位置。
程序指令是存放在存储器中的,CPU必须取出(读出)这些指令。
但是代码区别于程序数据的一个重要属性是:在运行时它是不能被修改的。
一些量化评价一个程序中局部性的简单原则:
1.重复引用同一个变量的程序有良好的时间局部性。
2.对于具有步长为k的引用模式的程序,步长越小,空间局部性越好;在存储器中以大步长跳来跳去的程序空间局部性会很差。
3.对于取指令来说,循环有很好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
6.3 存储器层次结构
存储器层次结构示例如下图所示:
(1)缓存命中:当程序需要第k+1层的某个数据对象d时,首先在当前存储的第k层的一个块中查找d,如果d刚好在第k层中,则称为缓存命中。
(2)缓存不命中:如果k层中没有缓存数据d,则称为缓存不命中,此时要从k+1层取出包含d的块,可能会覆盖(替换/驱逐)现在的一个块(牺牲块)。
(3)缓存不命中的种类
强制性不命中/冷不命中:第k层缓存是空的(冷缓存),只是短暂的状态,不会在反复访问存储器使得缓存暖身之后的稳定状态出现。
冲突不命中:第k+1层的第i块,必须放置在第k层的块(i mod 4)中,这种限制性的放置策略引起冲突不命中。
存储器层次结构概念小结
概括来说,基于缓存的存储器层次结构行之有效,是因为较慢的存储设备比较快的存储设备更便宜,还因为程序往往展示局部性:
- 利用时间局部性:由于时间局部性,同数据对象可能会被多次使用,一旦一个数据对象在第一次不命中时被拷贝到缓存中,我们就会期望后面该目标有一系列的访问命中。因为缓存比低层的存储设备更快,对后面的命中的服务会比最开始的不命中快很多。
- 利用空间局部性:块通常包含有多个数据对象。由于空间局部性,我们会期望后面对话中其他对家的访问能够补偿不命中后拷贝该块的花费。
6.4 高速缓冲存储器
6.4.1通用的高速缓存存储器结构
6.4.2直接映射高速缓存
每个组只有一行(E = 1)的高速缓存被称为直接映射高速缓存。
高速缓存确定一个请求是否命中,然后抽取出被请求的字的过程,分为三步
组选择
行匹配
字抽取
每组只有一行(E=1)的高速缓存称为直接映射高速缓存。
(1)直接映射高速缓存中的组选择:高速缓存从要抽取的字的地址中抽取出S个组索引位,这些位被解释成一个对应于一个组号的无符号整数。
(2)直接映射高速缓存中的行匹配:当且仅当设置了有效位,而且高速缓存行标记与w的地址中的行标记相匹配时,这一行中包含w的一个拷贝。
(3)直接映射高速缓存中的字抽取:块偏移位提供了所需要的字的第一个字节的偏移。
(4)直接映射高速缓存中不命中时的行替换:需要从存储器层次结构中的下一层取出被请求的块,将新的块存储在组索引位指示的组中的一个高速缓存行中。
6.4.3组相连高速缓存
- 1 < E < C/B
- 每个组都保存有多于一个的高速缓存行。
组相连高速缓存中的组选择:与直接映射高速缓存中的组选择一样,组索引位标识组。
组相连高速缓存中的行匹配和字选择:把每个组看做一个小的相关联存储器,是一个(key,value)对的数组,以key为输入,返回对应数组中的value值。高速缓存必须搜索组中的每一行,寻找有效的行其标记与地址中的相匹配。
组相连高速缓存中不命中时的行替换:最简单的替换策略是随机选择要替换的行,其他复杂的策略则使用了局部性原理,例如最不常使用、最近最少使用,等。
6.4.4全相连高速缓存
- E = C/B
- 只有一个组,这个组包含所有的高速缓存行。
- 因为全相联高速缓存需要并行搜索许多相匹配的行,所以构造相对是困难的;因此只适合做小的高速缓存;如虚拟存储器系统中的TLB,它缓存页表项。
6.4.5有关写的问题
- 写回,尽可能推迟存储器更新,只有当替换算法要驱逐已更新的块时,才把它写回存储器。
- 处理不命中:写分配(write-allocate),即加载相应的存储器块到高速缓存中,然后更新这个高速缓存器。
6.4.6一个真实的高速缓存层次结构的解剖
- 到目前为止,我们一直假设高速缓存只保存程序数据。实际上,也保存指令。
- 只保存指令的高速缓存程序数据称为i-cache。
- 只保存程序数据的高速缓存称为d-cache。
- 既保存指令又包括数据的高速缓存称为统一的高速缓存。
- 现代处理器包括独立的i-cahce和d-cache。
6.4.7高速缓存参数的性能影响
影响性能的因素
高速缓存大小的影响:较大的高速缓存可能会提高命中率,但使大存储器运行的更快是更难一些的。
块大小的影响:较大的块能利用程序中可能存在的空间局部性,帮助提高命中率;但块越大意味着高速缓存行较少,损害时间局部性。
相联度的影响:相联度较大(E值较大)优点是降低了高速缓存由于冲突不命中出现抖动的可能性,但成本较高。
写策略的影响:直写高速缓存易实现,而且能使用独立于高速缓存的写缓冲区,用来更新存储器,不命中开销小。
有许多指标来衡量高速缓存的性能:
- 不命中率:它是这样计算的:不命中数量/引用数量
- 命中率:命中的存储器引用比率
- 命中时间:命中时间的数量级是几个时钟周期
- 不命中处罚
6.5 编写高速缓存友好的代码
1. 时间局部性:对局部变量的反复引用是好的,因为编译器能够将它们缓存在寄存器文件中。
2. 空间局部性:步长为1的引用模式是好的,因为存储器层次结构中所有层次上的缓存都是将数据存储为连续的块。
6.6 综合:高速缓存对程序性能的影响
6.6.1存储器山
存储器系统的性能不是一个数字就能描述的。每台计算机都有表明他存储器系统的能力特色的唯一的存储器山。它是一座时间和空间局部性的山,这座山的上升高度差别可以超过一个数量级。要是程序运行在山峰而不是低谷。
目标:利用时间局部性,使得频繁使用的字从L1中取出;利用空间局部性,使得尽可能多的字从一个L1高速缓存行中访问到。
重点
重点练习题:6.2,6.3,6.4,6.8,6.9,6.10,6.11,6.12, 6.13
参考资料
1.教材《深入理解计算机系统》:第六章《处理器体系结构》,详细学习指导:http://group.cnblogs.com/topic/73069.html
2.课程资料:https://www.shiyanlou.com/courses/413 实验六,课程邀请码:W7FQKW4Y
3.教材中代码运行、思考一下,读代码的学习方法:http://www.cnblogs.com/rocedu/p/4837092.html。
4.百度百科