计算机体系结构——内存缓存

计算机体系结构——内存缓存

缓存的种类有很多,其中最重要的一个是内存缓存。内存缓存处于内存主存和 CPU 寄存器之间,解决两种访问速度不匹配的问题。其中处在 CPU 内部的叫 L1 缓存,也叫芯片内缓存。随着性能需求的发展,开发出了芯片外缓存 L2 缓存,通过缓存总线和 CPU 中的 总线接口相连,甚至还有 L3 缓存,附加在内存总线上。

基本内存缓存结构

内存缓存由以下组成,一个大小为 S = 2 s S = 2^s S=2s 的集合,集合中的一个元素包含 E E E 行,每一行包含一个比特位为校验位,包含 B = 2 b B = 2^b B=2b 个数据块,每个数据块包含一字节的空间储存缓存。另外还包含 t = m − s − b t = m - s - b t=msb 位的识别区,其中 m m m 是内存地址的位数。

因此,缓存大小的计算方式为 C = S × E × B C = S \times E \times B C=S×E×B 字节。

通过一个简单的哈希函数进行定位, CPU 发送内存地址 A A A 到达缓存,缓存将 A A A 划分成三个区域,第一个区域包含 s s s 位,定位了缓存在哪个集合元素中,第二个区域包含 t t t 位的识别区,缓存进行查找集合内的行比较识别区,找到对应的行。第三个区域包含 b b b 位,定位了缓存在哪个数据块中。

直接映射缓存

E = 1 E = 1 E=1 即每个集合元素只有一行的时候,,称为直接映射缓存。

直接映射缓存是最简单的一种缓存类型,即不用进行对 Tag 位的查找。

每次从内存读取到缓存的时候,都会直接读取一行的数据。

联合缓存

联合缓存是指 1 < E < C / B 1 \lt E \lt C / B 1<E<C/B 的缓存结构,也称 E-路 缓存。

联合缓存必须每次查找和检查对应的 Tag 位。

联合缓存可以实现多种行替换策略,例如 LFU 替换近期使用次数最少的行,或者是 LRU 。

完全联合缓存

完全联合缓存是指 E = C / B E = C / B E=C/B 的缓存结构,只有一个集合元素。

这种缓存结构不需要 Set 位,但是也存在缺点,即缓存不能做的太大,否则查询 Tag 位将花费大量的时间。因此这类缓存应用的范围很小。

写回内存

面对写回内存,有以下几种方式:

  1. 写穿策略:不通过缓存,直接更新内存数据,缺点也很明显,速度太慢。
  2. 写回策略:通过更新缓存,当缓存即将被抛弃时再更新内存。缺点是必须设置一个脏位来记录数据是否被更新,增加了算法的复杂程度。

对于是否命中缓存区分下面两种方法:

  1. 分配写回:如果缓存没有命中,那么先加载内存到缓存,然后再更新缓存。写回策略就是这种方法。
  2. 非分配写回:直接写回内存。

指令缓存和通用缓存

指令作为内存数据的一部分,也可以被缓存器缓存,称为指令缓存 i-cache ,而数据缓存称为 d-cache 。这两个缓存要么只能缓存指令,要么只能缓存数据。而通用缓存两者都可以缓存。

一般来说 L1 缓存包含指令缓存和数据缓存两部分。而 L2 和 L3 则是通用缓存。

影响缓存性能的因素

总体来说,影响缓存性能的因素包含:

  1. 失效率:即失效次数除以总引用次数。
  2. 命中率:即命中次数除以总引用次数。
  3. 命中时间:指缓存传输一个字所需要的时间,包括集合选择,行选择,块选择的时间,对于 L1 缓存一般在 1-2 个时钟周期。
  4. 失效罚时:缓存失效带来的额外读取时间,从 L1 到 L2 大概在 5-10 个时钟周期,而从内存到 L1 在 25-100 个时钟周期。

你可能感兴趣的:(计算机体系结构,缓存)