Appearance
题目
某计算机使用 4 体交叉编址存储器,假定在存储器总线上出现的主存地址(十进制)序列为 8005,8006,8007,8008,8001,8002,8003,8004,8000,则可能发生访存冲突的地址对是( )。
错因
A
只看到 8004 和 8008 都落在体 0(地址 mod 4 = 0),就直接判冲突——忽略了它们在序列中的位置间隔。8008 在第 4 位、8004 在第 8 位,间隔 4 个时钟周期,正好等于 4 体交叉的存储周期 。也就是说,体 0 在被 8008 启动后过 4 个时钟就恢复空闲,正好可以接 8004——不冲突。判冲突不能只看"体号相同",还要看"间隔是否 ≥ m(体数)"。
B
8002 mod 4 = 2,8007 mod 4 = 3——这俩根本不在同一个体上,怎么也冲突不了。挑 B 的人多半是没拿计算器(或心算)算各地址的体号,看到"两个地址相邻"就猜冲突。
C
8001 mod 4 = 1,8008 mod 4 = 0——也是不同体,不冲突。错答原因同 B:没用模运算算体号,凭直觉选。
总解析
核心思路:4 体交叉编址下,发生冲突的条件是 "两次访问落在同一个体" 且 "间隔 < 4 个时钟周期"——前者用 判定,后者数序列位置。
第一步:算每个地址的体号(mod 4)
| 序号 | 地址 | mod 4 | 落在第几体 |
|---|---|---|---|
| 1 | 8005 | 1 | 体 1 |
| 2 | 8006 | 2 | 体 2 |
| 3 | 8007 | 3 | 体 3 |
| 4 | 8008 | 0 | 体 0 |
| 5 | 8001 | 1 | 体 1 |
| 6 | 8002 | 2 | 体 2 |
| 7 | 8003 | 3 | 体 3 |
| 8 | 8004 | 0 | 体 0 |
| 9 | 8000 | 0 | 体 0 |
体 0 出现在位置 4、8、9(共 3 次),其余每体各 2 次。
第二步:判定冲突的两个条件
4 体交叉的工作机制:单体存储周期 = ,每个时钟启动一个体,4 个时钟启动完所有 4 个体后,第 1 个体已经空闲、可被再次启动。
| 同体两次访问的位置间隔 | 是否冲突 |
|---|---|
| 间隔 ≥ 4(体已恢复空闲) | 否 |
| 间隔 < 4(前一次还在忙) | 是 ⚠️ |
第三步:检查所有"同体"配对
体 0 共 3 次:位置 4、8、9。两两组合:
| 同体对 | 位置间隔 | 是否冲突 |
|---|---|---|
| 8008(位 4) — 8004(位 8) | 4 | 否(恰好等于体周期,刚恢复就接) |
| 8008(位 4) — 8000(位 9) | 5 | 否(间隔 ≥ 4) |
| 8004(位 8) — 8000(位 9) | 1 | 是 ⚠️(前一次还在忙) |
体 1 两次(位 1、5),间隔 4,不冲突。 体 2 两次(位 2、6),间隔 4,不冲突。 体 3 两次(位 3、7),间隔 4,不冲突。
唯一的冲突就在 8004 与 8000 这一对。
第四步:核对各选项
| 选项 | 体号 | 间隔 | 是否冲突 |
|---|---|---|---|
| A. 8004 ↔ 8008 | 0, 0 | 4 | 否 |
| B. 8002 ↔ 8007 | 2, 3 | — | 否(根本不同体) |
| C. 8001 ↔ 8008 | 1, 0 | — | 否(根本不同体) |
| D. 8000 ↔ 8004 | 0, 0 | 1 | 是 ✓ |
最终答案是 D(8000 和 8004)。
多体交叉访存冲突判定的两步法:
- 先用 (m = 体数)算每个地址的体号——不同体直接淘汰
- 同体的,看序列位置间隔——间隔 < m 才是真冲突
为什么巧妙的取序列:本题地址序列特意构造成 8005~8008、8001~8004、8000,前两段各自 4 个连续地址都落在 4 个不同体,无冲突;只有最后一个 8000 紧跟 8004(同体),间隔仅 1,才暴露出冲突。出题人显然在考"是否会区分'同体' vs '同体且间隔不足'"。