在高速缓存中,为什么用地址中间的位作索引,而不是高位?

设 (S, E, B, m) = (2, 1, 32, 8),即高速缓存有 2 个组,每组 1 行,每个块 32 个字节,地址 8 位

则地址可分成:组索引 s = 1bit、块偏移 b = log2B = 5bit、标记 t = 8 - s - b = 2bit,即 (t, s, b) = (2, 1, 5)

设结构体 X 有 32 字节,创建结构体数组 X[2]

采用中位作索引

						t  s b
&X[0] =  0 = 00000000 = 00 0 00000 
&X[1] = 32 = 00100000 = 00 1 00000

X[0] 和 X[1] 分别存放在组 0 和组 1 中

采用高位作索引

						s t  b
&X[0] =  0 = 00000000 = 0 00 00000 
&X[1] = 32 = 00100000 = 0 01 00000

X[0] 和 X[1] 都将会存放在组 0
当 X[0] 和 X[1] 无法同时存放在高速缓存中
如果以 X[0], X[1], X[0], X[1]…… 的顺序访问,则会发生抖动

更类似的情况是地址相差一个块大小的两个变量(地址分别为 00000000 和 00100000)

  • 如果采用地址高位作索引,则会映射在同一组中。
  • 如果采用中位,则会映射在不同组的高速缓存块中。

如果 E >= 1,则会存放在同一组的不同行,但是变量个数增加为 4 的话,也就无法同时存放 4 个了。如果 S = 4,并且采用中位作索引,则会同时存放这 4 个变量。

参考资料

[[Book - CSAPP]] 6.4.2 p432

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值