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

相关推荐
l134062082355 小时前
鸿蒙实战:RDB 数据库设计与 DatabaseService
数据库·华为·harmonyos·鸿蒙系统
谙忆5 小时前
图片版权保护工程实战:明水印、盲水印(DCT隐写)、Referer防盗链与签名URL怎么落地
数据库
凉、介5 小时前
Virtio 系列(一):框架概览
笔记·学习·嵌入式·虚拟化·virtio
KaMeidebaby5 小时前
卡梅德生物技术快报|抗体合成:多肽抗体合成工程化方案:Nsp2 保守肽多抗制备与多维度验证
前端·网络·数据库·人工智能·算法
xfhuangfu5 小时前
19c CDB架构下的数据库启动和停止
数据库·架构
神道君天下5 小时前
填充与积累:积分与面积的可视化
数据库·oracle
爱折腾的小黑牛6 小时前
小程序云开发数据模型设计:礼账系统的三表结构
数据库·架构
爱折腾的小黑牛6 小时前
礼账小程序的数据安全方案:加密与备份
数据库·安全
JNX_SEMI6 小时前
AT2659S L1频段LNA:0.8dB噪声系数与20dB高增益设计解析
数据库
Yang_jie_036 小时前
笔记:数据结构(栈是否使用底指针以及头指针的初始化值)
数据结构·笔记·算法