是什么

  • 定义虚存-Cache-TLB 联合寻址 是现代计算机中 CPU 访存的标准多级流水架构:CPU 给出虚拟地址 由 TLB/页表翻译为物理地址 再由物理地址索引并命中 Cache/主存读取数据。

  • 大白话:CPU 带着虚拟门牌号先查“通讯录”(TLB/页表)找到真实物理地址,再拿真实物理地址去“贴身背包”(Cache)里翻找数据;如果背包没有再去“大仓库”(主存)搬运。

核心内容

1. 结构图核心字段逐一解析与计算(A~H 字段通用推导)

虚拟地址 (32位)  --> [ A: 虚页号 (19位) ] + [ D: 页内偏移量 (13位) ]
                           │                        │ (直接下传)
                           ▼                        ▼
物理地址 (24位)  --> [ C: 页框号 (11位) ] + [ D: 页内偏移量 (13位) ]
                           │                        │
  ┌────────────────────────┴────────────────────────┘
  ▼
物理地址 (24位)  --> [ E: Cache标记 (9位) ] + [ F: Cache组号 (9位) ] + [ G: 块内地址 (6位) ]

物理地址=页框号+页内偏移(页大小)=Tag(标记)+组号+块内地址(主存块大小)

  • A 字段(虚页号 VPN)

  • B 字段(TLB 标记 Tag)

    • 由 TLB 映射方式决定(见后文深度拓展)。本题为全相联,故 ,存放完整的虚页号

  • C 字段(页框号 / 物理页号 PPN)

  • D 字段(页内偏移量 Page Offset)

  • G 字段(Cache 块内地址 Block Offset)

  • F 字段(Cache 组号 / 行号 Index)

  • E 字段(Cache 标记 Tag)

  • H 字段(写入 Cache 行内的标记 Tag)

    • H 字段即写入该 Cache 行的 Tag,其内容与物理地址中的 E 字段完全一致

2. 深度拓展:TLB 不同映射方式下的字段切分全景

TLB 的输入仅仅是虚页号(VPN),绝不包含页内偏移!不同的 TLB 映射机制下,字段切分如下:

TLB 映射方式TLB 地址切分结构字段 B (TLB Tag) 位数计算字段 B 存储内容
全相联映射




(本题采用)
[ B: TLB Tag ]完整的虚页号
K 路组相联映射(就是一组k行)




(假设 4 路组相联, 16 项)
[ B: TLB Tag ] + [ TLB 组号 ]




组数 (2位)





虚页号的高 17 位




(低 2 位充当组号硬件索引)
直接映射




(假设共 16 项)
[ B: TLB Tag ] + [ TLB 行号 ]




行数 (4位)





虚页号的高 15 位




(低 4 位充当行号硬件索引)

3. 主存块号到 Cache 组号与 H 字段的快速拆解法

物理地址与主存块号的天然对应关系:

  • 求 Cache 组号(F 字段)

  • 求 Cache Tag(E / H 字段)

4. 经典对比:Cache 缺失 vs 缺页异常 & 直写 vs 回写

维度Cache 缺失(Cache Miss)缺页异常(Page Fault)
发生层级Cache 与 主存 之间主存 与 外存(磁盘/SSD) 之间
处理主体纯硬件自动处理(CPU 暂停等待硬件搬运)操作系统软硬协同(引发中断、进入内核、进程置阻塞并发生上下文切换)
时间开销数十纳秒(ns) 级别毫秒(ms)/ 微秒(s) 级别(相差 倍)
写策略选择可用 直写法(Write Through)回写法(Write Back)必须采用回写法(Write Back)
写策略原因访问主存开销小,直写配合 Write Buffer 性能可接受。访问外存磁盘 I/O 极其缓慢,若每次修改直写磁盘将彻底瘫痪系统性能。

