Cache的三种映射方式(直接/全相联/组相联)
适合读者:软考中级备考同学
阅读时间:4分钟
内容:三种映射方式的原理、优缺点对比、地址划分、例题
1. 为什么需要映射方式?
Cache(高速缓存)是内存的副本,容量远小于内存。内存中的一个数据块可以被存放到Cache的哪些位置?这就是映射方式解决的问题。
三种常见映射方式:
- 直接映射(Direct Mapped)
- 全相联映射(Fully Associative)
- 组相联映射(Set Associative)
软考常考三者的对比,以及给定内存地址时如何判断它在Cache中的位置。
2. 基本概念
2.1 块(Block)/行(Line)
Cache和内存都被分成大小相等的块(也称为行)。数据以块为单位在内存和Cache之间传输。
2.2 地址划分
对于内存地址,通常划分为三个字段(以组相联为例):
- 标记(Tag):用于区分映射到同一位置的不同内存块
- 索引(Index):决定映射到哪个Cache行(直接映射)或哪个组(组相联)
- 块内偏移(Offset):块内的字节位置
不同映射方式,地址字段的划分不同。
3. 直接映射(Direct Mapped)
3.1 原理
每个内存块只能映射到Cache中的唯一一个固定位置。
位置计算公式:
Cache行号=(内存块号)mod (Cache行数)Cache行号 = (内存块号) \mod (Cache行数)Cache行号=(内存块号)mod(Cache行数)
3.2 地址划分
假设Cache有2r2^r2r行,每块大小2w2^w2w字节。内存地址分为:
- 低www位:块内偏移
- 中间rrr位:Cache行索引
- 高位:Tag(标记)
3.3 优点
- 硬件实现简单,速度快
- 只需要比较一个Tag(因为索引直接定位)
3.4 缺点
- 冲突率高:多个频繁访问的内存块映射到同一行,会互相替换(抖动)
3.5 软考示例
若Cache有8行,内存块15映射到Cache的哪一行?
计算:15mod 8=715 \mod 8 = 715mod8=7,映射到行7。
4. 全相联映射(Fully Associative)
4.1 原理
每个内存块可以映射到Cache中的任意一行。Cache满时,按替换算法(如LRU)淘汰某一行。
4.2 地址划分
地址分为:
- 块内偏移(低www位)
- Tag(剩余所有高位)
没有索引字段,因为可以存到任何位置。
4.3 优点
- 冲突率最低,几乎不会因映射限制而替换
- Cache利用率最高
4.4 缺点
- 硬件复杂:访问时需要同时比较所有行的Tag(相联比较器),成本高、速度慢
- 不适合大容量Cache
4.5 软考示例
全相联Cache访问时,需要将内存地址的Tag与Cache每一行的Tag进行比较,若匹配则命中。
5. 组相联映射(Set Associative)
5.1 原理
折中方案:将Cache分成若干组(Set),每个组内有若干行(路,Way)。
一个内存块可以映射到固定组内的任意一行。
组号计算:
组号=(内存块号)mod (组数)组号 = (内存块号) \mod (组数)组号=(内存块号)mod(组数)
5.2 常见参数
- 若每组有nnn行,称为n路组相联(n-way set associative)
- n=1n=1n=1时即为直接映射
- n=全部行数n=全部行数n=全部行数时即为全相联
5.3 地址划分
假设Cache有2r2^r2r组,每组nnn行,每块2w2^w2w字节。地址分为:
- 低www位:块内偏移
- 中间rrr位:组索引
- 高位:Tag
5.4 优点
- 兼顾直接映射的简单和全相联的低冲突
- 硬件成本适中
5.5 缺点
- 比直接映射复杂,比全相联简单
6. 三种方式对比表
| 对比项 | 直接映射 | 全相联映射 | 组相联映射 |
|---|---|---|---|
| 映射位置 | 固定一行 | 任意一行 | 固定组内的任意一行 |
| 索引字段 | 有(行号) | 无 | 有(组号) |
| 冲突率 | 高 | 最低 | 中等 |
| 硬件复杂度 | 低 | 高(多比较器) | 中等 |
| 查找速度 | 快(一次比较) | 慢(所有行比较) | 中等 |
| 实际应用 | 早期CPU | 很少单独使用 | 现代CPU常用(如8路) |
7. 经典例题
题目1:某Cache由64行组成,采用直接映射,主存有4096块,则主存块地址为520的内存块应映射到Cache的哪一行?
解:
行号=520mod 64=520−64×8=520−512=8行号 = 520 \mod 64 = 520 - 64 \times 8 = 520 - 512 = 8行号=520mod64=520−64×8=520−512=8
答案:第8行(或行号8)
题目2:某Cache采用4路组相联,共64行,求有多少组?若主存块地址为100,则映射到哪个组?
解:
- 总行数 = 64,每组4路 → 组数 =64/4=1664 / 4 = 1664/4=16组
- 组号 =100mod 16=100−16×6=100−96=4100 \mod 16 = 100 - 16 \times 6 = 100 - 96 = 4100mod16=100−16×6=100−96=4
答案:16组,组号4
题目3:以下关于Cache映射方式的描述,正确的是( )。
A. 直接映射的冲突率最低
B. 全相联映射需要同时比较所有行的Tag
C. 组相联映射的组内行数越多,冲突率越高
D. 直接映射的硬件复杂度最高
答案:B(A错,直接映射冲突率高;C错,组内行数越多越接近全相联,冲突率越低;D错,直接映射最简单)
8. 记忆口诀
直接映射找固定,冲突率高硬件简。
全相联放任何行,比较复杂冲突免。
组相联是折中案,组内随意组外限。
9. 给备考同学的一句话
三种映射方式的核心区别在于内存块可以存放的位置范围。考试常考:
- 给Cache容量、块大小、映射方式,计算地址字段位数
- 给内存块地址,问映射到哪一行/哪一组
- 判断冲突率高低和硬件复杂度
记住:直接映射固定一行,全相联任意行,组相联固定组内任意行。
🔔本专栏日更2篇,点击头像 → 专栏《软考中级高频考点》订阅
📥需要“计算机系统知识”完整思维导图?私信回复“软考计算机”免费获取
#软考中级 #软件设计师 #Cache #映射方式 #直接映射 #全相联 #组相联 #计算机系统知识
