最近拖了一会时间没有更新,之后打算写写CCF的备考,今天接着上回说的cache,来讨论下cache的性能以及影响其性能的因素。

1)性能漫谈

讲性能当然要提起我们的CPU
我们假设存储器阻塞的时间周期主要来自于cache的缺失:
存储器阻塞时钟周期数 = (指令数/程序数) * 缺失率 * 缺失代价
这部分相对比较重要的是
(平均存储器访问时间):
= 命中时间 * 命中率 + 缺失率(命中时间 + 缺失代价)
= 命中时间 + 缺失率 * 缺失代价

2)我说:“只有一个组相联”

这部分我将会介绍cache中非常重要的cache 放置机制:
2.1)直接映射:一个块只能放在cache中的确定的位置。
在直接映射中,cache中只有一个比较器(用于比较
而不是
),因为一次只需要比较一个块,因此查找cache时效率较高,但是缺失率也比较高。
在直接映射中所需要的索引位:
。
在直接映射中所需要的标记位:除去
和
的高位。
2.2) 全相联:一个块可以放在cache中的任意位置。
在全相联中,cache有多个比较器----因为cache存放在任意位置为了让检索的过程更加有效率因此有多个比较器对cache中的块进行并行比较,但是需要注意到是这样加大了硬件的开销,因此全相联只适合块数较小的cache。在全相联中,缺失率会显著降低,但是命中时间会增加。
在全相联中所需要的索引位: 不需要索引位
在全相联中所需要的标记位:除去块内偏移都是标记位(爽×
2.3)都是组相联!!!
在阅读完前面的文章我们肯定发现全相联与直接映射各有优劣,那么有不有那么一种方式能够同时继承两种方法各自比较优越的地方呢?
这里我们就要提到:组相连,直接映射(每个存储器对应确定的组)+全相联(一个块可以放在组内任意位置).
后面就按下不表了,非常容易分析。
接着分析的是替换策略,假如cache满了怎么办?这里介绍两种方法:
以及
第一种LRU,非常容易理解就是我最近用过我就把他的优先级调低,假如新进入一个块所有的优先级都得加1,达到“放弃水平”的就会直接被丢掉。(×
第二种FIFO,管你在不在里面,先来的先走其实也就是一个队列(√
但是需要注意的是在做题过程种FIFO假如给了图表,判断n个地址访问后的情况。当需要弹出时直接在弹出的位置补上替换块的信息就好,不需要全面往前推一个!!!