例题

  • 题目(2016 统考真题):

    某计算机采用页式虚拟存储管理方式,按字节编址,虚拟地址为 32 位,物理地址为 24 位,页大小为 8KB;TLB 采用全相联映射;Cache 数据区大小为 64KB,按 2 路组相联映射方式组织,主存块大小为 64B。

    1. 图中字段 A~G 的位数各是多少?TLB 标记字段 B 中存放的是什么信息?

    2. 将块号为 4099 的主存块装入 Cache 时,所映射的 Cache 组号是多少?对应的 H 字段内容是什么?

    3. 是 Cache 缺失处理的时间开销大还是缺页处理的时间开销大?为什么?

    4. 为什么 Cache 可以采用直写法,而修改页面内容时总是采用回写法?

  • 分析与过程

    1. 字段位数

      • 页大小

      • TLB 为全相联,,存放完整的虚页号。

      • 块大小

      • Cache 组数

    2. 块号 4099 定位

      • (十六进制 008H)。

    3. 开销对比:缺页处理开销远大于 Cache 缺失。因为 Cache 缺失由硬件完成访存(ns 级);缺页处理涉及慢速外存 I/O 操作及操作系统中断/上下文切换(ms 级)。

    4. 写策略对比:Cache 面对的主存速度较快,直写开销可接受;页面修改面对的外存速度比主存慢数个数量级,若直写会导致频繁磁盘 I/O 极大拉低性能,故必须用回写法。

  • 规范答案

    1. A: 19 位;B: 19 位(存放虚页号);C: 11 位;D: 13 位;E: 9 位;F: 9 位;G: 6 位。

    2. 映射的 Cache 组号为 3;H 字段内容为 000001000(或 8,或 008H)。

    3. 缺页处理的时间开销大

      理由:Cache 缺失处理由硬件自动访问主存完成,耗时在纳秒级;缺页处理需访问外存磁盘,且涉及操作系统中断处理与进程上下文切换,耗时在毫秒级。

    4. Cache 对应的下一级是主存,读写速度快,直写带来的写主存开销小;虚存对应的下一级是外存磁盘,读写极其缓慢,回写法仅在淘汰时写回一次,能最大限度减少慢速外存 I/O 操作。

⚠️ 易错点

Warning

  • TLB 全相联 vs 组相联 Tag 位数混淆:全相联 TLB 没有组号字段,字段 B 长度等于完整虚页号 A(19位);若是组相联 TLB,字段 B 必须扣除

  • H 字段截取错误:物理地址共 24 位,主存块号共 18 位()。主存块号由 [高9位 Tag (H)] + [低9位 组号 (F)] 组成。计算 H 时应取 ,切忌把 4099 当成 24 位的完整地址去截取。

  • 计算 Cache 组数漏除相联度:Cache 容量 64KB,总行数 1024 行,2 路组相联必须除以 2 得到 512 组,组号为 9 位。漏除 2 会导致组号错算成 10 位、Tag 错算成 8 位。

  • 大题简答套话遗漏关键字

    • 解释缺页开销必须答出:“外存/磁盘 I/O 慢”“操作系统中断”“进程上下文切换”

    • 解释回写法必须答出:“主存与外存速度差异巨大”“减少磁盘 I/O 访问次数”

Cache 物理地址切分与映射寻址全景

是什么

  • 定义Cache 物理地址切分 是硬件将 CPU 发出的物理地址(PA)拆解为不同逻辑字段(Tag、行号/组号、块内偏移),以此实现数据在 Cache 与主存间唯一定位与映射的规则。

  • 大白话:物理地址就像一个复合编码。低位是“块内第几个字节”,把低位剥离后剩下的就是“主存块号”;再根据不同的收纳规则(映射方式),把主存块号切分出“柜子抽屉号”(行号/组号)和“核对身份标签”(Tag)。

核心内容

1. 物理地址的底层恒等结构(万能基石)

