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 #映射方式 #直接映射 #全相联 #组相联 #计算机系统知识

相关推荐
DevOpenClub10 小时前
个人公开市场研究笔记功能需求文档
笔记
暴力求解11 小时前
Linux网络---传输层协议TCP(二)
linux·服务器·开发语言·网络·tcp/ip
oradh11 小时前
Oracle闪回技术操作总结
数据库·oracle·oracle闪回技术操作总结·oracle闪回·flashback技术
ltl12 小时前
RocksDB 并发 Compaction 与 Rate Limiter
数据库
ltl12 小时前
序列化格式深度对比:Protobuf、FlatBuffers、Cap’n Proto
linux
lengjingzju12 小时前
编译与调试完全指南—第17章 总结
linux
ltl12 小时前
容器网络性能真相:veth vs macvlan vs eBPF 数据面
linux
闻道且行之13 小时前
图片处理助手|泊松融合原理 + C++ 工程实现,seamlessClone 三模式一次讲透
数据库·c++·人工智能·opencv
80s77713 小时前
动态ip和静态ip有什么区别
服务器·网络·tcp/ip
夏炳辉.14 小时前
PostgreSQL 高可用集群核心配置参数全解:从原生流复制到 Patroni 企业级方案
数据库·postgresql