计算机系统使用 16 位内存地址。它有一个 2K 字节的高速缓存,以直接映射方式组织,每个高速缓存块 64 字节。假设每个内存字的大小为 1 个字节。
执行程序时,处理器从以下字地址依次读取数据:
128, 144, 2176, 2180, 128, 2176
以上所有地址均以十进制值显示。假设缓存最初是空的。上述给定地址的缓存命中率是 __________ 。
(一) 0.333
(乙) 0.666
(C) 0.353
(D) 0.535答案:(一)
说明:首先,查找单词、块和标签大小:
块大小 = 64 字节 = 2 6字节 = 2 6 个字(因为 1 个字 = 1 个字节)
因此,字字段中的位数 = 6
缓存大小 = 2K 字节 = 2 11字节
缓存块数 = 缓存大小 / 块大小 = 2 11 /2 6 = 2 5
因此,块字段中的位数 = 5
地址位总数 = 16
因此,标签字段中的位数 = 16 – 6 – 5 = 5
对于给定的 16 位地址,最高 5 位代表标签,接下来的 5 位代表块,最低 6 位代表字。
现在,检查给定地址的缓存命中或未命中:
缓存最初是空的。因此,所有的缓存块都是无效的。
- 访问#1:
- 访问#2:
地址 = (144) 10 = (0000000010010000) 2
对于此地址,标签 = 00000,块 = 00010,字 = 010000
由于在这次访问之前缓存块 00010 的标签字段是 00000,这将是一个缓存命中(因为
地址标签 = 块标签) - 访问#3:
地址 = (2176) 10 = (0000100010000000) 2
对于此地址,标签 = 00001,块 = 00010,字 = 000000
由于在此访问之前缓存块 00010 的标记字段是 00000,因此这将是缓存未命中
(地址标签≠块标签)
这次访问后,缓存块 00010 的 Tag 字段设置为 00001 - 访问#4:
地址 = (2180) 10 = (0000100010000100) 2
对于此地址,标签 = 00001,块 = 00010,字 = 000100
由于在这次访问之前缓存块 00010 的标签字段是 00001,这将是一个缓存命中(地址
标签 = 块标签) - 访问#5:
地址 = (128) 10 = (0000000010000000) 2
对于此地址,标签 = 00000,块 = 00010,字 = 000000
由于在此访问之前缓存块 00010 的标记字段是 00001,因此这将是缓存未命中
(地址标签≠块标签)
此访问后,缓存块 00010 的 Tag 字段设置为 00000 - 访问#6:
地址 = (2176) 10 = (0000100010000000) 2
对于此地址,标签 = 00001,块 = 00010,字 = 000000
由于在此访问之前缓存块 00010 的标记字段是 00001,因此这将是缓存未命中
(地址标签≠块标签)
此访问后,缓存块 00010 的 Tag 字段设置为 00001
地址 = (128) 10 = (0000000010000000) 2
(注:地址显示为16位数字,因为电脑使用的是16位地址)
对于此地址,标签 = 00000,块 = 00010,字 = 000000
由于在这次访问之前缓存是空的,这将是一个缓存未命中
此访问后,缓存块 00010 的 Tag 字段设置为 00000
因此,缓存命中率 = 命中次数 / 访问次数 = 2/6 = 0.333。
选项(A)是正确的。
这个问题的测验