直接映射高速缓存
判断是否命中,获取目标数据的过程一共分为三步,分别是组选择、行匹配以及字抽取
组选择:根据组索引进行
行匹配:对比tag值,因此,行匹配最终的结果无非就是命中或者不命中。命中后进行字抽取。
字抽取:通俗点讲,就是从数据块的什么位置开始抽取数据。
冲突不命中,抖动:x[0]~x[3]的块被加载回组0,覆盖掉y[0]~y[3]的块。因而现在我们就有了一个冲突不命中,而且实际上后面每次对×和y的引用都会导致冲突不命中,因为我们在x和y的块之
间抖动(thrash)。术语“抖动”描述的是这样一种情况,即高速缓存反复地加载和驱逐相同的高
速缓存块的组。
为什么用中间的位来做索引?
你也许会奇怪,为什么高速缓存用中间的位来作为组索引,而不是用高位。为什么用中间的位更好,是有很好的原因的。图6-33说明了原因。如果高位用做索引,那么一些连续的存储器块就会映射到相同的高速缓存块。例如,在图中,头四个块映射到第一个高速缓存组,第二个四个块映射到第二个组,依此类推。如果一个程序有良好的空间局部性,顺序扫描一个数组的元素,那么在任何时刻,高速缓存都只保存着一个块大小的数组内容。这样对高速缓存的使用效率很低。相比较而言,以中间位作为索引,相邻的块总是映射到不同的高速缓存行。在这种情况下,高速缓存能够存放整个大小为C的数组片,这里C是高速缓存的大小。
组相连
与直接映射不同,组相联cache的每个set允许包含多个cache line,1<E<C/B(C为cache大小,B为每个block大小)