ZJZJ / ICS NOTES
整本阅读
COMPUTER SYSTEMS · PEKING UNIVERSITY

11 · 旧期中扩展:存储器与缓存

对应教材第 6 章;旧期中缓存大题与选择题。不属于日程所示第一次阶段测验范围。

存储技术与组织#

SRAM 用双稳态电路保持状态,通常更快、更贵、密度低,用于缓存;DRAM 以电容电荷存储,需要刷新,密度高,用于主存。二者通常断电丢失数据。ROM/PROM/EPROM/EEPROM/Flash 是非易失类别,写入/擦除特性不同,不能因有“RAM”或“ROM”名字就推断所有访问规则。

DRAM 以行列组织,RAS 选行装入行缓冲,CAS 选列;复用地址引脚降低引脚需求。同一行连续访问可以复用行缓冲。FPM 是快页模式,EDO 延长数据输出有效时间并重叠后续访问,SDRAM 与时钟同步,DDR 在时钟两边沿传输。宽度、频率、通道数和有效传输率共同影响带宽。

SSD 的 NAND Flash 按页读写、按更大块擦除,需要地址映射、垃圾回收和磨损均衡;随机读延迟低于旋转盘,但写放大和擦写寿命等不能忽略。磁盘也会机械磨损,不能说“只有 SSD 会磨损”。

磁盘容量与时间#

容量 = 盘片数×每片有效面数×每面磁道数×每道扇区数×每扇区字节数。实际分区记录使不同 zone 的扇区数可不同,应按题设求和或平均。GB 通常按 10⁹,GiB 按 2³⁰。

每转时间 = 60/RPM 秒 = 60000/RPM 毫秒
平均旋转延迟 = 半转 = 30000/RPM 毫秒
传送一扇区时间 = 每转时间/每道扇区数
访问时间 ≈ 寻道 + 旋转延迟 + 传送 (+ 题设控制器开销)

7200 RPM 时一转约 8.333 ms,平均旋转约 4.167 ms。最短时间可能无需等待一整次平均旋转;题目给出磁头初始位置、方向和访问次序时按几何位置分析。RPM 是转/分钟,不能直接当转/秒。

局部性与缓存层次#

时间局部性:重复使用最近访问的对象;空间局部性:访问邻近地址。取指本身也有局部性;即使没有数据数组,循环也可能体现指令时间/空间局部性。

缓存把下层数据按块复制到上层。命中时间、失效率与失效处罚共同决定性能,命中率高不一定总时间短。块越大有利于空间局部性,但减少固定容量中块的数量、增加传送代价与污染。

参数与地址划分#

S = 2^s 组;每组 E 行;每块 B = 2^b 字节
数据容量 C = S·E·B
m 位地址分为 tag(t=m-s-b) | set index(s) | block offset(b)
block = address // B
set   = block % S
tag   = block // S
offset= address % B

E 是相联度,不是块大小;容量 C 通常不含 tag、valid、dirty 等元数据。常规位切分要求 S、B 是 2 的幂,E 不必须是 2 的幂,t 是位数更不必是 2 的幂。直接映射 E=1;全相联 S=1;组相联介于两者之间。

若题目问实际总存储位数,要加 S·E·(8B+t+valid位+dirty位),再按题设计 LRU 等状态。改 E 不改变地址的 set/offset 划分;改 S 或 B 会改变划分,这是 2024 扩容题的关键。

一次访问的流程#

取组索引 → 在该组中检查 valid 且 tag 相等的行 → 命中则按 offset 取字节 → 未命中则找空行或按替换策略淘汰 → 装入整个对齐块 → 更新元数据。tag 相同但 valid=0 不是命中。跨块访问可能需要访问两块,不能只检查起始地址。

LRU 淘汰最久未被访问的行,命中也更新新旧顺序;FIFO 按进入先后,命中不改变排队次序;随机替换另按题设。所有策略只在对应组内选牺牲行,不跨组比较年龄。

手工模拟完整例子#

m=5、B=4、S=2、E=2,初始空、LRU。序列:2、23、13、9、20、15、13、10。

地址 块号 组 tag 结果 解释
2 0 0 0 miss 载入 M[0..3]
23 5 1 2 miss 载入 M[20..23]
13 3 1 1 miss 载入 M[12..15]
9 2 0 1 miss 载入 M[8..11]
20 5 1 2 hit 23 已带入该块
15 3 1 1 hit 13 已带入该块
13 3 1 1 hit 更新时间
10 2 0 1 hit 9 已带入该块

总 4 次命中、4 次失效,命中率 50%。地址跨度不等于缓存次数,块内连续字节通常共享一次带入。

写策略是两组独立选择#

场景 选项 行为
写命中 write-through 直写 同时向下一层传递写入
写命中 write-back 写回 只改本层并置 dirty,淘汰脏块时写回
写失效 write-allocate 写分配 把块带入再修改
写失效 no-write-allocate 不写分配 绕过本层向下层写,不装入该块

常见搭配是写回+写分配、直写+不写分配,但并非逻辑上唯一合法组合。写回不表示“所有淘汰都写”,只有脏块需要写。写失效次数与总内存传输次数不同,可能同时有脏块写回、读入新块和写入。

失效类型与平均访问时间#

冷/强制失效:第一次访问块。冲突失效:同组映射竞争,即使总容量足够仍相互替换。容量失效:工作集太大,理想同容量全相联也装不下。并发系统还可有一致性失效,本课基本模型通常不涉及。

AMAT = hit time + miss rate × miss penalty,前提 miss penalty 是命中探测后的额外代价;如果题目给“失效总时间”,应写加权平均而不重复加命中时间。多级时 L2 局部失效率与全局失效率不同:全局 L2 miss 率通常为 L1 miss 率×L2 local miss 率。

数组、步长与 memory mountain#

若 int 为 4 字节、B=64 字节,一个对齐块容纳 16 个 int;顺序读冷数组通常每 16 个元素一次强制失效,但行首对齐、跨块、写分配、共享缓存和冲突都可能改变结果。步长 ≥ 块大小可能每次碰新块;多个数组基址映射同组会抖动。

二维数组按行内 j 递增通常空间局部性好;按列跨行步长为列数×元素宽度。分块需要让同时使用的小块工作集适合 cache,还应避免组冲突。Memory mountain 中工作集大小轴展示不同层次容量效应,步长轴展示空间局部性效应。

Victim cache 保存刚被主 cache 淘汰的块,通常小而全相联,用来缓解冲突;按题设跟踪主缓存与 victim 之间的交换,不把它简单等同于扩大某一组。

自检#

能从 C/S/E/B 求位划分和反求地址;能按 LRU 模拟读写并统计流量;能分清写命中与写失效策略;能计算磁盘时间;能分析遍历顺序和工作集;能对题目新增“不缓存某些块”规则重新执行状态机。