2025-43
现有 C 语言程序 P 的部分代码如下。假定运行程序 P 的计算机 M 字长为 32 位,按字节编址;数据 Cache 的数据区大小为 32 KB,采用 8 路组相联映射方式,主存块大小为 64 B,Cache 命中时间为 2 个时钟周期,缺失损失为 200 个时钟周期;采用页式虚拟存储管理方式,页大小为 4 KB;数组 d 的起始虚拟地址为 0180 0020H(VA31~VA0)。
int x, d[2048], i;
...
for (i = 0; i < 2048; i++)
d[i] = d[i] / x;
...请回答下列问题:
(1) 主存地址中 Cache 组号字段和块内地址字段分别占几位?虚拟地址中哪些位可作为 Cache 索引?
(2) d[100] 的虚拟地址是多少?d[100] 所在主存块对应的 Cache 组号是多少?
(3) 假设执行 for 语句时对应代码已在 Cache 中,变量 i 和 x 已装入寄存器,数组 d 已调入主存但不在 Cache 中,则 d[0] 在其所在主存块内的偏移量是多少(用十六进制表示)?for 语句执行过程中,访问数组 d 的 Cache 缺失率和数组元素的平均访问时间分别是多少(缺失率百分比保留两位)?
(4) 数组 d 分布在几个页中?若执行 for 语句时对应代码已经在主存,但数组 d 还未调入主存,则执行 for 语句过程中,访问数组 d 所引起的缺页次数是多少?
(1)Cache 组号字段占 6 位,块内地址字段占 6 位;可用虚拟地址 VA11~VA6 作为 Cache 索引。
(2)d[100] 的虚拟地址为 0180 01B0H;对应的 Cache 组号字段为 000110B,即 06H(十进制 6)。
(3)d[0] 的块内偏移量为 20H。数组共涉及 129 个主存块;循环对数组的读、写共 4096 次,缺失 129 次,故缺失率为 129/4096≈3.15%,平均访问时间为 2+0.0315×200=8.30 个时钟周期。
(4)数组 d 分布在 3 个页中;访问数组 d 引起的缺页次数为 3 次。