【软考备考】存储系统详解:Cache 命中率、三种地址映射,计组最后一座大山(附 10 道练习)
计算机组成原理的最后一篇,来翻存储系统这座山。
它每年在上午题里占 2~3 分,考法集中在两块:Cache 命中率和平均访问时间(纯计算,套公式)、主存与 Cache 的地址映射(直接映射/全相联/组相联,概念+地址拆分)。前者是流水线那种"会公式就得分"的题,后者是这个系列到目前为止最需要"理解"的部分——但懂了之后你会发现,不过如此。
一、为什么需要 Cache?一个速度矛盾
CPU 的速度比主存(内存)快一两个数量级。CPU 每个时钟周期都张嘴要指令要数据,内存却慢吞吞——结果就是 CPU 大部分时间在等。于是工程师在 CPU 和主存之间加了一层小而快的存储:Cache(高速缓存)。
问题是 Cache 很贵,容量做不大,只能放主存的一小部分内容。凭什么放一小部分就管用?靠的是程序的局部性原理(概念题常客):
时间局部性:刚被访问过的内容,很可能马上再被访问。典型场景:循环——循环体那几十条指令被反复执行;
空间局部性:刚被访问的位置,它附近的内容很可能接着被访问。典型场景:顺序执行的指令、顺序遍历的数组。
所以 Cache 和主存之间以"块"为单位交换数据:要一个字节,把它所在的整个块(比如 128 字节)都搬进来——赌的就是空间局部性。
二、命中率与平均访问时间(计算题,真题级)
命中率 h:CPU 要的数据恰好在 Cache 里的概率。访问 1000 次,950 次在 Cache 里找到,命中率 95%。
设 Cache 存取周期 t₁、主存存取周期 t₂,软考的标准模型是:
平均访问时间 t = h × t₁ + (1 - h) × t₂
例题(真题原型):Cache 存取周期 10ns,主存 100ns,命中率 95%,求平均访问时间。
t = 0.95 × 10 + 0.05 × 100 = 9.5 + 5 = 14.5ns看这个数字的妙处:主存比 Cache 慢 10 倍,但因为 95% 的访问都落在 Cache 里,平均时间被拉到 14.5ns——非常接近 Cache 本身的速度。这就是 Cache 的全部意义。
一个容易栽的直觉:命中率从 90% 提到 95%,平均时间能降多少?不是"5% 的事"——未命中率从 10% 砍到 5%,减半了,而每次未命中要付 100ns 的代价。算一下:0.9×10+0.1×100 = 19ns,降了 4.5ns。越接近 100%,每一个百分点越值钱。
三、先备好两个编址基本功
地址映射题之前,先确认两个弹药:
1. 地址线计算:按字节编址、容量 2ⁿ 字节 → 需要 n 条地址线。64MB = 2²⁶ → 26 条;1MB = 2²⁰ → 20 条。
2. 主存和 Cache 都按"块"划分,块大小相同。主存地址的逻辑结构是:
| 主存块号 | 块内地址 |块内地址的位数由块大小决定:块 128B = 2⁷ → 块内地址 7 位。剩下的高位全是块号。
四、三种地址映射:电影院类比
核心问题:主存块搬进 Cache,放哪?下次 CPU 来找,怎么找?三种答案对应三种映射方式。用电影院座位类比,一秒懂:
1. 直接映射 = 对号入座
每个主存块在 Cache 里只有一个法定位置:Cache 块号 = 主存块号 mod Cache 块数。比如 Cache 有 64 块,主存第 130 块只能放第 130 mod 64 = 2 号块。
地址划分三段:区号(标记)| Cache 块号|块内地址。CPU 拿地址来,按块号找到 Cache 块,比对区号(同一 Cache 位置可能被多个主存块"轮坐",区号用来确认现在坐的是不是你)——是则命中。
优点:硬件最简。缺点:冲突率高——两个常用块若映射到同一位置,只能互相挤出去,哪怕 Cache 别处空着。
2. 全相联 = 不对号,随便坐
主存块可以放 Cache任意块。地址划分两段:主存块号(标记)|块内地址——注意,没有"Cache 块号"字段了,因为位置不固定,整个块号都得当标记存起来。
CPU 找数据时,要把标记和 Cache所有块的标记同时比较(并行比较器)。优点:冲突率最低、Cache 利用率最高。缺点:硬件最贵。
3. 组相联 = 分区随便坐(折中方案)
Cache 分成若干组,组间直接映射、组内全相联:主存块对号入座到某一组,组内随便坐。地址划分三段:区号(标记)|组号|块内地址。冲突率和硬件开销都居中,实际 CPU 的 Cache 基本都是这种(如 2 路、4 路组相联)。
地址拆分四步法(计算题通杀),拿例题走一遍:主存 1MB 按字节编址,Cache 8KB,块 128B,直接映射,求地址划分。
第1步:块内地址。块 128B = 2⁷ → 7 位 第2步:Cache 块号。8KB ÷ 128B = 64 块 = 2⁶ → 6 位 第3步:主存地址总长。1MB = 2²⁰ → 20 位 第4步:区号 = 20 - 6 - 7 = 7 位 → 区号7位 | 块号6位 | 块内地址7位全相联则没有第 2 步:标记 = 20 - 7 = 13 位。组相联把第 2 步换成"组数"。
五、两个小考点(一句话版)
替换算法:Cache 满了踢谁?随机、FIFO(先进先出)、LRU(最近最少使用,最常用);
写策略:CPU 写数据时改 Cache 还是改主存?写直达(两边同时写,简单但慢)、写回(只写 Cache,块被替换时才回写主存,快但要处理一致性)。
六、10 道练习题
基础题(1~5)
1.在 CPU 与主存之间设置 Cache 的主要目的是( )。
A. 扩大主存容量 B. 降低整机成本 C. 解决 CPU 与主存速度不匹配的问题 D. 提高外存储器的速度
2.程序中循环结构的代码被反复执行, Cache 能据此提高效率,这体现了( )。
A. 时间局部性 B. 空间局部性 C. 顺序局部性 D. 随机局部性
3.某系统 Cache 存取周期为 10ns,主存存取周期为 100ns,Cache 命中率为 95%,则平均访问时间为( )。
A. 10ns B. 15ns C. 14.5ns D. 95ns
4.直接映射方式下,主存块映射到 Cache 的规则是( )。
A. 可放入任意 Cache 块 B. 按组映射,组内任选 C. 随机选择 Cache 块 D. 固定位置:主存块号 mod Cache 块数
5.某计算机内存按字节编址,主存容量为 64MB,则地址总线至少需要( )条。
A. 20 B. 26 C. 64 D. 16
进阶题(6~10,带坑)
6.某系统 Cache 存取周期 10ns、主存 100ns,命中率 90% 时平均访问时间为 19ns。若命中率提高到 95%,平均访问时间将降低( )。
A. 5ns B. 0.5ns C. 9ns D. 4.5ns
7.主存 1MB 按字节编址,Cache 容量 8KB,块大小 128B,采用直接映射,则主存地址中"区号(标记)"字段占( )。
A. 6 位 B. 7 位 C. 13 位 D. 8 位
8.全相联映射方式下,主存地址应划分为( )。
A. 主存块号(标记)+ 块内地址 B. 区号 + Cache 块号 + 块内地址 C. 组号 + 块内地址 D. 区号 + 块内地址
9.某 Cache 分为 8 组,每组 2 块(2 路组相联),则主存地址中"组号"字段占( )。
A. 2 位 B. 3 位 C. 8 位 D. 9 位
10.关于三种地址映射方式,下列说法错误的是( )。
A. 直接映射硬件简单,但块冲突率高 B. 全相联冲突率低,但标记比较硬件复杂 C. 组相联是直接映射与全相联的折中 D. 直接映射方式下,主存块可放入 Cache 的任意位置
七、答案与详解
1. CCache 的使命只有一个:填平 CPU 和主存之间的速度鸿沟。扩容量是虚拟存储器的台词(A 错)——这是软考最经典的张冠李戴。
2. A"刚用过的马上又要用" =时间局部性,循环是教科书级例子。空间局部性是"用过的位置附近马上要用"(数组、顺序执行),别混。
3. C真题原型。t = 0.95×10 + 0.05×100 = 9.5 + 5 =14.5ns。选 A 的只算了命中部分;注意不是 10+0.05×100——软考模型里命中那 95% 只花 Cache 的时间。
4. D直接映射 = 对号入座,位置由公式唯一确定:Cache 块号 = 主存块号 mod Cache 块数。A 是全相联的规则,串门了。
5. B64MB = 2⁶ × 2²⁰ = 2²⁶ →26 条。这类题就一步:把容量凑成 2 的幂。
6. D本题大坑,专杀直觉。新平均时间 = 0.95×10 + 0.05×100 = 14.5ns,降低 19 - 14.5 =4.5ns,不是 5ns!粗看"未命中率从 10% 到 5%,省 0.05×100 = 5ns",但别忘了命中部分从 0.9×10=9ns 涨到了 0.95×10=9.5ns——命中次数变多,Cache 时间多花 0.5ns,净省 4.5ns。老老实实代公式,别口算"差值"。
7. B四步法:块内地址 7 位(128=2⁷);Cache 块数 8KB/128B = 64 → 块号 6 位;主存地址 20 位(1MB=2²⁰);区号 = 20-7-6 =7 位。选 C(13 位)的是把"主存总块号"当成了标记——直接映射里块号已经拿去定位 Cache 行了,标记只存剩下的区号。
8. A全相联随便坐,没有 Cache 块号字段,地址只有两段:整个主存块号当标记 + 块内地址。选 B 的是把直接映射的三段式背串了——这是两种映射最本质的区别。
9. B组号位数只看组数:8 组 = 2³ →3 位。"每组 2 块"是干扰信息——组内全相联,块在组内随便坐,不占地址位。
10. D选"错误的":A、B、C 都是正文原话。D 错——能放任意位置的是全相联;直接映射是死位置(对号入座)。三种方式的"自由度"对比是软考翻来覆去的考点:直接映射零自由度、全相联完全自由、组相联组内自由。
八、五句话带走
Cache 靠局部性吃饭:循环是时间局部性,数组/顺序是空间局部性;
平均访问时间t = h·t₁ + (1-h)·t₂,代公式别口算差值;
直接映射:对号入座,区号|块号|块内地址,简单但爱冲突;
全相联:随便坐,标记|块内地址两段,灵活但硬件贵;
组相联:组间对号、组内随便,折中方案,组号位数只看组数。
至此,计算机组成原理的高频考点全部通关:数据表示四篇 + 流水线 + 存储系统,上午题这块的 10 来分应该稳了。
下一篇预告:进军操作系统——PV 操作与信号量。上午题里真正的"思维题",前趋图怎么画、P 操作 V 操作到底谁在等谁、信号量初值怎么设,零公式,纯逻辑,是很多人上午题丢分的大户。咱们把它拆成套路。