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

相关推荐
lisanmengmeng7 小时前
NRPE 添加命令(一)
linux·运维·服务器
树下水月8 小时前
Typora破解
linux·服务器·前端
sunoo-2298 小时前
【ARM嵌入式学习笔记第十天】i.MX6ULL eLCDIF控制器驱动RGB LCD全解析(硬件原理+寄存器配置+裸机代码)
arm开发·笔记·学习
沫璃染墨8 小时前
《从零入门Linux系统篇(五十七):线程篇·十——生产者消费者模型进阶:从环形缓冲区到POSIX信号量》
linux·运维·服务器·开发语言·c++·系统架构·信号处理
写后端的胖头鱼8 小时前
【高频面试题】FullText 全文索引(MySQL)
数据库·mysql·索引·全文索引
wuminyu8 小时前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
路远的数据库笔记8 小时前
SQL Server迁移国产数据库怎么做?九套口岸库零停机割接实战
数据库·经验分享·sqlserver·dba
樱花落木兰8 小时前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存
深念Y9 小时前
rime-雾凇拼音-配置记录
linux·junit·软件·拼音·kde
kaiyou20269 小时前
用户研究岗秋招,统计分析能力怎么学习和证明?
数据库·python·学习