计算机组成原理 | Cache和主存的映射方式

张开发
2026/6/5 23:31:54 15 分钟阅读

分享文章

计算机组成原理 | Cache和主存的映射方式
计算机组成原理 | Cache 映射方式大乱斗全相联、直接、组相联到底怎么选摘要/导语嗨上两期我们搞定了 Cache 的存在意义和局部性原理后台很多同学私信问“既然 Cache 这么好用那主存里的数据到底是怎么‘搬’进 Cache 的”这个问题直指核心——Cache-主存映射方式。是随便放还是按规矩放不同的放法直接决定了系统的速度和成本。全相联、直接映射、组相联这三个名词是不是听得头大今天这篇推文就是专门为大家准备的“避坑指南”。我们将彻底拆解这三种映射方式的底层逻辑、地址结构差异以及各自的优缺点。文末还附带了经典的地址拆分计算题和 408 真题解析帮你打通任督二脉期末复习必备 正文内容 第一部分Cache 里到底存了什么在讲怎么“放”之前我们先看看 Cache 这一行行的小格子里到底装了啥。它不仅仅是数据的搬运工还自带了“身份证”系统。每一行 Cache 存储的信息包含三部分有效位 (Valid Bit)0 或 1。相当于一个开关告诉 CPU “这行数据是有效的还是空的/过期的”。刚开机时全是 0。标记 (Tag)这是最关键的身份信息它用于指明这一行数据对应的是主存中的哪一块。注意敲黑板不同的映射方式这个 Tag 的长度是不一样的这也是考试最爱挖坑的地方。整块数据从主存搬运过来的实际内容。 第二部分三种映射方式大比拼当 CPU 想要访问数据时主存块如何放入 Cache这就涉及到了三种经典的策略。我们可以用“停车”来打比方这样最好理解。1. 全相联映射 (Fully Associative Mapping)规则主存块可以放到 Cache 的任意位置。比喻就像去一个巨大的露天停车场只要有个空位你想停哪就停哪非常自由。地址结构主存地址 标记 (整个主存块号) 块内地址因为没有固定的位置限制所以 Tag 必须包含完整的主存块号以便在任何地方都能找到它。优缺点✅优点空间利用率最高冲突概率最低命中率理论上最高。❌缺点查找“标记”最慢因为数据可能在任何一行CPU 必须把 Cache 里所有的 Tag 都拿出来比对一遍并行比较器电路复杂且昂贵。2. 直接映射 (Direct Mapping)规则主存块只能放到特定的某个 Cache 行。公式Cache 行号 主存块号 % Cache 总行数比喻就像学校分配宿舍学号尾号是 01 的只能住 1 号床尾号 02 的只能住 2 号床。哪怕 1 号床空着你也得去挤 2 号床如果 2 号床有人就得把原来的人踢走这叫替换。地址结构主存地址 标记 (主存块号前几位) 行号 (主存块号末几位) 块内地址这里的“行号”其实就是索引Index直接告诉你去第几行找。优缺点✅优点速度最快不需要复杂的比较电路根据地址直接定位到某一行只对比这一个 Tag 就行。硬件最简单成本最低。❌缺点Cache 空间利用不充分容易发生“抖动”Thrashing。如果程序频繁访问两个映射到同一行的块命中率会极低。3. 组相联映射 (Set Associative Mapping)规则这是前两者的折中方案。把 Cache 分成若干个组 (Set)组内采用全相联组间采用直接映射。公式组号 主存块号 % 总组数术语n 路组相联 每个组里有 n 个 Cache 行。比喻还是分宿舍但是这次是按班级分。你是 1 班的只能去 1 班的那几间宿舍组但在 1 班的这几间宿舍里你可以随便挑空床位睡组内全相联。地址结构主存地址 标记 (主存块号前几位) 组号 (主存块号末几位) 块内地址注意这里的中间部分是“组号”不是“行号”了优缺点✅优点综合效果较好。既避免了全相联的复杂电路又缓解了直接映射的冲突问题。现在的 CPU 几乎都用这种方式比如 8 路组相联。 第三部分核心考点与避坑指南这里总结了大家最容易混淆的几个点做题时请时刻提醒自己Tag 的长度怎么算全相联Tag 最长 主存块号位数。直接映射Tag 最短 主存块号位数 - Cache 行号位数。组相联Tag 长度 主存块号位数 - 组号位数。记忆技巧限制越死直接映射需要的身份信息Tag就越短越自由全相联需要的身份信息就越长。“块内地址”是谁决定的无论哪种映射块内地址Offset的位数永远只取决于 Cache 块的大小也就是主存块大小。比如块大小是 64B那块内地址就是 6 位 (26642^6642664)。这点千万别被映射方式带偏了关于“命中”的判断流程直接映射拿地址中的“行号”去 Cache 找对应行 - 检查有效位是否为 1 - 检查 Tag 是否相等 - 相等则命中。组相联拿地址中的“组号”去 Cache 找对应组 - 在该组内所有行中并行查找 - 检查有效位和 Tag - 有匹配则命中。 第四部分实战演练408 期末真题风格光说不练假把式来看一道经典的计算题这也是 408 选择题的高频考法。【例题】假设某计算机主存容量为 4MBCache 容量为 16KB每块大小为 64B。若采用4 路组相联映射请问主存地址的结构是怎样的即 Tag、组号、块内地址各占多少位【解题思路】先算块内地址Offset块大小 64B 262^626B所以块内地址 6 位。再算 Cache 的组数Cache 总行数 Cache 容量 / 块大小 16KB / 64B 214/26282562^{14} / 2^6 2^8 256214/2628256行。因为是 4 路组相联每组 4 行所以总组数 总行数 / 路数 256 / 4 64 组 262^626组。所以组号Index 6 位。最后算 Tag主存容量 4MB 2222^{22}222B说明主存地址总长 22 位。Tag 总位数 - 组号位数 - 块内地址位数Tag 22 - 6 - 6 10 位。【最终答案】主存地址结构为Tag (10位) 组号 (6位) 块内地址 (6位)。【408 真题改编·易错点分析】题目在上述系统中如果主存地址为0x123456十六进制该地址对应的数据如果在 Cache 中它一定在哪个组【解析】这道题其实不需要看 Tag只需要看中间的组号。将0x123456转为二进制或者直接看十六进制的位权。低 6 位是块内地址对应十六进制最后 1.5 位稍微有点麻烦建议转二进制。0x1234560001 0010 0011 0100 0101 0110去掉最后 6 位块内地址...0100 01(这是组号部分) - 实际上是取中间 6 位。中间 6 位组号00 0101- 即十进制的5。结论该数据如果命中一定在第 5 组。 总结全相联自由但慢Tag 最长。直接映射快但容易冲突Tag 最短靠“行号”定位。组相联折中方案靠“组号”定位组内随便放。希望这篇文章能帮你彻底搞定 Cache 映射

更多文章