Appearance
题目
某计算机主存地址为 32 位,按字节编址,某 Cache 的数据区容量为 32KB,主存块大小为 64B,采用 8 路组相联映射方式,该 Cache 中比较器的个数和位数分别为( ),
错因
B
比较器个数选对(8 个),但 Tag 位数算错。把组索引位数用错——可能用 替代了 ,于是 位。易错根源:混淆了"路数 = 组内行数"和"组索引位数 = 组数的对数"。
C
Tag 位数算对了(20),但比较器个数搞错——把组数 64 当成了比较器数。组相联里每次访存只激活 1 个组,组内 8 行需要 8 个比较器并行比对——总共需要的比较器是"路数"(= 组内行数 = 8),不是"组数"。把组数当比较器数实际上接近"全相联"的算法(全相联里所有 Cache 行同时参与比较,比较器数 = 行数)。
D
两个都错(同 B + C)。组索引用 算成 3 → tag = 23;比较器用组数 = 64。两个错叠加。
总解析
第一步:拆主存地址
主存地址 32 位,按字节编址:
| 字段 | 位数 | 来源 |
|---|---|---|
| 块内偏移 Offset | 块大小 | |
| 组索引 Index | 见第二步 | |
| 标记 Tag | 剩余 |
第二步:算组数与组索引位
总 Cache 行数 = 行。
8 路组相联 → 每组 8 行 → 组数 = 组。
→ 组索引位数 = 位。
第三步:算 Tag 位数
第四步:算比较器个数
组相联 Cache 命中判定流程:
- 用 Index 选中1 个组(共 64 组中的某一组)
- 该组内有 8 行(8 路)
- 把待查的 Tag 同时与 8 行的 Tag 比对——需要 8 个比较器并行
| 映射方式 | 比较器个数 | 比较器位数 |
|---|---|---|
| 直接映射 | 1 | Tag 位数 |
| 8 路组相联 | 8 | Tag 位数(= 20) |
| 全相联 | 总行数(= 512) | Tag 位数 |
结论:8 个比较器,每个 20 位。
最终答案是 A(8,20)。
关键易错点:
- 比较器个数 = 路数(不是行数、也不是组数)
- 组索引位数 = ,不是
- 组数 = 总行数 ÷ 路数
速查表(这道题):
| 量 | 公式 | 值 |
|---|---|---|
| 总行数 | 容量 ÷ 块大小 | |
| 组数 | 总行数 ÷ 路数 | |
| 组索引位 | 6 位 | |
| 块内偏移 | 6 位 | |
| Tag 位 | 地址位 − 索引 − 偏移 | |
| 比较器个数 | = 路数 | 8 |