Skip to content

408

计算机组成原理

CO-03-09 Cache映射方式(直接映射/全相联/组相联)


一、定位信息

项目内容
所属圈层核心层
前置知识回顾需了解Cache的基本工作原理(CO-03-08),了解主存地址由若干位组成,了解"块"(Block/Line)是Cache与主存之间数据传输的最小单位
知识网络定位本单元是Cache核心机制的关键——决定了主存块如何放入Cache。映射方式直接影响命中率和硬件复杂度,是替换算法(CO-03-10)和地址转换(CO-03-12)的基础
考点热度等级H级 — Cache映射方式是每年必考的核心考点,三种映射方式的对比和地址划分是高频选择题和计算题,近5年出现≥5次

二、知识点讲解

2.1 基本概念

Cache行(Cache Line/Cache Block):Cache中存放数据的基本单位。每个Cache行包含:

  • 有效位(Valid Bit):标记该行是否存有有效数据
  • 标签(Tag):记录该行数据对应的主存地址的高位部分
  • 数据块(Data Block):实际存放的从主存调入的数据
  • 脏位(Dirty Bit):写回策略下标记数据是否被修改(见CO-03-10)

主存地址的划分:在Cache系统中,主存地址通常被划分为三个部分:

主存地址=Tag(标签)高位+Index(索引/组号)中间+Offset(块内偏移)低位\text{主存地址} = \underbrace{\text{Tag(标签)}}_{\text{高位}} + \underbrace{\text{Index(索引/组号)}}_{\text{中间}} + \underbrace{\text{Offset(块内偏移)}}_{\text{低位}}

  • Offset(块内偏移):在数据块内的字节偏移,位数 = log2\log_2(块大小)
  • Index(索引):决定该主存块可以放在Cache的哪个位置(哪个组),位数取决于映射方式
  • Tag(标签):区分映射到同一位置的不同主存块

2.2 直接映射(Direct Mapped)

映射规则:每个主存块只能放在Cache中唯一确定的一个位置。

Cache行号=主存块号modCache行数\text{Cache行号} = \text{主存块号} \mod \text{Cache行数}

地址划分

主存地址=Tag+Index(行号)log2(Cache行数)+Offsetlog2(块大小)\text{主存地址} = \text{Tag} + \underbrace{\text{Index(行号)}}_{\log_2(\text{Cache行数})} + \underbrace{\text{Offset}}_{\log_2(\text{块大小})}

查找过程

  1. 用Index找到对应的Cache行
  2. 比较该行的Tag与地址中的Tag
  3. 如果Tag匹配且有效位=1,则命中,用Offset取出数据
  4. 否则未命中,访问主存

优点:硬件最简单,只需比较一个Tag 缺点:冲突率高——多个主存块映射到同一Cache行时,即使Cache其他行空闲也会发生冲突

2.3 全相联映射(Fully Associative)

映射规则:每个主存块可以放在Cache中任意一个行。

地址划分

主存地址=Tag(整个主存块号)+Offset\text{主存地址} = \text{Tag(整个主存块号)} + \text{Offset}

没有Index字段,因为不需要索引来定位——要和所有行比较。

查找过程

  1. 将地址中的Tag与Cache中所有行的Tag同时比较
  2. 如果某一行匹配且有效位=1,则命中
  3. 否则未命中

优点:冲突率最低,主存块可以放在任何空闲行 缺点:硬件最复杂——需要 nn 个比较器同时比较(nn 为Cache行数),成本高

2.4 组相联映射(Set Associative)

映射规则:Cache被分为若干组(Set),每个组包含若干行。主存块被映射到一个确定的组(类似直接映射),但在组内可以放在任意行(类似全相联映射)。

组号=主存块号modCache组数\text{组号} = \text{主存块号} \mod \text{Cache组数}

地址划分

主存地址=Tag+Index(组号)log2(组数)+Offsetlog2(块大小)\text{主存地址} = \text{Tag} + \underbrace{\text{Index(组号)}}_{\log_2(\text{组数})} + \underbrace{\text{Offset}}_{\log_2(\text{块大小})}

