【分析解答】
第 3 版 · OCR 辅助 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照
## 【分析解答】
(1)系统 A 使用 RAID 1 技术,采用避盘镜像方式存储,所以,所用避盘容量为 $10\mathrm{TB} + 10\mathrm{TB} = 20\mathrm{TB}$。系统 B 使用 RAID 5 技术,采用一个奇偶校验盘,假设使用 5 个避盘阵列,那么 10TB 的数据需要 2.5TB 来存放冗余的奇偶校验数据,所以系统 A 比系统 B 多用 7.5TB 存储容量。
(2)系统 A 的写入速度取决于两个避盘中速度慢的那个,因为所有盘写一块数据的时间都是 30ms,故系统 A 写入一块数据的时间是 30ms。对于系统 B,最坏的情况下,写一块数据的时间为 2 次读和 2 次写,即所用时间为 $4 \times 30\mathrm{ms} = 120\mathrm{ms}$。
(3)系统 A 更可靠,因为系统对整个避盘都进行了备份,所以即使所有的数据都损坏了也可以恢复,而系统 B 只是记录了部分冗余信息,如果两个避盘的相同位都损坏了就恢复不出来了。
11. 假定在一个使用 RAID 5 的系统中,采用先更新数据块、再更新校验块的信息更新方式。如果在更新数据块和更新校验块的操作之间发生了掉电现象,那么会出现什么问题?采用什么样的信息更新方式可避免这个问题?
## 【分析解答】
对于 RAID 5 来说,如果在写完数据块但未写入校验块时发生断电,则写入的数据和对应的校验信息不匹配,无法正确恢复数据。这种情况可以避免,因为 RAID 5 是大数据块交叉方式,每个盘独立进行操作,所以,只要同时写数据块所在盘和校验块所在盘即可。
12. 已知字符编码 $A = 1000001, a = 1100001, 0 = 0110000$,求 D,d,6 的 7 位 ASCII 码和第一位前加入奇校验位后的 8 位编码。
## 【分析解答】
D 的 ASCII 码为 $1000001 + 011 = 1000100$,前面加奇校验位后的编码是 11000100。
d 的 ASCII 码为 $1100001 + 011 = 1100100$,前面加奇校验位后的编码是 01100100。
6 的 ASCII 码为 $0110000 + 110 = 0110110$,前面加奇校验位后的编码是 10110110。
13. 某数据为 $11100101\mathrm{B}$,采用奇校验和 CRC 校验(生成多项式为 $x^{4} + x + 1$)对应的校验码各是什么?
## 【分析解答】
采用奇校验时,因为数据中有奇数个 1,故校验位为 0;采用 CRC 校验时,生成多项式为 $x^{4} + x + 1$,故有 4 个校验位。首先在数据后面添 4 个 0,得到 $111001010000\mathrm{B}$,再将它和 10011 进行模 2 除法,得到余数为 $1100\mathrm{B}$,所以校验码为 $1100\mathrm{B}$。
<!-- page: 222 -->
14. 假定某计算机的总线采用偶校验,每8位数据有一位校验位,若在32位数据线上传输的信息是 1234 5678H,则对应的4个校验位应为什么?若接收方收到的数据信息和校验位分别为 1235 5678H 和 0100B,则说明发生了什么情况,给出验证过程。
## 【分析解答】
总线上传输的4字节分别为0001 0010、0011 0100、0101 0110、0111 1000B,因此对应的4个偶校验位 $\mathrm{P_0\sim P_3}$ 分别为 $0,1,0,0$。当接收方收到数据信息1235 5678H和校验位0100B后,进行如下验证。
第1字节:数据为 $12\mathrm{H} = 00010010\mathrm{B}$,故偶校验位 $\mathrm{P_0^{\prime} = 0,0\oplus 0 = 0}$,说明传输正确。
第2字节:数据为 $35\mathrm{H} = 00110101\mathrm{B}$,故偶校验位 $\mathrm{P_0^{\prime} = 0,0\oplus 1 = 1}$,说明传输错误。
第3字节:数据为 $56\mathrm{H} = 01010110\mathrm{B}$,故偶校验位 $\mathrm{P_0^{\prime} = 0,0\oplus 0 = 0}$,说明传输正确。
第4字节:数据为 $78\mathrm{H} = 01111000\mathrm{B}$,故偶校验位 $\mathrm{P_0^{\prime} = 0,0\oplus 0 = 0}$,说明传输正确。
15. 假定一个 16 位数据 $M_{16}M_{15}M_{14}M_{13}M_{12}M_{11}M_{10}M_{9}M_{8}M_{7}M_{6}M_{5}M_{4}M_{3}M_{2}M_{1}$ 为 0111 1000 1101 0010B,要求写出该 16 位数据的 SEC 码(单检错码),并说明 SEC 码如何正确检测数据位 $M_{5}$ 的错误。
## 【分析解答】
对于16位数据的单检错码,其校验位 $P$ 和故障字 $S$ 都是5位。假定故障字 $S = S_{3}S_{4}S_{3}S_{2}S_{1}$ 的值反映出错数据位或校验位的位置信息,则得到码字排列和故障字的取值如下。
[tbl-41.md](tbl-41.md)
根据上表,得到各个校验位的计算公式如下。
$$
P _ {1} = M _ {1} \oplus M _ {2} \oplus M _ {4} \oplus M _ {5} \oplus M _ {7} \oplus M _ {9} \oplus M _ {1 1} \oplus M _ {1 2} \oplus M _ {1 4} \oplus M _ {1 6}
$$
$$
P _ {2} = M _ {1} \oplus M _ {3} \oplus M _ {4} \oplus M _ {6} \oplus M _ {7} \oplus M _ {1 0} \oplus M _ {1 1} \oplus M _ {1 3} \oplus M _ {1 4}
$$
$$
P _ {3} = M _ {2} \oplus M _ {3} \oplus M _ {4} \oplus M _ {8} \oplus M _ {9} \oplus M _ {1 0} \oplus M _ {1 1} \oplus M _ {1 5} \oplus M _ {1 6}
$$
$$
P _ {4} = M _ {5} \oplus M _ {6} \oplus M _ {7} \oplus M _ {8} \oplus M _ {9} \oplus M _ {1 0} \oplus M _ {1 1}
$$
$$
P _ {5} = M _ {1 2} \oplus M _ {1 3} \oplus M _ {1 4} \oplus M _ {1 5} \oplus M _ {1 6}
$$
当数据字为0111 1000 1101 0010B时,代入上述公式,得到校验位 $P = P_{5}P_{4}P_{3}P_{2}P_{1} = 01111\mathrm{B}$。若第5位数据 $M_{5}$ 出错时,数据字变为0111 1000 1100 0010B,代入上述公式,得到 $P^{\prime} = P_{5}^{\prime}P_{4}^{\prime}P_{3}^{\prime}P_{2}^{\prime}P_{1}^{\prime} = 00110\mathrm{B}$,因而,故障字 $S = S_{5}S_{4}S_{3}S_{2}S_{1} = 01111\oplus 00110 = 01001\mathrm{B},M_{5}$ 排在码字的第9位,因此 $M_{5}$ 出错。
16. 假设要传送的数据信息为 1110001B,若约定的生成多项式为: $G(x) = x^{3} + 1$ ,则校验码为多少?假定在接收端接收到的数据信息为 1110011B,说明如何正确检测其错误,写出检测过程。
## 【分析解答】
原数据信息为1110001B,对应的报文多项式为 $M(x) = x^{6} + x^{5} + x^{4} + 1$ ,生成多项式
<!-- page: 223 -->
的位数为 4 位,因此,校验码的位数为 3 位。在原数据信息后面添加 3 个 0,得到 $M'(x) = x^3 M(x) = x^5 + x^8 + x^7 + x^3$,用 $M'(x)$ 去模 2 除 $G(x)$,得到余数 110B,因此,在发送端要传送的 CRC 码为 111 0001 110B。在接收端收到的数据位为 111 0011B,假定 CRC 码中的校验位在传送过程中没有出错,在接收端还是 110B,则在接收端对数据校验时,将接收端的 CRC 码 111 0011 110B 用生成多项式 $G(x)$ 进行模 2 除,得到的余数为 010B,余数不为 0 表明传输时发生了错误。
17. 现代计算机中,SRAM 一般用于实现快速小容量的 cache,而 DRAM 用于实现慢速大容量的主存。以前超级计算机通常不提供 cache,而是用 SRAM 来实现主存(如 Cray 巨型机),请问:如果不考虑成本,你还这样设计高性能计算机吗?为什么?
【分析解答】
不会。其理由主要有以下两个方面。
(1)主存越大越好,主存大,缺页率降低,因而减少了访问磁盘所需的时间。DRAM 芯片的集成度比 SRAM 芯片的高得多,因而用 DRAM 芯片比用 SRAM 芯片构成的主存容量大得多。
(2)程序访问的局部性特点使得 cache 的命中率很高,因而 CPU 访问的主要是 cache,对主存的访问不多,而且现代 DRAM 芯片中也有 SRAM 构成的行缓冲。因此,即使主存没有用快速的 SRAM 芯片而是用 DRAM 芯片,也不会对存储访问速度有多大影响。
18. 某计算机主存地址空间大小有 8MB,分成 32768 个主存块,按字节编址;cache 可存放 8KB 数据(不包括有效位、标记等附加信息),采用直接映射方式,问 cache 共有多少行?主存地址如何划分?要求说明每个字段的含义、位数和在主存地址中的位置。
【分析解答】
每个主存块大小为 $8\mathrm{MB} / 32768 = 256\mathrm{B}$,故 cache 共有 $8\mathrm{KB} / 256\mathrm{B} = 32$ 行。直接映射方式下,cache 行号(即行索引)有 5 位;由于每个主存块大小为 256B,按字节编址,故块内地址为 8 位;主存地址空间大小为 8MB,所以地址位数为 23 位,故主存地址中标记有 $23 - 5 - 8 = 10$ 位。综上所述,主存地址共有以下三个字段:高 10 位为标记字段,中间 5 位为行索引,低 8 位为块内地址。
19. 某计算机主存地址空间大小为 1GB,按字节编址。cache 可存放 64KB 数据,主存块大小为 128B,采用直接映射和直写(write through)方式。请回答下列问题:
(1)主存地址如何划分?要求说明每个字段的含义、位数和在主存地址中的位置。
(2)cache 的总容量为多少位?
【分析解答】
(1)cache 共有 $64\mathrm{KB} / 128\mathrm{B} = 512$ 行,直接映射方式下,cache 行号占 9 位;由于每个主存块大小为 128B,按字节编址,故块内地址为 7 位;主存地址空间大小为 1GB,所以主存地址位数为 30 位。主存地址中标记有 $30 - 9 - 7 = 14$ 位。综上所述,主存地址共有以下三个字段:高 14 位为标记,中间 9 位为行索引,低 7 位为块内地址。
(2)因为直接映射不考虑替换算法,所以 cache 行中没有用于替换的控制位;因为采用直写方式,所以,cache 行中也没有修改位。每个 cache 行中包含 1 位有效位、14 位标记位和 128B 的数据,因此,cache 总容量为 $512 \times (1 + 14 + 128 \times 8)b = 519.5\mathrm{Kb}$。
20. 对于数据的访问,分别给出具有下列要求的程序或程序段的示例。
<!-- page: 224 -->
(1) 空间局部性和时间局部性都好。
(2) 时间局部性好,空间局部性差。
(3) 空间局部性好,时间局部性差。
(4) 时间局部性和空间局部性都差。
【分析解答】
对于按行优先存放在内存的多维数组,如果按列优先访问数组元素,则空间局部性就差;如果在一个循环体中某个数组元素只被访问一次,则时间局部性就差。假定二维数组 $a[1000][1000]$ 按行优先存放在内存,以下给出的4个程序片段用于对数组 $a$ 进行相应的处理,它们具有相同的功能,但数组访问的时间局部性和空间局部性截然不同(不考虑编译器的优化)。
(1) 时间局部性和空间局部性都好的程序片段。
for(i=0; i&lt;1000; i++)
for(j=0; j&lt;1000; j++) {
sum=sum+a[i][j];
product=product*a[i][j];
square=square+a[i][j]*a[i][j];
}
(2) 时间局部性好,空间局部性差。
for(j=0; j&lt;1000; j++)
for(i=0; i&lt;1000; i++) {
sum=sum+a[i][j];
product=product*a[i][j];
square=square+a[i][j]*a[i][j];
}
(3) 空间局部性好,时间局部性差。
for(i=0; i&lt;1000; i++)
for(j=0; j&lt;1000; j++)
sum=sum+a[i][j];
for(i=0; i&lt;1000; i++)
for(j=0; j&lt;1000; j++)
product=product*a[i][j];
for(i=0; i&lt;1000; i++)
for(j=0; j&lt;1000; j++)
square=square+a[i][j]*a[i][j];
(4) 时间局部性和空间局部性都差。
for(j=0; j&lt;1000; j++)
for(i=0; i&lt;1000; i++) {
sum=sum+a[i][j];
for(j=0; j&lt;1000; j++)
for(i=0; i&lt;1000; i++) {
product=product*a[i][j];
}
<!-- page: 225 -->
for(j=0; j&lt;1000; j++)
for(i=0; i&lt;1000; i++) {
square=square+a[i][j]*a[i][j];
21. 假定某计算机的主存地址空间大小为 64KB,按字节编址;cache 采用 4 路组相联映射、LRU 替换和写回(write back)策略,能存放 4KB 数据,主存与 cache 之间交换的主存块的大小为 64B。请回答下列问题:
(1)主存地址字段如何划分?要求说明每个字段的含义、位数和在主存地址中的位置。
(2)cache 的总容量有多少位?
(3)若 cache 初始为空,CPU 依次从 0 号地址单元顺序访问到 4344 号单元,共重复访问 16 次。cache 存取时间为 20ns,主存存取时间为 200ns,试估计 CPU 访存的平均时间。
【分析解答】
(1)cache 的行数为 $4\mathrm{KB} / 64\mathrm{B} = 64$;因为采用 4 路组相联,所以每组有 4 行,共 16 组。主存地址空间大小为 64KB,按字节编址,所以主存地址有 16 位,其中低 6 位为块内地址,中间 4 位为组号(组索引),高 6 位为标记。
(2)因为采用写回策略,所以 cache 每行中要有一个修改位(dirty bit);因为每组有 4 行,所以每行有两位 LRU 位。此外,每行还有 6 位标记、1 位有效位和 64B 数据,共有 64 行,故总容量为 $64 \times (6 + 1 + 1 + 2 + 64 \times 8) = 33408$(位)。
(3)因为块大小为 64B,CPU 总共访问了 4345 个单元,因为 $4345 / 64 = 67.89$,所以第 0~4344 单元应该对应前 68 块(第 0~67 块),即 CPU 访问过程是对主存的前 68 块连续访问 16 次。图 7.3 给出了访问过程中主存块和 cache 行之间的映射关系。图中列方向是 cache 的 16 个组,行方向是每组的 4 行。
[tbl-42.md](tbl-42.md)
图 7.3 题 21 中 cache 组和主存块之间的映射
主存的第 0~15 块分别对应 cache 的第 0~15 组,可以放在对应组的任意一行中,在此假定按顺序存放在第 0 行;主存的第 16~31 块分别对应 cache 的第 0~15 组,放到第 1 行中;同理,主存的第 32~47 块分别放到 cache 的第 0~15 组的第 2 行中;主存的第 48~63 块分别放到 cache 的第 0~15 组的第 3 行中。这样,访问主存的第 0~63 块都是没有冲突的,每块都是第一次在 cache 中没有找到,然后把这一块调到 cache 对应组的某一行中,这样该块后面的每次访问都能在 cache 中找到。因此,每一块只有第一单元未命中,其余 63 个单元都命中。主存的第 64~67 块分别对应 cache 的第 0~3 组,此时这 4 组的 4 个行都已经被主存块占满,所以这 4 组的每一组都要选择一个主存块从 cache 中淘汰出来。因为采
<!-- page: 226 -->
用 LRU 算法,所以,将最近最少用的第 $0\sim 3$ 块分别从第 $0\sim 3$ 组的第 0 行中替换出来。再把第 $64\sim 67$ 块分别放到 cache 第 $0\sim 3$ 组的第 0 行中,每块也都是第一次在 cache 中没有找到,调入后,每次都能在 cache 中找到。
综上所述,第一次循环中,每一块都只有第一单元未命中,其余都命中。
以后的 15 次循环中,因为 cache 第 $4\sim 15$ 组的 48 行中的主存块一直没有被替换过,所以只有 $68 - 48 = 20$ 个行中对应主存块的第一个单元未命中,其余都命中。
总访问次数为 $4345 \times 16 = 69520$,其中,未命中次数为 $68 + 15 \times 20 = 368$。
命中率 $p = (69520 - 368) / 69520 \approx 99.47\%$。平均访存时间约为 $t_{+} = t_{c} + (1 - p) \times t_{\infty} = 20ns + 200 \times (1 - 0.9947)ns = 20ns + 1.06ns = 21.06ns$。
22. 假定某计算机的 cache 采用直接映射方式,和主存交换的数据块大小为 1 个字,按字编址,一共能存放 16 字的数据。CPU 开始执行某程序时,cache 为空,在该程序执行过程中,CPU 依次访问以下地址序列:2,3,11,16,21,13,64,48,19,11,3,22,4,27,6,11。请回答下列问题:
(1) 每次访问在 cache 中是命中还是缺失?试计算访问上述地址序列的 cache 命中率。
(2) 若 cache 数据区容量还是 16 字,而数据块大小改为 4 字,则上述地址序列的命中情况又如何?说明块大小和命中率的关系。
【分析解答】
(1) cache 采用直接映射,每行存放一个字,因此共 16 行;每个主存块对应 1 个字,所以主存块号 = 字号。得到映射公式为 cache 行号 = 字号 mod 16。程序开始执行时 cache 为空,所以每个单元第一次访问总是缺失 (miss)。CPU 访问给定地址序列的过程如下(每个数字对“x-y”的含义为“x 是访问的主存地址,y 是对应的 cache 行号”。hit 表示命中,miss 表示缺失,miss/replace 表示缺失并替换):2-2:miss;3-3:miss;11-11:miss;16-0:miss;21-5:miss;13-13:miss;64-0:miss/replace;48-0:miss/replace;19-3:miss/replace;11-11:hit;3-3:miss/replace;22-6:miss;4-4:miss;27-11:miss/replace;6-6:miss/replace;11-11:miss/replace。只有一次命中!命中率为 $1 / 16 = 6.25\%$。
(2) 数据块大小改为 4 字,cache 最多能存放 16 字的数据,因此 cache 共 4 行;每个主存块对应 4 字,所以,主存块号 = [字号 / 4]。得到映射公式为:cache 行号 = 主存块号 mod 4。CPU 访问给定地址序列的过程如下(每个数字对“x-y-z”的含义为“x 是访问的主存地址,y 是对应的主存块号,z 是对应的 cache 行号”。hit 表示命中,miss 表示缺失,miss/replace 表示缺失并替换):2-0-0:miss;3-0-0:hit;11-2-2:miss;16-4-0:miss/replace;21-5-1:miss;13-3-3:miss;64-16-0:miss/replace;48-12-0:miss/replace;19-4-0:miss/replace;11-2-2:hit;3-0-0:miss/replace;22-5-1:hit;4-1-1:miss/replace;27-6-2:miss/replace;6-1-1:hit;11-2-2:miss/replace。共命中 4 次,命中率为 $4 / 16 = 25\%$。数据块变大后,命中率提高了,其原因在于块变大后空间局部性得到更大发挥。
23. 假定数组元素在主存按从左到右的下标顺序存放。试改变下列函数中循环的顺序,使得其数组元素的访问与排列顺序一致,并说明为什么修改后的程序比原来的程序执行时间短。
<!-- page: 227 -->
int sum_array(int a[N][N])
{
int i, j, k, sum = 0;
for (i = 0; i &lt; N; i++)
for (j = 0; j &lt; N; j++)
for (k = 0; k &lt; N; k++)
sum += a[k][i][j];
return sum;
}
【分析解答】
数组元素的访问顺序和排列顺序一致的程序如下。
int sum_array(int a[N][N])
{
int i, j, k, sum = 0;
for (k = 0; k &lt; N; k++)
for (i = 0; i &lt; N; i++)
for (j = 0; j &lt; N; j++)
sum += a[k][i][j];
return sum;
}
当被访问的数组元素不在 cache 时,则将该数组元素所在的一个主存块全部装入 cache,因为访问顺序和排列顺序一致,所以随后访问的若干个数组元素都和该数组元素在同一个主存块中,因而也都能在 cache 中命中。因此,修改后的程序,其数组访问的空间局部性比原程序更好,命中率更高,使得执行时间更短。
24. 某计算机的主存地址空间大小为 256MB,按字节编址。指令 cache 和数据 cache 分离,均有 8 个 cache 行,主存与 cache 交换的块大小为 64B,数据 cache 采用直接映射方式。现有两个功能相同的程序 A 和 B,其伪代码如图 7.4 所示。
图 7.4 题 24 的伪代码程序
假定 int 类型数据用 32 位补码表示,程序编译时 $i, j, \text{sum}$ 均分配在寄存器中,数组 $a$ 按行优先方式存放,其首地址为 320(十进制数)。请回答下列问题,要求说明理由或给出计算过程。
(1) 若不考虑用于 cache 一致性维护和替换算法的控制位,则数据 cache 的总容量为多少?
<!-- page: 228 -->
(2) 数组元素 $a[0][31]$ 和 $a[1][1]$ 各自所在的主存块对应的 cache 行号分别是多少 (cache 行号从 0 开始)?
(3) 程序 A 和 B 的数据访问命中率各是多少?哪个程序的执行时间更短?
【分析解答】
(1) cache 中的每一行信息除了用于存放主存块的数据区外,还有有效位、标记信息,以及用于 cache 一致性维护的修改位 (dirty bit) 和用于替换算法的使用位(如 LRU 位)等控制位。因为主存地址空间大小为 256MB,因而主存地址为 28 位,其中 6 位为块内地址,3 位为行号(行索引),标记信息有 $28 - 6 - 3 = 19$ (位)。因此,在不考虑用于 cache 一致性维护和替换算法的控制位的情况下,数据 cache 的总容量为 $8 \times (19 + 1 + 64 \times 8)b = 4256b = 532B$。
(2) 解法一:要得到某个数组元素所在块对应的 cache 行号,最简单的做法就是把该数组元素的地址计算出来,然后根据地址求出主存块号,最后用主存块号除以 8 取余数(即主存块号 mod 8)就是对应的 cache 行号。因为每个数组元素为一个 32 位 int 型变量,故占 4B。因此,$a[0][31]$ 的地址为 $320 + 4 \times 31 = 444, [444 / 64] = 6$ (取整),所以 $a[0][31]$ 对应的主存块号为 6。因为 6 mod $8 = 6$,所以对应的 cache 行号为 6。
解法二:也可以将地址转换为 28 位二进制地址,然后取出其中的行索引(即行号)字段的值,得到对应行号。将地址 444 转换为二进制表示为 0000 0000 0000 0000 000 110 111100,中间 3 位 110 为行号(行索引),因此,对应的 cache 行号为 6。
解法三:用画图的方式可以清楚地表示 cache 行和主存块之间的映射关系。(略)
同理,数组元素 $a[1][1]$ 对应的 cache 行号为 $[(320 + 4 \times (1 \times 256 + 1)) / 64] \mod 8 = 5$。
(3) 编译时 $i, j, \text{sum}$ 均分配在寄存器中,故数据访问命中率仅需要考虑数组 $a$ 的访问情况。
① 程序 A 的数据访问命中率。
解法一:由于程序 A 中数组访问顺序与存放顺序相同,故依次访问的数组元素位于相邻单元;程序共访问 $256 \times 256$ 次 $= 64\mathrm{K}$ 次,占 $64\mathrm{K} \times 4\mathrm{B} / 64\mathrm{B} = 4\mathrm{K}$ 个主存块;因为首地址正好位于一个主存块的边界,故每次将一个主存块装入 cache 时,总是第一个数组元素缺失,其他都命中,共缺失 $4\mathrm{K}$ 次,因此,数据访问的命中率为 $(64\mathrm{K} - 4\mathrm{K}) / 64\mathrm{K} = 93.75\%$。
解法二:因为每个主存块的命中情况都一样,因此,也可以按每个主存块的命中率计算。主存块大小为 64B,包含有 16 个数组元素,因此,共访存 16 次,其中第一次不命中,所以命中率为 $15 / 16 = 93.75\%$。
② 程序 B 的数据访问命中率。
由于程序 B 中的数组访问顺序与存放顺序不同,依次访问的数组元素分布在相隔 $256 \times 4 = 1024$ 的单元处,因此,依次访问的前后数组元素都不在同一个主存块中;因为数据 cache 只有 8 行,而每次内循环要调入 $256 \times 4 / 64B = 16$ 个主存块,因此,以前被装入 cache 的主存块,当需要再次访问其中的数组元素时,已经被替换出 cache,因而不能命中。由此可知,所有访问都不命中,命中率为 0。
因为程序 A 的命中率高,因此,程序 A 的执行速度比程序 B 快。
25. 图 7.5 给出了三个函数,分析比较它们的空间局部性,并指出哪个最好,哪个最差。
<!-- page: 229 -->
[tbl-43.md](tbl-43.md)
图7.5 题25中的伪代码程序