软考Cache命中率与平均访问时间真题(附百度网盘真题包)
适用对象:备考软考中级「软件设计师」「网络工程师」的同学
考查位置:上午综合知识·存储系统,1~2 分,与流水线并列“必拿分”
本文解决三件事:命中率怎么用、平均访问时间怎么代、反向求命中率怎么解
目录
- 软考Cache命中率与平均访问时间真题(附百度网盘真题包)
- 一、Cache 为什么能让访问变快
- 1.1 两个概率,一个公式
- 1.2 注意题干里的“缺失代价”
- 二、先把三种映射方式理清(选择题常考)
- 三、一条直线:命中率越高,Ta 越接近 Tc
- 四、真题四步法
- 4.1 反问题:给 Ta 求 H
- 4.2 真题变体:缺失代价含 Cache 查找时间
- 五、局部性原理:命中率不是天上掉下来的
- 六、用代码验证正算与反算
- 六、易错点清单
- 七、写在最后
Cache 题几乎只考一个公式,但很多人在两个地方丢分:缺失代价要不要加 Cache 时间、题目给的是命中率还是缺失率。下面把公式、曲线、真题、代码一次讲清。
一、Cache 为什么能让访问变快
CPU 取数据先查 Cache:命中就直接返回,缺失才去主存。因为程序有局部性,绝大多数访问都能命中,所以平均下来接近 Cache 的速度。
1.1 两个概率,一个公式
- 命中率 H:访问在 Cache 中命中的比例;缺失率 = 1 − H;
- 平均访问时间Ta = H × Tc + (1 − H) × Tm(Tc 为 Cache 存取时间,Tm 为主存存取时间);
- 效率 e = Tc / Ta,加速比 = Tm / Ta。
这条公式的本质就是“按概率加权平均”,不需要背推导。
1.2 注意题干里的“缺失代价”
软考有两种给法,得分点完全不同:
| 题干说法 | 缺失时代价 | 公式 |
|---|---|---|
| 直接给 Cache 与主存存取时间 | Tm | Ta = H·Tc + (1−H)·Tm |
| 明确“缺失时先查 Cache 再访主存” | Tc + Tm | Ta = H·Tc + (1−H)·(Tc+Tm) |
看到“同时访问”“先查后访”这类字眼,务必回去确认一遍。
二、先把三种映射方式理清(选择题常考)
Cache 的考题分两条线:一条算时间(本文主线),另一条考映射方式。两者常在同一份卷子里出现,混淆点在于“块怎么放”。
| 映射方式 | 放置规则 | 优点 | 缺点 | 冲突概率 |
|---|---|---|---|---|
| 直接映射 | 主存块号 mod Cache 行数,位置唯一 | 硬件最简单、查找最快 | 冲突最严重,抖动明显 | 高 |
| 全相联映射 | 任意块可放任意行 | 冲突最少、命中率最高 | 比较器多、成本高 | 低 |
| 组相联映射 | 组间直接映射、组内全相联 | 折中方案,实际最常用 | 逻辑稍复杂 | 中 |
一句话记忆:直接映射最便宜也最容易撞车,全相联最贵也最灵活,组相联是工业界的选择(n 路组相联就是“每组 n 行,组内随便放”)。
三、一条直线:命中率越高,Ta 越接近 Tc
Ta 对 H 是线性关系,所以只要算两个端点就能估任何一点:H = 100% 时 Ta = Tc,H = 0% 时 Ta = Tm。以 Tc = 2 ns、Tm = 20 ns 为例,H 每提升 1%,Ta 下降 0.18 ns。
四、真题四步法
【题干】某计算机 Cache 存取时间为 2 ns,主存存取时间为 20 ns,命中率为 95%。求平均访问时间、Cache 效率与加速比。
| 步骤 | 动作 | 本题数值 |
|---|---|---|
| ① 拆概率 | H = 0.95,(1−H) = 0.05 | — |
| ② 代公式 | Ta = 0.95×2 + 0.05×20 | 2.9 ns |
| ③ 求效率 | e = 2 / 2.9 | ≈ 69.0% |
| ④ 求加速比 | 20 / 2.9 | ≈ 6.9 倍 |
4.1 反问题:给 Ta 求 H
题干改成“平均访问时间为 3.8 ns,求命中率”,只需解一元一次方程:
H = (Tm − Ta) / (Tm − Tc) = (20 − 3.8) / (20 − 2) = 0.90即命中率 90%。这类题几乎每年都有变体,把公式变形记住即可。
4.2 真题变体:缺失代价含 Cache 查找时间
【题干】某系统采用“先查 Cache、未命中再访主存”的方式,Cache 存取周期 2 ns,主存存取周期 20 ns,命中率 90%,求平均访问时间。
【解析】缺失时先花 2 ns 查 Cache 再花 20 ns 访主存,代价为 22 ns:
Ta = 0.9 × 2 + 0.1 × 22 = 1.8 + 2.2 =4.0 ns。比按 Tm 直接代入的 3.8 ns 更大,差的就是那一次无效查找。
五、局部性原理:命中率不是天上掉下来的
| 局部性类型 | 含义 | 提升手段 |
|---|---|---|
| 时间局部性 | 刚访问过的数据很可能再次被访问 | 循环变量复用、提高 Cache 替换策略质量(LRU) |
| 空间局部性 | 相邻地址的数据很可能被一起访问 | 按行访问数组、循环分块、预取 |
这也是为什么“把二维数组的遍历顺序从按列改成按行”能让程序快好几倍——不是算法变了,是命中率变了。
六、用代码验证正算与反算
defamat(H,Tc,Tm):"""平均访问时间"""returnH*Tc+(1-H)*Tmdefsolve_h(Ta,Tc,Tm):"""已知平均访问时间,反解命中率"""return(Tm-Ta)/(Tm-Tc)Tc,Tm=2,20forHin(0.90,0.95,0.99):ta=amat(H,Tc,Tm)print(f"H={H:.2f}Ta={ta:.2f}ns 效率={Tc/ta:.1%}加速比={Tm/ta:.2f}")print("反解:",round(solve_h(3.8,Tc,Tm),2))运行结果:
H=0.90 Ta=3.80ns 效率=52.6% 加速比=5.26 H=0.95 Ta=2.90ns 效率=69.0% 加速比=6.90 H=0.99 Ta=2.18ns 效率=91.7% 加速比=9.17 反解: 0.9可以看到:命中率从 90% 提到 99%,效率从 53% 涨到 92%,这就是局部性优化(循环分块、提高空间局部性)的价值。
六、易错点清单
- 命中率与缺失率弄反:把 5% 的缺失率当成命中率代入,结果会算成 19 ns。
- 缺失代价漏加 Tc:题干写“先查 Cache 再访主存”时,缺失代价是 Tc + Tm。
- 效率与加速比混用:效率以 Tc 为基准,加速比以 Tm 为基准,分母都是 Ta。
- 单位不统一:ns 与 μs 混算,差 1000 倍。
- 忽略写策略:写直达/写回会影响实际访存次数,但 Ta 的公式仍按命中率加权。
七、写在最后
Cache 题只有一条主线:概率加权求平均,再拿 Tc 和 Tm 分别做比值。把本文 95% 那道题手算一遍,再用代码对拍一次,就把它变成稳拿的 1~2 分。
下一篇写「段页式地址转换与页面置换算法」,同属存储管理板块,需要的同学可以关注专栏更新。
本文涉及的历年真题与解析已整理成合集,需要的同学可自取:
链接: https://pan.baidu.com/s/1SwVEmITKHveCupjP_VH7pA 提取码: rk02