文章目录
1 缓存
缓存是指地址离开处理器后遇到的最高级(或第一级)存储器层次结构。该结构利用了时间局限性和空间局限性
1.1 缓存性能
处理器停顿周期数: 处理器在等待存储器访问而停顿的周期数目。
C
P
U
执
行
时
间
=
(
C
P
U
时
钟
周
期
数
+
存
储
器
停
顿
周
期
数
)
×
时
钟
周
期
数
目
CPU执行时间=(CPU时钟周期数+存储器停顿周期数)\times 时钟周期数目
CPU执行时间=(CPU时钟周期数+存储器停顿周期数)×时钟周期数目
其中,存储器停顿周期数取决于确实数目和每次缺失的成本(缺失代价)
存
储
器
停
顿
周
期
=
缺
失
数
×
缺
失
代
价
=
I
C
×
缺
失
指
令
×
缺
失
代
价
=
I
C
×
存
储
器
访
问
指
令
×
缺
失
率
×
缺
失
代
价
\begin{aligned} 存储器停顿周期&=缺失数\times缺失代价 \\ \\ &=IC\times \frac{缺失}{指令} \times 缺失代价\\ \\ &=IC\times \frac{存储器访问}{指令} \times 缺失率 \times 缺失代价 \end{aligned}
存储器停顿周期=缺失数×缺失代价=IC×指令缺失×缺失代价=IC×指令存储器访问×缺失率×缺失代价
上述公式给出了缓存优化和设计的目标
1.2 缓存基本概念
- 缓存块:在缓存中存取数据的最小单位
- 缓存组:缓存块可以映射的有限个位置构成组(set)
- 缓存关联度:组内位置的数目称为缓存关联度
2. 缓存基本结构
缓存容量远远小于内存大小,因此在缓存的使用过程中,不可避免地存在 如何使用缓存? 在使用过程中,主要有以下四个基本问题:
- 放置
- 查找
- 替换
- 写入
2.1 缓存放置
- 直接映射
某个缓存块只能映射到某一个固定位置 - 全相连映射
缓存块可以映射到任意位置 - 组相连映射
2.2 缓存查找
标识位 :比对是否从缓存中查找到(即缓存是否命中)
索引位 :用于索引缓存组
块偏移:从 cache block 中选择合适的字节
此外,在地址中还有一些标示位(valid,dirty等等)
2.3 缓存替换
当发生 cache miss 后,从缓存中清除哪个数据?把新数据放到哪个位置?
2.3.1 LRU
依赖于局限性,替换最近最少使用的块,需跟踪块的增长
2.3.2 FIFO
LRU 在硬件实现过程中可能非常复杂,因此可以使用 FIFO 来近似LRU
2.3.3 RANDOM
硬件实现最简单,从set中随机选择一个合适的位置
2.4 写入
相较于写入而言,读取操作比较简单;
在读取和比对标志的同时从缓存中读取块。只要有了块地址就开始读取块,若标志匹配的话就直接返回所需数据给处理器;没有匹配的话则忽略所读值即可。
2.4.1 不同的写入策略
- 直写:写入缓存的同时写入主存 (简单,简化数据一致性)
- 写回:写入缓存,不写入主存,只有发生替换时才写入(存储器通信流量小)
2.4.2 写缺失
- 写入分派:发生缺失时将该块读到缓存中,再执行写入命中操作(与读缺失类似)
- 无写入分派:仅修改下一级,而不放到缓存中
通常来讲,写回缓存采用写入分派,直写缓存采用无写入分派策略。