无论采用哪种映射方式,物理地址的底层构成绝对固定

  • 物理地址总位数(

  • 块内地址位数(

  • 主存块号总位数

2. 三大映射方式下的地址切分与定位公式对比

1. 直接映射:     [ Tag / 标记 (P - c - b 位) ] + [ Cache 行号 (c 位) ] + [ 块内地址 (b 位) ]
2. K路组相联映射: [ Tag / 标记 (P - g - b 位) ] + [ Cache 组号 (g 位) ] + [ 块内地址 (b 位) ]
3. 全相联映射:   [ Tag / 标记 (P - b 位)     ] + [      无       ] + [ 块内地址 (b 位) ]
映射方式字段切分结构索引字段位数计算Tag 位数计算行号 / 组号计算公式(给定主存块号)Tag 计算公式(数值提取)
直接映射[ Tag ] + [ 行号 ] + [ 块内地址 ]
K 路组相联映射[ Tag ] + [ 组号 ] + [ 块内地址 ]
全相联映射[ Tag ] + [ 块内地址 ]无(无需计算(可放入任意行)

3. 主存块号二进制切分的算术本质(为什么求模就是求行号/组号)

主存块号是一个大整数。在硬件底层,以 取模或除法就是对二进制位进行截断

  • 低位截取(:低 位二进制数值就是该主存块要映射到的 Cache 行号或 Cache 组号

  • 高位截取(:剩余的高位二进制数值就是写入该 Cache 行中的 Tag 标记

例题

  • 题目

    某系统按字节编址,物理地址为 24 位,Cache 数据区容量为 64KB,主存块大小为 64B。现有主存块号为 4099 的数据块,分别求解在以下三种映射方式下的:

    ① 地址各字段位数划分;

    ② 该主存块映射到的 Cache 行号/组号;

    ③ 写入 Cache 行中的 Tag(十进制与十六进制形式)。

    • 情况 1:采用直接映射。

    • 情况 2:采用 2 路组相联映射。

    • 情况 3:采用全相联映射。

  • 分析与推导

    • 基础参数计算

      • 物理地址总位数

      • 块大小 块内地址

      • Cache 总行数

      • 主存块号共 ,给定块号 (二进制为 000000001000000011)。

    • 情况 1(直接映射)

      • 行号位数

      • (二进制低 10 位为 0000000011)。

      • (十六进制为 04H,二进制高 8 位为 00000100)。

    • 情况 2(2 路组相联映射)

      • 组数 组号位数

      • (二进制低 9 位为 000000011)。

      • (十六进制为 008H,二进制高 9 位为 000001000)。

    • 情况 3(全相联映射)

      • 无行号/组号();

      • 可放入 Cache 的任意空闲行,无固定行号/组号。

      • (十六进制为 1003H,二进制为 000000001000000011)。

  • 答案

    1. 直接映射:Tag 占 8 位,行号占 10 位,块内地址占 6 位。映射到 Cache 3 号行,Tag 为 4 (04H)

    2. 2 路组相联:Tag 占 9 位,组号占 9 位,块内地址占 6 位。映射到 Cache 3 号组,Tag 为 8 (008H)

    3. 全相联:Tag 占 18 位,块内地址占 6 位。映射到 Cache 任意行,Tag 为 4099 (1003H)

⚠️ 易错点

Warning

  • 把主存块号当成物理地址切分:主存块号(如 4099)不包含块内地址。做带余除法()得到的是组号和 Tag;如果题目给的是“字节物理地址”,必须先除以块大小(或右移 位)得到主存块号,或者从物理地址中扣除低 位后再切分。

  • 直接映射与组相联组数计算搞混:直接映射用总行数做模数;组相联映射必须先求总组数(总行数 / K),组号由总组数决定,切忌直接用总行数计算组号。

  • 全相联映射的 Tag 误减字段:全相联映射没有任何索引字段,物理地址扣掉块内地址后,剩下的所有高位全部是 Tag

  • 十六进制与二进制位长对齐:当 Tag 不是 4 的倍数时(如 9 位 Tag),转换为十六进制表示要在高位补 0 凑整(如 9 位二进制 000001000 写成十六进制是 008H,占 3 个十六进制字符)。