(CSAPP第三版系列)导航篇传送门
6.24
这个文件由4000个逻辑块组成,并且对于磁盘,Tavg seek = 4ms, Tmax rotation = 4ms, 而Tavgrotatioin = 2ms。
A. 最好情况是块被映射到连续的扇区,在同一柱面上这样就可以不移动读写头来一块接一块地读。一旦读写头定位到了第一个扇区,需要磁盘转4整圈(平均每个磁道上1000扇区)。
所以读这个文件的总时间为:4ms + 2ms + 4*Tmaxrotationi = 22ms。
B. 随机的情况:在这种情况中,块被随机地映射到扇区上,读4000块中的每一块都需要Tavg seek + Tavg rotation。
所以读这个文件的总时间为:4000*(4ms + 2ms) = 24000ms。
6.28 这个问题是关于练习题6.12中的高速缓存的
A. 所有会在组2中命中的十六进制内存地址:无,因为组2中所有行的有效位标记均为0。
B. 所有会在组4中命中的十六进制内存地址:0x18F0,0x18F1,0x18F2,0x18F3,0x00B0,0x00B1,0x00B2,0x00B3。
C. 所有会在组5中命中的十六进制内存地址:0x0E34,0x0E35,0x0E36,0x0E37。
D. 所有会在组7中命中的十六进制内存地址:0x1BDC,0x1BDD,0x1BDE,0x1BDF。
6.32对于内存地址0x16E8重复作业6.31
A. 地址格式(每个小框表示一位):
B. 内存引用:
参数 |
值 |
高速缓存块偏移(CO) |
0x0 |
高速缓存组索引(CI) |
0x2 |
高速缓存标记(CT) |
0xB7 |
高速缓存命中?(是/否) |
否 |
返回的高速缓存字节 |
0x- |
6.36
A. 情况1不命中率是100%。
原因:这种情况下,高速缓存大小只能容纳该二维数组的一行,并且x[0][i]和x[1][i]总是映射到同一个高速缓存行,所以对一个数组的引用总是驱逐出另一个数组的有用的行,即每个操作都会不命中。
B. 情况2不命中率是25%。
原因:这种情况下,高速缓存可以正好容纳下这个数组,因此所有的不命中都是开始时的冷不命中。不命中率 = sizeof(int) / BlockSize = 4/16 = 25%。
C. 情况3不命中率是25%。
原因:这种情况下,高速缓存只能保存数组的1/2,扫描数组的第二部分会驱逐扫描第一部分时加载进来的那一行。并且由于使用了两路组相连,扫描数组的两部分的过程中,不命中率都是sizeof(int)/BlockSize = 25%,则总不命中率 = 25%。
D. 对情况3,更大的高速缓存大小不会帮助降低不命中率。
原因:根据对情况三的分析,缓存的总大小不是限制因素,限制因素是块的大小。(miss_rate= sizeof(int)/BlockSize)。
E. 对情况3,更大的块大小会帮助降低不命中率。
原因:根据对情况三的分析,缓存不命中的限制因素就是块的大小(miss_rate= sizeof(int)/BlockSize),所以更大的块会减低不命中率。
6.40
A. 写总数为16*16*4 = 1024次。
B. 根据6.38中的假设,每个块可以存放2个结构体元素,且整个高速缓存的大小为square数组大小的一半。在给出的程序代码中,前一个循环的写次数是256次,其中不命中率为50%,则不命中数为128次;后一个循环的写次数是256*3次,不命中数仍为128次。即总的不命中数为256次。
C. 由A和B结果可知,不命中率是25%。
6.44
mountain程序在本机运行结果如下图所示:可以重点观察s5及以后的列上的数据(前面数据受到预取的影响),不难看出数据在32k, 256k和4m-8m之间均有明显突变。所以可以估计本机cache大小:L1:32K,L2:256K,L3:4MB-8M。且与CPU-Z检测结果相符合。