本节书摘来自异步社区《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》一书中的第2章,第2.13节,作者:【美】Curt Schimmel著,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.13 习题
2.1 除了I/O控制器上的设备寄存器之外,无缓存的数据还能用在其他什么地方?
2.2 请解释如果高速缓存中的有效位在系统加电复位期间没有清除将会发生什么情况?(在高速缓存中使用的存储设备加电时往往具有随机的内容。)
2.3 为什么高速缓存中的每一行都需要有它自己的标记?
2.4 为什么采用地址的“位<9..2>”来索引一个512行直接映射高速缓存的散列算法是一种不好的选择?如果高速缓存是双路组相联高速缓存又会怎样?
2.5 请解释在使用本章介绍的技术时高速缓存的行数为什么是或可能不是2的整数幂?
2.6 考虑一个直接映射高速缓存,它以地址的“位<17..8>”来索引1024行高速缓存。每一行包含16字节。如果程序一般仅仅占用从0x1000到0x4fff范围内的地址,那么这是一种好的散列算法吗?解释为什么是或者为什么不是。如果高速缓存是16路组相联高速缓存又会怎样?
2.7 考虑一个写回、双路组相联高速缓存,它有4096行,每行16字节。应该将哪几位用于散列算法?为什么?需要行的标记部分中的多少位来保持地址(假定使用32位地址和随机替换策略)?在标记中为地址使用最少的位数同保存全部32位地址相比,高速缓存所需的位数节省了百分之多少?
2.8 有一个7路组相联高速缓存,每行256字节,总共512组,应该使用什么样的散列算法?
2.9 考虑下面对直接映射、写直通高速缓存的组织结构的两种选择。两者都保存2048字节(2 KB)的数据(不包括标记和控制位)。一种组织结构是使用4字节的行,另一种使用32字节的行。每一种选择中,包括数据、标记和控制位在内,高速缓存总共需要多少位?讨论在两种方案之间进行选择时,应该注意的有关硬件成本和性能的折中考虑。假定系统使用32位的地址。
2.10 考虑这样一种环境,其中经常运行文本处理程序。这些程序的特征是它们经常要把字符串从一个地方复制到另一个地方,并且在缓冲区内产生字符串。在这样的环境中最好是使用写回还是写直通高速缓存机制?应该使用写分配吗?阐述理由。
2.11 描述下面一段代码的高速缓存局部性。系统使用独立的指令和数据高速缓存,两者均为8 KB双路组相联高速缓存,每行16字节。数据高速缓存使用带有写分配功能的写回策略(假定int类型是32位的)。如果行的大小增加到256字节,会发生什么样的情况?
struct {
int rec_id;
char rec_name[16];
int value;
int flags;
} array[1000];
…
int i, sum;
sum = 0;
for ( i=0; i<1000; i++)
sum += array[i].value;
2.12 一个系统采用双路组相联高速缓存,每行8字节,总共16行。高速缓存使用带有写分配功能的写回策略以及LRU替换策略。假定高速缓存内的所有行在初始时都是无效的。主存储器包含以下数据:
地址 数据
01230 33
01234 44
01270 7
01274 8
02270 67
02274 42
03270 43
03274 46
03650 100
03654 200
06730 120
06734 210
08670 10
08674 20
08600 64
08640 76
09830 333
09834 355
接着出现了下面的存储器引用(每次引用一个完整的字):
从01234载入
把5保存到03650
从08670载入
从08674载入
从01274载入
从08670载入
把99保存到09834
把12保存到02270
从01230载入
从06730载入
从03654载入
把37保存到03654
绘制类似于图2-11的图,显示出上面列出的存储器引用完成后的高速缓存内容。包括每行修改位的状态,此外要显示出主存储器最终的内容。
2.13 一个程序通过每次将一个字保存到存储器连续的地址中来使存储器清零。观察一个系统,它采用带有写分配的写回高速缓存,在一开始被清零的存储器块并没有被高速缓存起来的时候,该系统会发生什么样的情况?假定行的大小比一个字大,第一次把数据保存到每一行中的时候会造成一次缺失,要从主存储器读取该行的内容。随后,程序把零保存到高速缓存行中,替换掉从主存储器读取的老数据。因此,读取高速缓存行是对存储器带宽的一种浪费,因为CPU从来不会读取这些数据。假定要被清零的存储器块的起始地址始终和高速缓存行的起始位置相对应,要被清除的存储量是高速缓存行大小的倍数,那么请推荐一种特殊用途的高速缓存操作,比如一条新指令,从而让存储器的填零操作效率更高。