[第六章] 深入理解计算机系统第三版 家庭作业参考答案

6.22

磁道数 d 与 r - x * r 成正比
设 d = k(r - x * r) = kr(1 - x)
总容量 c = 2πxk(r^2)(1 - x) = 2πk(r^2)(x - x^2)
上式实际上是关于 x 的二次式,其对称轴为 1/2,即当 x = 1/2 时取最大值

6.23

平均旋转延迟:
T_arg_rotation = 1/2 * T_max_rotation = 1/2 * 60s/15000 RPM * 1000ms/s = 2ms
平均传送时间:
T_arg_tranfer = 60s/15000 RPM * 1/800扇区/磁道 * 1000ms/s = 0.005ms
总时间:
T_access = T_arg_rotation + T_arg_tranfer + T_arg_seek = 6.005ms

6.24

和书上6.4一样,但是我不懂为什么 1MB / 512B = 2000,有大佬给我解释一下么? 按照我的理解,可能是近似。
这儿按照书上的做法 2MB/512B = 4000,即需要 4000 个逻辑块,所以是 4 整圈
T_max_rotation = 60s/15000 RPM * 1000ms/s = 4ms,T_arg_seek = 4ms, T_arg_rotation = 1/2 * T_max_rotation = 2ms
A.
T = T_max_rotation * 4 + T_arg_rotation + T_arg_seek = 22ms
B.
T = 4000(T_arg_rotation + T_arg_seek) = 24000ms

6.25

高速缓存 m C B E S t s b
1 32 1024 4 4 64 24 6 2
2 32 1024 4 256 1 30 0 2
3 32 1024 8 1 128 22 7 3
4 32 1024 8 128 1 29 0 3
5 32 1024 32 1 32 22 5 5
6 32 1024 32 4 8 24 3 5

6.26

高速缓存 m C B E S t s b
1 32 2048 8 1 256 21 8 3
2 32 2048 4 4 128 23 7 2
3 32 1024 2 8 64 25 6 1
4 32 1024 32 2 16 23 4 5

6.27

A.
标记位为 45 时:
CT = 01000101 CI = 001 CO = XX
因此地址为 0x08A4 ~ 0x08A7

标记位为 38 时:
CT = 00111000 CI = 001 CO = XX
因此地址为 0x0704 ~ 0x0707

B.
0x1238 ~ 0x123B

6.28

A.
全都不命中

B.
0x18F0 ~ 0x18F3
0x00B0 ~ 0x00B3

C.
0x0E34 ~ 0x 0E37

D.
0x1BDC ~ 0x1BDF

6.29

A.

12 11 10 9 8 7 6 5 4 3 2 1 0
CT CT CT CT CT CT CT CT CT CI CI CO CO

B.

操作 地址 命中? 读出的值(或者未知)
0x834 未命中 未知
0x836 命中 未知
0xFFD 命中 C0

6.30

A.
C = B * E * S = 128

B.

12 11 10 9 8 7 6 5 4 3 2 1 0
CT CT CT CT CT CT CT CT CI CI CI CO CO

6.31

A.

12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 1 1 1 0 0 0 1 1 0 1 0

B.

参数
高速缓存块偏移 CO 0x2
高速缓存组索引 CI 0x6
高速缓存标记 CT 0x38
高速缓存命中?
返回的高速缓存字节 0xEB

6.32

A.

12 11 10 9 8 7 6 5 4 3 2 1 0
1 0 1 1 0 1 1 1 0 1 0 0 0

B.

参数
高速缓存块偏移 CO 0x0
高速缓存组索引 CI 0x2
高速缓存标记 CT 0xB7
高速缓存命中?
返回的高速缓存字节 -

6.33

CT=B6或BC

0x1788 ~ 0x178B
0x16C8 ~ 0x16CB

6.34

dst数组:

列0 列1 列2 列3
行0 m m m m
行1 m m m m
行2 m m m m
行3 m m m m

src数组:

列0 列1 列2 列3
行0 m m h m
行1 m h m h
行2 m m h m
行3 m h m h

6.35

dst数组:

列0 列1 列2 列3
行0 m h h h
行1 m h h h
行2 m h h h
行3 m h h h

src数组:

列0 列1 列2 列3
行0 m h h h
行1 m h h h
行2 m h h h
行3 m h h h

6.36

A.
x[0]的地址是 0,x[1] 的地址是 512,因此 x[0][i]、x[1][i] 会映射到同一块。
不命中率为 100%

B.
不会发生覆盖,一个缓存块为 16 字节,能放 4 个 int,仅有第一个 int 不命中,其余 3 个都命中,因此不命中率为 25%

C.
和 B 差不多

D.
不会,高速缓存再大,第一个 int 都不会命中

E.
会,这样的话,后几个 int 会命中,自然不命中率会降低

6.37

函数 N=64 N=60
sumA 25% 25%
sumB 100% 25%
sumC 50% 25%

N=64,很简单,不写了。

N=60,A比较简单,总是第一次不命中,后三次命中;BC情况较复杂,建议写程序解决,不过我们手写一下也是可以的。
4KB/16B=256,即 256 个缓存块,我们给这些块命名 1、2、3 … 256,可以写出 B 的访问序列:
1 16 31 46 61 76 91 106 121 136 151 166 181 196 211 226 241 256
15 30 45 60 75 90 105 120 135 150 165 180 195 210 225 240 255
14 29 44 59 74 89 104 119 134 149 164 179 194 209 224 239 254
13 28 43 58 73 88 103 118
上面是从 a[0][0] 到 a[60][0] 的访问序列,全不命中。但是访问 a[0][1] 到 a[60][1] 、a[0][2] 到 a[60][2]、a[0][3] 到 a[60][3] 都会命中(因为 四个为一组 存放在同一个缓存块中,而且不会被覆盖)。很容易将其推广,四次访问命中三次,因此不命中率为 25%。

C 的访问序列虽与 B 有些差别,但是高速缓存的行为类似。

6.38

A. 16 * 16 * 4 = 1024
B. 1024 / 8 = 128
C. 1/8

6.39

A. 1024
B. 1024 / 4 = 128
C. 1/4

6.40

A. 1024
B. 2^7 + 2^7 = 2^8
C. 1/4

6.41

1/4

6.42

1/4

6.43

100%

6.44

6.45

6.46

你可能感兴趣的:(CSAPP)