| 情况 | 判定条件 | 动作 | 周期 |
|---|---|---|---|
| HIT | 行 valid=1 且 行 tag == 请求 tag | 直接从该行取 / 写 offset 位 | 1 |
| 冷启动缺失 | 行 valid=0(还没被任何块占用) | 取整块 → 填行 → 置 valid、写 tag | 8 |
| 冲突缺失 | valid=1 但 tag 不同 | 挤掉原块 → 取新块 → 填行 → 改 tag | 8 |
| 旁路(无 cache) | cache 关闭 | 每次直接走 DRAM | 8 |
为什么缺失要按「整块」取:DRAM 一次 RAS/CAS 已经把整行 8 位读进了行缓冲,多取 7 位几乎不要钱,
而下一句很可能就用得到(空间局部性)。所以 cache 的行宽 = 块宽 = 8 位,一次填满。
周期模型是教学简化:HIT 1 拍(tag 比较 + 行内选择),MISS 8 拍(对应上一关 ACTIVATE + CAS + 传输);
真实处理器还有多级 cache、乱序执行与非阻塞缺失,缺失代价可以摊到别的指令上,所以 AMAT 不是简单加权。
写策略:本页用 写直达 + 写分配 —— 写命中时同时改 cache 行和 DRAM(保证两侧一致),写缺失时先把块取进来再写。
另一种是写回(加 dirty 位,只在被挤出时才写回 DRAM),能少写一次但要额外维护脏位,多核下还要处理一致性。
三种缺失的来源不同:冷启动是「第一次总要付学费」,冲突是「映射规则撞车」,容量是「工作集比 cache 大」。
改映射方式只能治冲突(两路组相联能把 0/4 抖动降到 50% 缺失),治不了冷启动;把行数加倍才能治容量。
本页 4 行是刻意做小的,让 8 个块必然抢行,缺失才看得见。