Appearance
题目
某计算机按字节编址,数据 Cache 共有 1024 行,采用 4 路组相联映射,主存块大小为 32B,若访问主存地址为 1028 的 4 字节数据,则该数据所在主存块对应的组号为( )。
错因
A
把块内偏移当成了组号。1028 mod 32 = 4 是地址在 32 字节块内的偏移位置(用于定位"块里的第几个字节"),与组号无关。组号要先除掉块内偏移、得到块号,再 mod 组数。选 A 的人少做了"先把字节地址压缩成块号"这一步。
B
把块大小算成了 64B(误以为按总线 / 字宽算)。这样块号 = 1028 / 64 = 16,组号 = 16 mod 256 = 16。但题目明说块大小 = 32B,不要被"4 字节数据"或"4 路"等数字干扰把块大小算错。
D
把块大小算成了 16B。这样块号 = 1028 / 16 = 64,组号 = 64 mod 256 = 64。原因可能是把"4 字节数据访问长度"和"块大小"混在一起算(比如以为块就是访问粒度),或者把 32B 漏掉一半写成 16。
总解析
地址划分通用流程(组相联映射):
上图按本题参数(5 位块内偏移 + 8 位组号 + 19 位 Tag)画出,与标准 32 位地址布局一致。
第一步:求各字段位数
| 参数 | 计算 | 位数 |
|---|---|---|
| 块大小 = 32 B | 块内偏移占 5 位 | |
| 总行数 / 路数 = 1024 / 4 = 256 组 | 组号占 8 位 | |
| 剩余 | — | Tag |
第二步:把字节地址 1028 拆成上面三段
地址 1028 的二进制:
按 [Tag | 组号 | 块内偏移] 切片(自高位到低位 = 19 + 8 + 5 位):
| 字段 | 比特位 | 值(十进制) |
|---|---|---|
| 块内偏移(低 5 位) | 0 0100 | 4 |
| 组号(中间 8 位) | 0010 0000 | 32 |
| Tag(高 19 位) | 全 0 | 0 |
第三步(验证):用除法核对
| 步骤 | 计算 | 结果 |
|---|---|---|
| 块号 | (整除) | 块号 = 32 |
| 组号 | 组号 = 32 | |
| 块内偏移 | 偏移 = 4 |
两种方法都得到组号 32。
最终答案是 C(32)。
关键速查:
| 量 | 公式 |
|---|---|
| 块号 | |
| 组号 | 块号 组数 |
| 组数 | 总行数 路数 |
| 块内偏移 | 字节地址 块大小 |
避坑:
- 1024 是总行数,不是组数。组数 = 行数 ÷ 路数 = 256
- 块号要用字节地址 ÷ 块大小,不能直接用字节地址 mod 组数
- "4 字节数据"是访问长度,与块大小无关