nn 路组相联:每组有 nn 个行。

  • 1路组相联 = 直接映射
  • mm 路组相联(mm = Cache总行数,即只有1组)= 全相联映射

查找过程

  1. 用Index找到对应的组
  2. 将Tag与该组内所有行的Tag比较(nn 个比较器)
  3. 如果匹配且有效位=1,则命中

优点:在硬件复杂度和命中率之间取得平衡 缺点:比直接映射复杂,比全相联命中率略低

2.5 主存块号的计算

主存块号 = 主存地址 ÷ 块大小(字节数)= 地址的高位部分(去掉Offset位)

例如:主存地址为20位,块大小为16字节(4位Offset),则主存块号 = 地址的高16位。

2.6 地址划分的完整计算

设:

  • 主存容量 MM 字节,地址线 mm
  • Cache有 CC 行,每块大小 BB 字节
  • nn 路组相联

则:

  • Offset位数 = log2B\log_2 B
  • 组数 = C/nC / n
  • Index位数 = log2(C/n)\log_2(C/n)
  • Tag位数 = mIndex位数Offset位数m - \text{Index位数} - \text{Offset位数}

三、记忆与理解辅助

3.1 口诀记忆

口诀:"直接一对一,全联随便放,组联折中取"

  • 直接映射:每个主存块对应唯一Cache行
  • 全相联映射:每个主存块可以放任何Cache行
  • 组相联映射:映射到确定的组,组内随便放

口诀:"地址三分Tag索引偏移"

地址=Tag+Index+Offset\text{地址} = \text{Tag} + \text{Index} + \text{Offset}

3.2 对比表:三种映射方式

对比项直接映射全相联映射组相联映射
映射规则主存块 mod Cache行数可放任意行主存块 mod 组数,组内任意
Index字段有(行号)有(组号)
比较器数量1个Cache行数个每组行数个(nn个)
冲突率最高最低居中
硬件复杂度最简单最复杂居中
命中率最低最高居中
适用场景低成本系统小容量Cache实际系统最常用
极端情况nn路组相联(nn=总行数)n=1n=1时为直接映射

3.3 地址划分速算表

参数公式说明
Offset位数log2(块大小)\log_2(\text{块大小})块内字节偏移
Index位数log2(Cache行数)\log_2(\text{Cache行数})(直接映射)或 log2(组数)\log_2(\text{组数})(组相联)定位Cache行/组
Tag位数地址总位数 - Index位数 - Offset位数区分不同主存块

3.4 类比理解

  • 直接映射:像固定座位的火车——你的座位号是确定的,别人也可能被分到同一个座位
  • 全相联映射:像自助餐——任何盘子可以放在任何位置,但服务员需要逐个检查每个位置
  • 组相联映射:像分区域的自助餐——你的盘子必须放在指定区域,但区域内可以随便选位置

四、例题与精解

例题1(基础)

题目:某计算机主存地址为16位,Cache有8行,每行(块)大小为16字节。采用直接映射方式。 (1)主存地址如何划分? (2)主存地址 1A3CH 对应的Cache行号是多少?

命题意图:考查直接映射的地址划分和行号计算。

审题分析:地址16位,Cache 8行,块大小16字节。

解题思路:先确定Offset、Index、Tag的位数,再划分地址。

完整步骤

(1)地址划分:

  • Offset位数 = log2(16)=4\log_2(16) = 4 位(低4位)
  • Index位数 = log2(8)=3\log_2(8) = 3 位(中间3位)
  • Tag位数 = 1634=916 - 3 - 4 = 9 位(高9位)

地址=9位Tag+3位Index+4位Offset\text{地址} = \underbrace{\text{9位Tag}}_{高} + \underbrace{\text{3位Index}}_{中} + \underbrace{\text{4位Offset}}_{低}

(2)地址 1A3CH 的Cache行号:

