计算机体系结构(国防科大)-第五章-存储层次
1 存储层次
L1 Cache -> L2 Cache -> DRAM -> 磁盘、磁带。
Cache——主存层次:弥补主存速度的不足。
主存——辅存层次:弥补主存容量的不足。
存储层次的四个问题:
- 映像规则:调入块可以放在哪些位置;
- 查找算法:如何在映像规则规定的候选位置查找;
- 替换算法:规定的候选位置均被别的块占用
- 写策略:如何写操作。
2 Cache基本知识
2.1 映像规则:
- 全相联映像:主存中的任一块可以放置到Cache中的任意一个位置;
- 直接映像:主存中的每一块只能放置到Cache中唯一的一个位置;
- 组相联映像:主存中的每一块可以被放置到Cache中唯一的一个组中的任何一个位置。
- n路组相联:每组中由n个块(n = M/G),n称为相联度。
- 相联度越高,Cache空间利用率就越高,块冲突概率就越低,失效率也就越低。
2.2 查找方法
并行查找的实现方法:
- 相联存储器;
- 单体多字存储器+比较器。
2.3 替换算法
当Cache位置已满时,替换哪一块?
- 随机法:实现简单
- FIFO:实现简单
- LRU:失效率低
- LFU:最不常使用法
2.4 写策略
两种写策略:
- 写直达法:执行“写”操作时,不仅写入Cache,而且也写入下一级存储器。
- 写回法:执行“写”操作时,只写入Cache。仅当Cache中相应的块被替换时,才写回主存。
- “写”操作时的调块:
- 按写分配(写时取):写失效时,先把所写单元所在的块调入Cache,再行写入。
- 不按写分配(绕写法):写失效时,直接写入下一级。
- 写合并:当把数据写入写缓冲器时,判断本次所写入单元的块地址是否与写缓冲器中某个有效块的地址相同,若是,则把新数据与该块合并。
2.5 改进Cache性能
平均访存时间 = 命中时间 + 失效率 × 失效开销。
改进Cache的性能:
- 降低失效率;
- 减少失效开销;
- 减少Cache命中时间。
改进Cache性能的各种方式对比如下:
3 降低Cache失效率的方法
3.1 三种失效:
- 强制性失效:当第一次访问一个块时,该块不在Cache中,需要从下一级存储器中调入Cache,这就是强制性失效(冷启动失效,首次访问失效)。
- 容量失效:如果程序执行时所需的块不能全部调入Cache中,则当某些块被替换后,若又重新被访问,就会发生。
- 冲突失效:在组相联或直接映像Cache中,若太多的块映像到同一组(块)中,则会出现该组中某个块被别的块替换(即使别的组或块有空闲位置),然后又重新访问的情况。这就是冲突失效(碰撞失效,干扰失效)。
3.2 减少三种失效的方法:
- 强制性失效:增加块大小,预取(本身很少)
- 容量失效:增加容量(防止出现抖动现象)
- 冲突失效:提高相联度(理想情况:全相联)
- 注:许多降低失效率的方法会增加命中时间或失效开销。
3.3 增加Cache块大小
- 对于给定的Cache容量,在增加块大小的过程中,不命中率先下降后上升,下降是因为强制不命中降低(所需要的东西尽量都拿到块里),上升是因为冲突不命中增加(会减小Cache中块的数目)。 此外增加块的大小还会导致不命中开销增加。;
- Cache容量越大,失效率达到最低的块大小就越大。
- 增加块带大小会增加失效开销。
3.4 提高相联度
- 采用相联度超过8的方法实际意义不大;
- 2:1Cache经验规则:容量为N的直接映像 = 容量为N/2的两路组相联Cache;
- 提高相联度是以增加命中时间为代价。
3.5 Victim Cache(伪相联Cache)
思想:在Cache和它从下一级存储器调数据的通路之间设置一个全相联的小Cache,用于存放被替换出去的块(称为Victim),以备重用。
作用:对于减少冲突失效很有效,特别是对于小容量的之间映像数据Cache,作用尤其明显。例如:项数为4的Victim Cache,使4KB Cache的冲突失效减少20%~90%。
伪相联Cache实现:在逻辑上,把直接映象Cache的空间上下平分为两个区。对于任何一次访问,伪相联Cache先按直接映象Cache的方式去处理。若命中,则其访问过程与直接映象Cache的情况一样。若不命中,则再到另一区相应的位置去查找。若找到,则发生了伪命中,否则就只好访问下一级存储器。
快速命中与慢速命中:
3.6 硬件预取
概念:
- 指令和数据都可以预取;
- 预取内容既可以放入Cache,也可以在外缓冲器中,如指令流缓冲器。
- Palacharla和Kessler的研究结果显示:流缓冲器:既能预取指令又能预取数据。对于两个64KB四路组相联Cache来说:8个流缓冲器能捕获50%~70%的失效。
3.7 编译器控制的预取
概念:由编译器加入预取指令,在数据被用到之前发出预取请求。
预取类型:
- 寄存器预取
- Cache预取
- 故障性预取:预取时,若出现虚地址故障或违反访问权限,就会发生异常。
- 非故障性预取:预取时,若出现虚地址故障或违反访问权限,并不会导致异常,只是转变为“不预取”。
在预取数据的同时,处理器应能继续执行。
循环是预取优化的主要对象。
3.8 用编译器技术减少Cache失效
思想:在编译时,对程序中的指令和数据进行重新组织,以降低Cache失效率。
McFaring 发现:通过对指令进行重新排序, 可有效地降低指令Cache的失效率。2KB Cache: 降低50%,8KB Cache:降低75%。
数据对存储位置的限制比指令的少,因此更便于优化。通过把数据重新组织,使一块数据被从Cache替换出去之前,能最大限度利用其中的数据(访问次数最多)。
4 减少Cache失效开销
4.1 写缓冲及写合并
写直达Cache中,因为所有的写请求都必须发送到下级存储层次中,所以经常使用一个写缓冲来降低失效开销。
如何提高写缓冲的效率和利用率——写合并
在写回法Cache中,也可采用写缓冲器
4.2 让读失效优先于写
Cache中的写缓冲器导致对存储器访问的复杂化。
解决问题的方法(读失效的处理):
- 推迟对读失效的处理及到写缓冲排空(缺点:读失效的开销增加)
- 检查写缓冲器中的内容:增加硬件。
4.3 子块放置技术
把Cache块进一步划分为更小的块(子块),并给每个子块赋予一位有效位,用于指明该子块中的数据是否有效。
Cache与下一级存储器之间以子块为单位传送数据。但标识仍以块为单位。
4.4 请求字处理技术
请求字:从下一级存储器调入Cache的块中,只有一个字是立即需要的。这个字称为请求字。
应尽早把请求字发送给CPU:
- 尽早重启动:调块时,从块的起始位置开始读起。一旦请求字到达,就立即发送给CPU,让CPU继续执行。
- 请求字优先:调块时,从请求字所在的位置读起。这样,第一个读出的字便是请求字。将之立即发送给CPU。
这种技术在以下情况下效果不大:
- Cache块较小
- 下一条指令正好访问同一Cache块的另一部分。
4.5 多级Cache
应把Cache做得更快?还是更大?——答案:二者兼顾,再增加一级Cache
性能分析:
平均访问时间 = 命中时间L1 + 失效率L1 × 失效开销L1
= 命中时间L1 + 失效率L1 × (命中时间L2 + 失效率L2 × 失效开销L2)
局部失效率与全局失效率:
- 局部失效率 = 该级Cache的失效次数 / 到达该级Cache的访问次数
- 全局失效率 = 该级Cache的失效次数 / CPU发出的访存的总次数
- 全局失效率 = 失效率L1 × 失效率L2
评价多级Cache时,应使用全局失效率指标。
第二级Cache参数:第二级Cache不会影响CPU的时钟频率,因此其设计有更大的考虑空间。
4.6 非阻塞Cache技术
非阻塞Cache:Cache失效时仍允许CPU进行其它的命中访问。即允许“失效下命中”
进一步提高性能:多重失效下命中存储器必须能够处理多个失效
5 减少命中时间
5.1 采用容量小、结构 简单的Cache
命中时间直接影响到处理器的时钟频率。在当今的许多计算机中,往往是Cache的访问时间限制了处理器的时钟频率。
- 硬件越简单,速度就越快;
- 应使Cache足够小,以便可以与CPU一起放在同一块芯片上。
5.2 虚拟Cache
虚拟Cache:访问Cache的索引以及Cache中的标都识是虚拟地址的一部分。
并非都采用虚拟Cache(为什么?)
- 虚拟Cache的清空问题:在地址标识中增加PID字段(进程ID),PIDs与单进程相比:+0.3% ~ +0.6%,PIDs与清空相比:-0.6% ~ -4.3%。
- 同义/别名问题:多个虚拟地址对应同一个物理地址,解决方法:反别名法,页着色。
虚拟索引+物理标识:利用虚拟地址找到索引读Cache,同时进行虚实地址转换。前提是虚拟索引 = 物理索引,而:页内位移在虚实地址变换时不变。
- 优点:兼得虚拟Cache和物理Cache的好处
- 局限性:Cache容量受限 ≤ 页大小 × 相联度
5.3 流水化写
6 主存
主存的主要性能指标:延迟和带宽
以往:Cache主要关心延迟,I/O主要关心带宽。现在:Cache关心两者
为减少失效开销TM,应该:
- 减少主存延迟
- 提高主存带
增加Cache块大小能利用主存带宽增加所带来的好处。
6.1 存储器组织技术
存储器组织技术:
- 增加存储器的宽度
- 采用简单的多体交叉存储器
- 独立存储体:设置多个存储控制器,使多个体能独立操作,以便能同时进行多个独立的访存。
DIMM(dual inline memory modules)多个DRAM芯片经常被组装在称为条的小型板上,构成“双列直插式存储模块”。一个DIMM通常包含4~16片DRAM芯片,这些芯片常被组织成8字节宽的主存(带ECC校验 )。
DRAM芯片优化技术
- 芯片内部优化技术是提高主存系统性能的一个重要方面。
- 快页模式:内部缓冲一行的数据以便进行列访问。
- SDRAM(Synchronous DRAM):DRAM接口增加一个时钟信号可使DRAM能针对一个请求连续同步地传输多个数据而不需同步开销。
- DDR(double data rate):在DRAM时钟的上沿和下沿都进行数据传输 ,可把数据传输率提高一倍。
总结:
- DDR技术规定的标准电压为2.5V,DDR2技术的电压将为1. 8V,工作频率范围为266MHz~400MHz,DDR3的电压将为1.5V,最大工作频率为800MHz。
- 存储器优化技术都是通过增加少量逻辑来开发DRAM内部潜在的高带宽,这种优化代价很小,却能使带宽显著提高。
7 虚拟存储器
7.1 虚拟存储器基本原理
虚存管理方式分两类:页式和段式。
- 页式虚存把空间划分为大小相同的块,称为页面。常用页大小为4KB~64KB。
- 段式虚存把空间划分为可变长的块,称为段。段最小长度为1个字节,最大因机器而异,常为216B~232B。
- 页面是对空间的机械划分,而段则往往是按程序的逻辑意义进行划分。
- 对CPU的影响:
- 页式虚存:地址是单一、固定长度的地址字,由页号和页内位移两部分组成。
- 段式虚存:地址需要用两个字表示,一个为段号,另一个为段内位移。段的长度是可变的。
- 段页式:每段被划分成若干个页面。既保持了段作为逻辑单位的优点,又简化了替换的实现,而且段不必作为整体全部一次调入主存,而是可以以页面为单位部分调入。
- Cache和虚存对比:
- 虚存处于“主存-辅存”层次与“Cache-主存”层次的相似点
- 都是分块方式:Cache块、页、段
- 都有失效问题:Cache块失效、页故障、地址故障
- 与“Cache—主存”层次的不同点
- 失效替换:Cache由硬件完成,虚存主要由OS。
- 处理器地址大小决定虚存大小,但与Cache大小无关。
- 辅存除用做主存的后备存储器外,还用于文件系统。
- 虚存处于“主存-辅存”层次与“Cache-主存”层次的相似点
- 有关虚拟存储器的四个问题:
- 映象规则:全相联,以降低失效率为主要目标。
- 查找算法:页表,段表,TLB。
- 页表和段表:索引、页号或段号的数据结构,含有所要查找的块的物理地址。
- 段式系统:段内位移加上段的物理地址就是最终的物理地址。
- 页式系统:只需简单地将页内位移拼接在相应页面的物理地址之后。
- 替换算法:LRU。为尽可能减少页故障,OS为每个页面设置“使用位”。
- 写策略:写回法。
7.2 快表TLB(Table Look-aside buffer)
概念:
- TLB是一个专用的高速缓冲器,用于存放近期经常使用的页表项;
- TLB中的内容是页表部分内容的一个副本;
- TLB也利用了局部性原理;
- TLB一般比Cache的标识存储器更小、更快。
进程保护方式:
- 界地址寄存器基地址,上界地址条件:检测(基地址+地址) ≤ 上界地址
- 虚拟存储器每个面增加权限给页访问标识。
- 环形保护
- 加锁和解锁