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中的唯一一个固定位置

位置计算公式:

C a c h e 行号 = ( 内存块号 ) m o d    ( C a c h e 行数 ) Cache行号 = (内存块号) \mod (Cache行数) Cache行号=(内存块号)mod(Cache行数)

3.2 地址划分

假设Cache有 2 r 2^r 2r 行,每块大小 2 w 2^w 2w 字节。内存地址分为:

  • 低 w w w 位:块内偏移
  • 中间 r r r 位:Cache行索引
  • 高位:Tag(标记)

3.3 优点

  • 硬件实现简单,速度快
  • 只需要比较一个Tag(因为索引直接定位)

3.4 缺点

  • 冲突率高:多个频繁访问的内存块映射到同一行,会互相替换(抖动)

3.5 软考示例

若Cache有8行,内存块15映射到Cache的哪一行?

计算: 15 m o d    8 = 7 15 \mod 8 = 7 15mod8=7,映射到行7。


4. 全相联映射(Fully Associative)

4.1 原理

每个内存块可以映射到Cache中的任意一行。Cache满时,按替换算法(如LRU)淘汰某一行。

4.2 地址划分

地址分为:

  • 块内偏移(低 w w w 位)
  • Tag(剩余所有高位)

没有索引字段,因为可以存到任何位置。

4.3 优点

  • 冲突率最低,几乎不会因映射限制而替换
  • Cache利用率最高

4.4 缺点

  • 硬件复杂:访问时需要同时比较所有行的Tag(相联比较器),成本高、速度慢
  • 不适合大容量Cache

4.5 软考示例

全相联Cache访问时,需要将内存地址的Tag与Cache每一行的Tag进行比较,若匹配则命中。


5. 组相联映射(Set Associative)

5.1 原理

折中方案:将Cache分成若干 (Set),每个组内有若干 (路,Way)。

一个内存块可以映射到固定组内的任意一行

组号计算:

组号 = ( 内存块号 ) m o d    ( 组数 ) 组号 = (内存块号) \mod (组数) 组号=(内存块号)mod(组数)

5.2 常见参数

  • 若每组有 n n n 行,称为 n路组相联(n-way set associative)
  • n = 1 n=1 n=1 时即为直接映射
  • n = 全部行数 n=全部行数 n=全部行数 时即为全相联

5.3 地址划分

假设Cache有 2 r 2^r 2r 组,每组 n n n 行,每块 2 w 2^w 2w 字节。地址分为:

  • 低 w w w 位:块内偏移
  • 中间 r r r 位:组索引
  • 高位:Tag

5.4 优点

  • 兼顾直接映射的简单和全相联的低冲突
  • 硬件成本适中

5.5 缺点

  • 比直接映射复杂,比全相联简单

6. 三种方式对比表

对比项 直接映射 全相联映射 组相联映射
映射位置 固定一行 任意一行 固定组内的任意一行
索引字段 有(行号) 有(组号)
冲突率 最低 中等
硬件复杂度 高(多比较器) 中等
查找速度 快(一次比较) 慢(所有行比较) 中等
实际应用 早期CPU 很少单独使用 现代CPU常用(如8路)

7. 经典例题

题目1:某Cache由64行组成,采用直接映射,主存有4096块,则主存块地址为520的内存块应映射到Cache的哪一行?

行号 = 520 m o d    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 = 16 64 / 4 = 16 64/4=16 组
  • 组号 = 100 m o d    16 = 100 − 16 × 6 = 100 − 96 = 4 100 \mod 16 = 100 - 16 \times 6 = 100 - 96 = 4 100mod16=100−16×6=100−96=4

答案:16组,组号4


题目3 :以下关于Cache映射方式的描述,正确的是( )。

A. 直接映射的冲突率最低

B. 全相联映射需要同时比较所有行的Tag

C. 组相联映射的组内行数越多,冲突率越高

D. 直接映射的硬件复杂度最高

答案:B(A错,直接映射冲突率高;C错,组内行数越多越接近全相联,冲突率越低;D错,直接映射最简单)


8. 记忆口诀

直接映射找固定,冲突率高硬件简。
全相联放任何行,比较复杂冲突免。
组相联是折中案,组内随意组外限。


9. 给备考同学的一句话

三种映射方式的核心区别在于内存块可以存放的位置范围。考试常考:

  • 给Cache容量、块大小、映射方式,计算地址字段位数
  • 给内存块地址,问映射到哪一行/哪一组
  • 判断冲突率高低和硬件复杂度

记住:直接映射固定一行,全相联任意行,组相联固定组内任意行。


🔔 本专栏日更2篇,点击头像 → 专栏《软考中级高频考点》订阅

#软考中级 #软件设计师 #Cache #映射方式 #直接映射 #全相联 #组相联 #计算机系统知识

相关推荐
minji...1 小时前
Linux 高级IO(四)多路转接之epoll,epoll 模型及原理
linux·运维·服务器·多路转接·epoll·epoll模型·红黑树/就绪队列/回调
蜡笔婧萱1 小时前
网络服务综合大实验--包含NFS服务器,Web服务器,DNS域名服务器
linux·服务器·网络
bitbrowser1 小时前
2026年Facebook广告账户频频“连坐”被封?聊聊出海投流
运维·服务器·facebook
汽车仪器仪表相关领域1 小时前
Kvaser Hybrid CAN/LIN 单通道三合一总线分析仪:高性价比CAN FD/LIN集成测试利器
运维·服务器·网络·数据挖掘·数据分析·单元测试·集成测试
林熙蕾LXL1 小时前
守护进程&IO多路复用介绍
linux·服务器·网络
我是一颗柠檬2 小时前
【MySQL全面教学】MySQL备份与恢复Day14(2026年)
数据库·后端·mysql
渣渣盟2 小时前
MySQL DDL操作全解析:从入门到精通,包含索引视图分区表等全操作解析
大数据·数据库·mysql
mounter6252 小时前
技术前沿:在内核实时更新(Live Update)期间保留 hugetlbfs 内存
linux·linux kernel·kernel·kexec
RainCity2 小时前
Java Swing 自定义组件库分享(十)
java·笔记·后端