1A3CH = 0001 1010 0011 1100(二进制)

  • Tag = 0001 1010 0(高9位)
  • Index = 011(中间3位)= 3
  • Offset = 1100(低4位)

Cache行号 = 3

方法反思:十六进制地址转二进制后,按位数划分即可。注意从低位开始数Offset,然后是Index,最后是Tag。


例题2(中等)

题目:某计算机主存地址为32位,Cache容量为64KB,块大小为64字节,采用4路组相联映射。 (1)Cache有多少行?多少组? (2)主存地址如何划分(Tag、Index、Offset各多少位)? (3)主存地址 002001A8H 对应的组号是多少?

命题意图:考查组相联映射的地址划分和组号计算。

审题分析:地址32位,Cache 64KB,块大小64B,4路组相联。

解题思路:先算Cache行数和组数,再划分地址。

完整步骤

(1)Cache行数和组数:

Cache行数=64KB64B=6553664=1024\text{Cache行数} = \frac{64\text{KB}}{64\text{B}} = \frac{65536}{64} = 1024 \text{行}

组数=10244=256\text{组数} = \frac{1024}{4} = 256 \text{组}

(2)地址划分:

  • Offset位数 = log2(64)=6\log_2(64) = 6
  • Index位数 = log2(256)=8\log_2(256) = 8
  • Tag位数 = 3286=1832 - 8 - 6 = 18

地址=18位Tag+8位Index+6位Offset\text{地址} = \underbrace{\text{18位Tag}}_{高} + \underbrace{\text{8位Index}}_{中} + \underbrace{\text{6位Offset}}_{低}

(3)地址 002001A8H 的组号:

002001A8H = 0000 0000 0010 0000 0000 0001 1010 1000(二进制)

  • Offset(低6位)= 101000
  • Index(接下来8位)= 00000110 = 6
  • Tag(高18位)= 0000 0000 0010 0000 00

组号 = 6

方法反思

  1. 组相联中,Cache行数 ÷ 路数 = 组数。
  2. 地址划分时,先确定Offset(由块大小决定),再确定Index(由组数决定),最后Tag占剩余位。
  3. 4路组相联需要4个比较器同时比较组内4行的Tag。

五、考情分析

项目内容
近5年考查频次≥5次
常见题型选择题(三种映射方式的对比)、计算题(地址划分、组号/行号计算)
分值占比选择题2分,计算题5–8分
命题趋势Cache映射方式是每年必考内容。近年趋势是将映射方式与替换算法、写策略结合出综合题,要求考生完成完整的Cache访问过程分析

六、易错点提醒

易错点1

  • 错误表现:计算组号时用"主存块号 mod Cache行数"而非"mod 组数"
  • 错误原因:混淆直接映射和组相联的映射公式
  • 正确做法:直接映射用行数,组相联用组数。组数 = 行数 ÷ 路数

易错点2

  • 错误表现:地址划分时,将Tag和Index的位数算反
  • 错误原因:不确定哪部分在高位、哪部分在低位
  • 正确做法:地址从低到高依次是Offset → Index → Tag。Offset在最低位,Tag在最高位

易错点3

  • 错误表现:认为全相联映射也有Index字段
  • 错误原因:没有理解全相联的"全"——没有固定位置,不需要索引
  • 正确做法:全相联映射的地址只有Tag + Offset。Tag = 整个主存块号,需要与Cache所有行比较

易错点4

  • 错误表现:计算Tag位数时忘记减去Offset位数
  • 错误原因:误以为地址 = Tag + Index
  • 正确做法:地址 = Tag + Index + Offset,Tag位数 = 总地址位数 - Index位数 - Offset位数

七、来源标注

  • 依据2026考研统考大纲(408-计算机组成原理-第三章"存储器层次结构")
  • 依据大学本科经典教材共识:唐朔飞《计算机组成原理》、白中英《计算机组成原理》、Patterson & Hennessy《计算机组成与设计》

考研全科复习资料 - 基于2026考研统考大纲