第六章 存储器层次结构
6.1 存储技术
6.1.1
存储器的基本性能参数评价存储器性能的参数主要有三个方面:容量、速度与价格。存储器容量S=W×l×m表示,W为存储器字长,l为存储器字数,m则为存储器体数。
评价存储器的速度一般有以下几个参数::从存储器接到读请求到所读的字传送到数据总线上的时间间隔。
存储周期Tm:连续两次访问存储器之间所必需的最小时间间隔。一般Tm > Ta。
存储带宽Bm:存储器被连续访问时所提供的数据传输速流,单位是位(或字节)/秒。
存储器的价格通常用单位字节价格来表示。若总容量为S的存储器的总价格为C,则单位字节价格c=C/S。
2存储器层次结构的基本原理
程序设计人员总是希望存储器的速度尽可能的高,以与处理器的速度相匹配;存储器的容量尽可能的大,以装下可能极大的程序;因此,高速度、大容量、低价格始终是存储体系的设计目标。一方面,经过几十年的发展,存储器的工艺实现技术有了突飞猛进的发展,高速、大容量、低价的存储器件以惊人的速度生产出来。尽管如此,存储技术的发展证明单一工艺的单一存储器很难同时满足容量、价格、速度三方面的性能要求存储器的速度与价格的关系曲线)。事实上,对容量与速度、速度与价格、容量与价格的性能要求是相互有矛盾的。而且,存储器速度的改进始终跟不上CPU速度的提高
二、动态RAM(DRAM)
DRAMA将每个位存储为对一个电容的充电。这个电容非常小。DRAM存储器可以制造的非常密集——每个单元由一个电容和一个访问晶体管组成。
DRAM与SRAM不同,DRAM存储器单元对干扰非常敏感,当电容的电压被扰乱后,它就永远也不会恢复了,暴露在光线下会使电容电压改变。
很多原因会导致漏电,所以存储器系统必须周期性的通过读出,然后重写来刷新存储器的每一位。
三、传统的DRAM
DRAM芯片中的单元(位)被分成d个超单元,每个超单元都由w个DRAM单元组成,一个d×w的DRAM总共存储了dw位信息。超单元被组织成一个r行c列的长方形阵列,这里rc=d,每个超单元有形如(i,j)的地址,i表示行,j表示列。
信息通过成为引脚的外部连接器流入和流出芯片,每个引脚携带一个1位的信号。
每个DRAM芯片被连接到某个成为存储控制器的电路,这个电路可以一次传送w位到每个DRAM芯片或者一次从每个DRAM芯片传出w位。为了读出超单元(i,j)的内容,存储控制器将行地址i发动到DRAM,DRAM将行i的整个内容拷贝到一个内部行缓冲区,然后存储控制器发送列地址j,DRAM从行缓冲区拷贝出超单元(i,j)中的8位,并把它们发送到存储控制器。
DRAM为二维阵列而不是现行数组的一个原因是降低芯片上地址引脚的数量,二维阵列的缺点是必须分两步发送地址,这增加了访问时间。
四、存储器模块
DRAM芯片包装在存储器模块中,它是插到主板的扩展槽上的,常见的包装:(1)168个引脚的双列直插存储器模块(DIMM),它以64位为块传送数据到存储控制器和从存储控制器传出数据;(2)72个引脚的单列直插存储器模块(SIMM),以32位为块传送数据。
五、增强的DRAM
1、快页模式DRAM(FPM DRAM):允许对同一行进行连续的访问可以直接从行缓冲区得到服务。
2、扩展数据输出DRAM(EDO DRAM):允许FPM DRAM单独的CAS信号在时间上靠得紧一些。
3、同步DRAM(SDRAM)
4、双倍数据速率同步DRAM(DDR SDRAM)
5、Rambus DRAM
6、视频RAM
六、非易失性存储器
如果断电,DRAM&SRAM会丢失信息,从这个意义上说,它们是易失的,非易失性存储器即使关电后,也仍然保存着它们的信息,整体上都成为只读存储器(ROM)
PROM(可编程ROM)只能被编程一次。
可擦写可编程ROM(EPROM)被擦除和重编程的次数数量级可以达到1000次,电子可擦除PROM(EEPROM)可被编程次数的数量级可达到105次
闪存:基于EEPROM,提供快速而持久的非易失性存储。
存储在ROM设备中的程序通常称为固件,当一个计算机系统通电后,它会运行存储在ROM中的固件,一些系统在固件中提供了少量基本的输入和输出函数。
七、访问主存
数据流通过称为总线的共享电子电路在处理器和DRAM主存之间来来回回,每次CPU和主存之间的数据传送都是通过一系列步骤来完成的,这些步骤统称为总线事务。读事务从主存传送数据到CPU,写事务从CPU传送数据到主存。
总线是一组并行的导线,能携带地址、数据和控制信号。取决于总线的设计,数据和地址信号可以共享同一组导线,也可以使用不同的。
6.1.2 磁盘存储
一、磁盘构造
磁盘由盘面构成,每个盘面有两面或称为表面,表面覆盖着磁性记录材料,盘面中央有一个可以旋转的主轴,使盘片以固定的旋转速率旋转,通常是5400~15000转每分钟。磁盘通常包含一个或者多个这样的盘片,并封装在一个密封的容器内。
磁盘的每个表面是由一组称为磁道的同心圆组成的,每个磁道被划分为一组扇区,每个扇区包含相等数量的数据位,这些数据编码在扇区上的磁性材料中。扇区之间由一些间隙隔开,间隙中不存储数据位,间隙存储用来标识扇区的格式化位。
磁盘是由一个或者多个叠放在一起的盘片组成的,它们被封装在一个密封的包装里,这个装置通常称为磁盘驱动器,简称磁盘,有时也称磁盘为旋转磁盘,与基于闪存的固态硬盘相区分。
柱面是所有盘面表面上到主轴中心的距离相等的磁道的集合。
二、磁盘容量
一个磁盘上可以记录的最大位数称为它的最大容量,磁盘容量由以下技术因素决定:
1、记录密度
2、磁道密度
3、面密度
现代大容量磁盘使用多区记录技术,柱面的集合被分割成不相交的子集合,称为记录区。
三、磁盘操作
磁盘用读/写头来读写存储在磁盘表面的位,读写头连接到一个传动臂一端,通过沿半径周前后移动这个传送臂,驱动器可以将读/写头定位在盘面上的任何磁道上,这样的机械运动称为寻道。一旦读/写头定位到了期望的磁道上,那么当磁道上的每个位通过它的下面时,读/写头可以感知到这个位的值,也可以修改这个位的值。有多个盘片的磁盘针对每个盘片都有一个独立的读/写头,读/写头垂直排列,一致行动,任何时刻,所有的读/写头都位于同一个柱面上。
磁盘以扇区大小的块来读写数据,对扇区的访问时间主要有以下三个部分:
1、寻道时间:传动臂将读/写头定位到包含目标扇区的磁道上所需的时间。依赖于读/写头当前的位置和传送臂在盘面上移动的速度。
2、旋转时间:等待目标扇区第一个位选转到读/写头下的时间。依赖于读/写头到达目标磁道时盘面的位置和磁盘的旋转速度。
3、传送时间:依赖于旋转速度和每条磁道的扇区数目。
四、磁盘控制块
操作系统发送命令道磁盘控制器,控制器上的固件执行一个快速表查找,将一个逻辑块号翻译成(盘面,磁道,扇区)的三元组,这个三元组唯一的标识了对应的物理扇区,控制器上的硬件解释这个三元组,将读/写头移动到适当的柱面,进行磁盘操作。
五、连接到I/O设备
6.1.3 固态硬盘
固态硬盘SSD:基于闪存的存储技术。
和旋转磁盘对比:随机访问时间比旋转磁盘快,能耗更低,更易磨损。
6.2 局限性
局部性原理:时间局部性,空间局部性。
顺序引用模式(步长为1的引用模式):顺序访问一个向量的每个元素。是程序中空间局部性常见和重要的来源。
步长为k的引用模式:一个连续向量中,每隔k个元素进行访问,随k增加,空间局部性下降。
双重嵌套循环按照行优先顺序读数组的元素。
一些原则:
重复引用同一个变量的程序具有良好的时间局部性。
对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
6.3 存储器层次结构
6.3.1 存储器层次结构中的缓存
使用高速缓存的过程称为缓存。
存储器层次结构的中心思想:对于每个k,位于k层的更小更快的存储设备作为位于k+1层的更大更慢存储设备的缓存。即层次结构中的每一层都缓存来自较低一层的数据对象。
k+1层的存储器被划分成连续的数据对象片,称为块,每个块都有唯一的地址或名字,块的大小可以是固定的也可以是可变的。
第k层的存储器被划分成较少的块的集合,每个块的大小和k+1层的块的大小一样。在任何时刻,k层的缓存包含k+1层块的一个子集的拷贝。
数据总是以块大小为传送单元在k和k+1层之间来回拷贝,在层次结构中任何一对相邻的层次之间块的大小是固定的,但是其他层次对之间可以有不同的块大小,一般而言,层次结构中较低层的设备访问时间较长,倾向于用较大的块。
一、缓存命中
若程序需要k+1层中的某个块的数据d,访问k层时发现刚好这个块缓存在k层,称为缓存命中。
二、缓存不命中
若k层没有需要的缓存数据对象d,就是缓存不命中,发生缓存不命中时,k层的缓存从k+1层取出包含d的块,若k层缓存已满,可能会覆盖现存的一个块。
覆盖一个现存的块的过程称为替换或驱逐这个块,被驱逐的块也称牺牲块。
决定该替换哪个块由缓存的替换策略来控制。
三、缓存不命中的种类
冷不命中:空缓存
硬件缓存通常使用的放置策略:将k+1层的某个块限制放置在k层块的一个小子集中(如图6-24中,k+1层的块i放置在k层的imod4块中)
冲突不命中:要找k+1层的块映射到k层的同一个块上。
程序通常是按照一系列阶段(如循环)来运行的,每个阶段访问缓存块的某个相对稳定不变的集合,这个块的集合称为这个阶段的工作集,当工作集的大小超过缓存的大小时,缓存会经历容量不命中。(缓存太小无法处理这个工作集)
四、缓存管理
管理缓存的划分成块,不同的层之间传送块,判断命中或者不命中并处理。
6.4 高速缓存存储器
6.4.1 通用的高速缓存存储器结构
一个计算机系统,每个存储器地址有m位,形成M=2m个不同的地址,这样一个机器的高速缓存被组织成一个有S=2s个高速缓存组的数组,每个组包含E个高速缓存行,每个行由一个B=2b字节的数据块组成,一个有效位指明这个行是否包含有意义的信息,还有t=m-(b+s)个标记位,它们唯一的标识存储在这个高速缓存行中的块。
6.4.2 直接映射高速缓存
每个组织有一行(E=1)的高速缓存称为直接映射高速缓存。
高速缓存确定一个请求是否命中然后抽取被被请求的字的过程:组选择,行匹配,字抽取
1、组选择:
从w的地址中间抽取出s个组索引位。
2、行匹配:
确定是否有字w的一个拷贝存储在组i包含的一个高速缓存行中:设置了有效位且高速缓存行中的标记与w的地址中的标记相匹配。
3、字选择:
块偏移位提供所需要的字的第一个字节的偏移。
4、直接映射高速缓存不命中时的行替换:
用新取出的行替换当前的行。
5、运行中的直接映射高速缓存:
标记位和索引位连起来唯一的标识了存储器中的每个块。
映射到同一个高速缓存组的块由标记位唯一的标识。
6、直接映射高速缓存中的冲突不命中:
抖动:高速缓存反复加载和驱逐相同的高速缓存块的组。
修正:在每个数组的结尾放B字节的填充。
6.4.3 组相联高速缓存
1<E<C/B的高速缓存称为E路组相联高速缓存。
一、组选择
组索引标识组
二、行匹配和字选择
三、行替换
有空行替代空行
没有空行:
随机替换
最不常使用策略
最近最少使用策略
6.4.4 全相联高速缓存
包含所有高速缓存行的组
一、组选择:
二、行匹配和字选择:
同组相联高速缓存。
6.4.5 有关写的问题
一、写命中:
直写:立即将w的高速缓存块写回到紧接着的低一层中。每次写都会引起总线流量。
写回:当替代算法要驱逐更新过的块时,才写到紧接着的低一层中。减少了总线流量,增加了复杂性,要有一个额外的修改位来表明这个高速缓存块是否被修改过。
二、写不命中:
写分配:加载低一层的块到高速缓存中,然后更新这个高速缓存块。
非写分配:直接把这个字写到低一层中。
一般来说,直写——非写分配,写回——写分配。
6.4.6 高速缓存层次结构的解剖
只保存指令的高速缓存:i-cache 通常是只读的
只保存程序数据的高速缓存:d-cache
都保存的高速缓存:统一的高速缓存
6.4.7 高速缓存参数的性能影响
一些指标:
不命中率:不命中数量/引用数量
命中率:1-不命中率
命中时间:从高速缓存传送一个字到CPU所需的时间,包括组选择、行确认、字选择的时间
不命中惩罚:由于不命中所需要的额外的时间。
高速缓存大小的影响:
大——提高命中率,运行更慢,增加命中时间
块大小的影响:
大——提高命中率,损害时间局限性比空间局限性更好的程序中的命中率,不命中惩罚时间更长
相联度的影响:
E大——降低抖动可能性,成本高,运行慢,需要更多标记位,增加命中时间,增加不命中惩罚
写策略的影响:
直写:容易实现,能使用独立于高速缓存的写缓存区,读不命中开销没那么大
写回:缓存引起的传送较少,允许更多的到存储器的带宽用于执行DMA的I/O设备。
高速缓存越往下层越会使用写回。
参考资料
教材.查询百度。