Appearance
第5章:缓存、主存与地址翻译
存储层次
寄存器、缓存、DRAM 和外部存储在容量、速度和成本上不同。缓存按块搬运数据,利用时间局部性与空间局部性,保存更大存储的一部分副本。
直接映射缓存中,一个块只能进入一个位置;组相联允许进入某一组中的任意路,全相联允许进入任意位置。提高相联度可减少部分冲突,却增加比较、替换与能耗成本。
32 KiB、64 B 块、8 路组相联缓存有 组。若使用 32 bit 地址直接索引,则块内偏移 6 bit,组索引 6 bit,标签 20 bit。这里未计元数据空间,也未涉及虚拟索引引起的额外限制。
失效与写策略
首次访问产生强制失效;工作集过大产生容量失效;映射限制还可能造成冲突失效。分类通常通过与同容量全相联缓存比较完成,不能只看一次访问的结果。
写直达把写入继续送到下一层,写回先标记脏块,替换时再回写。写分配与是否写回是不同维度:前者决定写失效时是否把块装入本层。
单级平均访问时间可近似为
命中 1 ns,失效率 5%,额外失效代价 80 ns,得到 5 ns。失效代价若已经包含命中查询时间,应先统一定义,避免重复计数。
TLB 与页表
虚拟地址翻译按页工作,缓存按缓存块工作,二者粒度和目标不同。TLB 保存近期地址翻译;TLB 未命中时要查页表,但页可能仍在 DRAM 中,因此不一定发生缺页。
页表项可能包含物理页号、权限和状态。操作系统更改映射后,需要使相关处理器不再使用过期 TLB 项;仅修改内存中的页表并不保证旧翻译立即消失。
访问模式与性能
按行存储的二维数组,内层循环连续访问列通常能利用一条缓存块中的多个元素;反向步长可能浪费块内数据。分块算法把临时工作集限制在缓存中,降低重复装入。
缓存未命中次数仍不足以完整预测时间。硬件预取、多个并发未完成访存、DRAM 带宽与地址依赖都会改变等待能否重叠。
练习
- 同容量缓存由 8 路变成 4 路,组数和地址位划分怎样变化?
- 区分 cache miss、TLB miss 和 page fault。
- 两个程序失效次数相同,为什么运行时间仍可能差很多?