首页/计算机组成原理/03-memory/Cache命中率计算详解 🔗 在 Obsidian 中打开
计算机组成原理 · 03-memory

Cache命中率计算详解

重要度 ⭐⭐Cache存储器命中率408
速查
三个公式打天下:命中率 $h = N_c/(N_c+N_m)$、平均访问时间 $t_a = h\,t_c + (1-h)\,t_m$、访问效率 $e = t_c/t_a$

速查

项目
命中率$h = N_c / (N_c + N_m)$
平均访问时间$t_a = h \times t_c + (1-h) \times t_m$
访问效率$e = t_c / t_a$

核心概念

Cache 基本参数

  • 命中率 H:访问 Cache 命中的概率。
  • 缺失率:$1 - H$。
  • Cache 访问时间 $Tc$。
  • 主存访问时间 $Tm$。
  • 平均访问时间 $Ta = H \times Tc + (1-H) \times Tm$。

Cache 映射方式

映射方式地址划分特点
直接映射标记 + 行号 + 块内地址简单,冲突多
全相联标记 + 块内地址灵活,硬件复杂
组相联标记 + 组号 + 块内地址折中方案

替换策略

  • FIFO:先进先出。
  • LRU:最近最少使用(最常用)。
  • LFU:最不经常使用。
  • 随机替换
提示只有全相联组相联才需要替换算法;直接映射每块只有唯一去处,无从选择。

手算示例

例题 1:基本命中率计算

题目: Cache 命中率 95%,Cache 访问时间 10 ns,主存访问时间 200 ns。求平均访问时间和访问效率。

解答:

Ta = H × Tc + (1-H) × Tm
   = 0.95 × 10 + 0.05 × 200
   = 9.5 + 10
   = 19.5 ns

访问效率 e = Tc / Ta = 10 / 19.5 ≈ 51.3%

加速比 Sp = Tm / Ta = 200 / 19.5 ≈ 10.26

例题 2:两级 Cache 系统

题目: 两级 Cache,L1 命中率 90%,访问时间 5 ns;L2 命中率 80%(对 L1 缺失),访问时间 20 ns;主存 200 ns。求平均访问时间。

解答:

访问路径:CPU → L1 → L2 → 主存

命中L1: H1 = 0.90, T1 = 5ns
L1缺失且命中L2: (1-H1) × H2 = 0.10 × 0.80 = 0.08, T1+T2 = 5+20 = 25ns
L1和L2均缺失: (1-H1)(1-H2) = 0.10 × 0.20 = 0.02, T1+T2+Tm = 5+20+200 = 225ns

Ta = 0.90 × 5 + 0.08 × 25 + 0.02 × 225
   = 4.5 + 2.0 + 4.5
   = 11.0 ns
套路多级 Cache 一律"列出所有互斥路径 → 概率 × 耗时 → 求和":$$Ta = \sum_i p_i t_i,\qquad \sum_i p_i = 1$$ 注意 L2 的命中率通常是条件概率(相对于 L1 缺失)。

例题 3:直接映射地址计算

题目: 主存 32 位地址,Cache 共 64 行,每行 16 字节。求直接映射下地址划分。

解答:

块内地址位数 = log₂(16) = 4 位
行号位数 = log₂(64) = 6 位
标记位数 = 32 - 6 - 4 = 22 位

地址结构:
┌──────────────────┬────────┬──────┐
│   标记 (22位)     │ 行号(6)│块内(4)│
└──────────────────┴────────┴──────┘

主存地址 0x00001A3F 的映射:
二进制:0000 0000 0000 0000 0001 1010 0011 1111
块内地址(低4位):1111 = 15
行号(次低6位):100011 = 35
标记(高22位):0x00001A3F >> 10 = 6

例题 4:组相联映射

题目: 主存 32 位地址,4 路组相联,Cache 共 64 行,每行 16 字节。求地址划分和映射到哪一组。

解答:

组数 = 64 / 4 = 16 组
块内地址位数 = log₂(16) = 4 位
组号位数 = log₂(16) = 4 位
标记位数 = 32 - 4 - 4 = 24 位

地址结构:
┌──────────────────────┬────────┬──────┐
│    标记 (24位)        │ 组号(4)│块内(4)│
└──────────────────────┴────────┴──────┘

地址 0x00001A3F:
组号 = (0x3F >> 4) & 0xF = 0x3 = 3
该地址映射到第 3 组(组号 0~15)

例题 5:LRU 替换模拟

题目: Cache 共 4 行(全相联 + LRU),访问序列为 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5。求命中率。

解答(LRU 队列,最左为最久未用、最右为最近使用):

访问123412512345
Cache{1}{1,2}{1,2,3}{1,2,3,4}{2,3,4,1}{3,4,1,2}{4,1,2,5}{4,2,5,1}{4,5,1,2}{5,1,2,3}{1,2,3,4}{2,3,4,5}
命中$\times$$\times$$\times$$\times$$\times$$\times$$\times$$\times$

命中率 $= \dfrac{4}{12} \approx 33.3\%$

注意LRU 替换时淘汰最久未被访问的行。手算时不要按"哪一行放哪个块"死记,而要维护一条LRU 队列:命中就把该块移到队尾,缺失就淘汰队首再入队尾——这样几乎不会出错。

408 考试要点

高频设问
  1. 平均访问时间公式:必考,注意两级 Cache 的计算。
  2. 地址划分:给定位数和参数,划分标记 / 组号(行号)/ 块内地址。
  3. LRU 替换模拟:给定访问序列画 Cache 状态变化。
  4. 命中率提升因素:增大 Cache 容量、提高相联度、优化替换算法。

记忆卡片

平均访问时间公式?
$Ta = H \times Tc + (1-H) \times Tm$,$H$ 为命中率,$Tc$ 为 Cache 时间,$Tm$ 为主存时间。
直接映射的地址如何划分?
标记 + 行号 + 块内地址。行号位数 $=\log_2(\text{行数})$,块内位数 $=\log_2(\text{块大小})$,剩余为标记。
组相联和直接映射的关系?
直接映射是 1 路组相联;全相联是只有 1 组的组相联。组相联是两者折中。
LRU 的核心思想?
替换最久没有被访问的那一行;实现上维护访问时间戳或计数器。
访问效率 $e$ 和加速比 $Sp$?
$e = Tc/Ta$(Cache 时间占比),$Sp = Tm/Ta$(相比纯主存的加速倍数)。
哪些映射方式需要替换算法?
全相联与组相联需要;直接映射不需要(位置唯一)。

交互动画 · LRU 替换逐步模拟

访问序列(共 12 次) Cache 4 行 · LRU 队列(左 = 最久未用,右 = 最近使用) LRU MRU 等待开始 命中 0 / 访问 0
点击「播放」逐步观察 LRU 队列的演化
4 行全相联,访问序列 1 2 3 4 1 2 5 1 2 3 4 5
示意图:绿色 = 本次命中的行;橙色 = 本次被装入(或被替换)的行。最终 4 次命中 / 12 次访问 = 33.3%。

相关知识点

(暂无关联知识点)

↑ 站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。