3.3 Cache 的基本原理与映射方式

程序访问的局部性原理,Cache 的工作原理与性能计算,直接映射、全相联映射与组相联映射。

考查要求 ★★★ 重点掌握 局部性原理命中率平均访问时间直接映射全相联映射组相联映射地址划分

程序访问的局部性原理

  • 时间局部性:在最近的未来要用到的信息,很可能是现在正在使用的信息,因为程序中存在循环;
  • 空间局部性:在最近的未来要用到的信息,很可能与现在正在使用的信息在存储空间上是邻近的,因为指令通常是顺序存放、顺序执行的,数据一般也是以向量、数组等形式簇聚地存储在一起的。

Cache 的基本工作原理

把主存与 Cache 都划分为大小相等的块(Cache 的块也称为行),Cache 与主存之间以块为单位交换信息。CPU 发出读请求时:

  1. 若访存地址在 Cache 中命中,就将此地址转换成 Cache 地址,直接对 Cache 进行读操作,与主存无关;
  2. 若 Cache 不命中,则仍需访问主存,并把此字所在的块一次性地从主存调入 Cache(若此时 Cache 已满,则需根据某种替换算法用这个块替换 Cache 中原来的某块信息)。

地址映射方式

由于 Cache 行数比主存块数少得多,因此主存中只有一部分块的信息可放在 Cache 中。必须应用某种方法,把主存的地址定位到 Cache 中,称为地址映射。为了区分 Cache 中的行来自主存的哪一块,每行需要一个标记(Tag);同时还需要一个有效位(V)说明该行中的信息是否有效。

直接映射标记Cache 行号块内地址全相联映射标记块内地址组相联映射标记组号块内地址

直接映射

主存中的每一块只能装入 Cache 中的唯一位置:

Cache 行号=主存块号 mod Cache 总行数\text{Cache 行号} = \text{主存块号} \bmod \text{Cache 总行数}
  • 优点:实现简单,只需比较一次 Tag,速度快;
  • 缺点:不够灵活,即使 Cache 中别的位置空着也不能占用,冲突概率高,块冲突时会出现频繁的”抖动”,命中率最低。

全相联映射

主存中的每一块可以装入 Cache 中的任何位置,每行的标记用于指出该行取自主存的哪一块,所以 CPU 访存时需要与所有行的标记进行比较。

  • 优点:比较灵活,Cache 块的冲突概率低,空间利用率高,命中率也高;
  • 缺点:标记的比较速度较慢,实现成本较高,通常需采用昂贵的按内容寻址的相联存储器。

组相联映射

将 Cache 分成 QQ 个大小相等的组,每个主存块可以装入固定组中的任意一行,即组间采用直接映射、组内采用全相联映射:

Cache 组号=主存块号 mod Q\text{Cache 组号} = \text{主存块号} \bmod Q

每组有 rr 行时称为 rr 路组相联。当 Q=1Q = 1 时变为全相联映射;当 r=1r = 1 时变为直接映射。

下面的模拟器默认采用 2 路组相联、LRU 替换。切换映射方式,对比同一段访存序列的命中率:

动画演示Cache 的映射方式与替换算法
主存块号的划分:Tag(高位)—组号(1 位)—行组VTag主存块最近访问000—10—210—30—访问记录主存块 j 映射到 Cache 的第 (j mod 2) 组,可放在组内任意一行(共 2 行);Tag = ⌊j / 2⌋
当前访问的组命中缺失 / 被替换
1/312 路组相联映射:Cache 共 4 行,分为 2 组(每组 2 行)。访问序列给出的是主存块号。替换算法:LRU

即时练习

即时练习4 题
点击选项即可作答
  1. 1
    某计算机的 Cache 共有 16 块,采用 2 路组相联映射方式(即每组 2 块)。每个主存块大小为 32 字节,按字节编址。主存 129 号单元所在主存块应装入的 Cache 组号是( )。
  2. 2
    (408 真题 2012)假设某计算机按字编址,Cache 有 4 个行,Cache 和主存之间交换的块大小为 1 个字。若 Cache 的内容初始为空,采用 2 路组相联映射方式和 LRU 替换算法,当访问的主存地址依次为 0, 4, 8, 2, 0, 6, 8, 6, 4, 8 时,命中 Cache 的次数是( )。
  3. 3
    若 Cache 命中率为 95%,Cache 存取周期为 50 ns,主存存取周期为 250 ns,采用先访问 Cache、未命中再访问主存的方式,则平均访问时间为( )。
  4. 4
    下列关于 Cache 映射方式的说法中,正确的是( )。
学完了吗?

标记完成后,侧栏会显示进度。进度仅保存在本浏览器中。