假定主存地址为 32 位,按字节编址,指令 Cache 和数据 Cache 与主存之间均采用 8 路组相联映射方式,直写(WriteThrough)写策略和 LRU 替换算法,主存块大小为 64B,数据区容量各为 32KB。开始时 Cache 均为空。请回答下列问题。
(1) Cache 每一行中标记(Tag)、LRU 位各占几位?是否有修改位?
(2) 有如下 C 语言程序段:
for(k = 0; k < 1024; k++)
s[k] = 2 * s[k];
若数组 s 及其变量 k 均为 int 型,int 型数据占 4B,变量 k 分配在寄存器中,数组 s 在主存中的起始地址为 008000C0H,则该程序段执行过程中,访问数组 s 的数据 Cache 缺失次数为多少?
(3) 若 CPU 最先开始的访问操作是读取主存单元 00010003H 中的指令,简要说明从 Cache 中访问该指令的过程,包括 Cache 缺失处理过程。
[tag_link]
1)主存块大小为 64B=2 字节,所以主存地址低 6 位为块内地址,Cache 组数为32KB/(64B×8) = 64 =26,故主存地址中间 6 位为 Cache 组号,主存地址中高 32-6-6=20 位为标记,采用 8 路组相联映射,故每行中的 LRU 位占 3 位,采用直写方式,故没有修改位。 2)0080 00C0H = 0000 0000 1000 0000 0000 0000 1100 0000B,主存地址的低 6 位为块内地址,为全 0,故 s 位于一个主存块的开始处,占 1024×4B/64B=64 个主存块:在执行程序段的过程中,每个主存块中的 64B/4B=16 个数组元素依次读、写 1 次,因而对每个主存块,总是第一次访问缺失,此时会将整个主存块调入 Cache,之后每次都命中。综上,数组 s 的数据 Cache 访问缺失次数为 64 次。 3)0001 0003H = 0000 0000 0000 0001 0000 0000 0000 0011B,根据主存地址划分可知,组索引为 0,故该地址所在主存块被映射到指令 Cache 的第 0 组;因为 Cache 初始为空,所有 Cache 行的有效位均为 O,所以 Cache 访问缺失。此时,将该主存块取出后存入指令 Cache 的第 0 组的任意一行,并将主存地址高 20 位(00010H)填入该行标记字段,设置有效位,修改 LRU 位,最后根据块内地址 000011B 从该行中取出相应的内容。