Appearance
题目
若计算机主存地址为 32 位,按字节编址,Cache 数据区大小为 32KB,主存块大小为 32B,采用直接映射方式和回写策略,则 Cache 行的位数至少是( )。
错因
B
漏算了脏位(dirty bit)。题目明说采用回写策略——回写策略下每行必须配 1 位脏位(标记本行是否被修改过、替换出去时要不要写回主存)。算成 17(tag)+ 1(valid)+ 256(data)= 274,少了一个 1。常见诱因:套用了"全写法(write-through)不需要脏位"的模板,把策略当成全写。
C
漏算了标记位(tag)。把 Cache 行误当成"只装数据 + 控制位",没考虑直接映射也需要 17 位标记区分映射到同一行的不同主存块。计算 1(valid)+ 1(dirty)+ 256(data)= 258。直接映射下"主存块 → Cache 行"是多对一关系,没有 tag 根本没法判定命中。
D
同时漏算 tag 和 dirty,只剩 1(valid)+ 256(data)= 257。两个漏点叠加。这是把 Cache 行简化成"标志位 + 数据"模型时最极端的版本,公式应是 行 = tag + valid + dirty + data(直接映射 + 回写)。
总解析
第一步:分解主存地址结构
- 块内偏移:主存块 = 32B = → 5 位
- 行索引:Cache 行数 = → 10 位
- 标记:$32 - 10 - 5 = $ 17 位
第二步:列出 Cache 行的组成
| 字段 | 位数 | 必需性 |
|---|---|---|
| 有效位 valid | 1 | 总要——标识本行是否装有有效数据 |
| 脏位 dirty | 1 | 回写策略才有——记录本行是否被改过 |
| 标记 tag | 17 | 直接映射 / 组相联都要 |
| 数据 data | 块大小 × 8 |
第三步:求和
最终答案是 A(275)。
Cache 行公式速查:
| 写策略 | 行结构 |
|---|---|
| 全写(write-through) | valid + tag + data |
| 回写(write-back) | valid + dirty + tag + data |
关键易错点:
- 回写必带脏位——题目里看到"回写"立刻在公式里 +1 位
- tag 位数 = 主存地址位数 − 索引位数 − 块内偏移位数
- data 部分单位是 位(块大小 × 8),不要写成字节