是什么

  • 定义:现代计算机层次化存储体系(Cache-主存-辅存)在程序循环执行时的协同机制,涵盖指令 Cache 空间映射虚拟地址到物理地址转换(TLB/页表)以及运行时异常(算术溢出/缺页中断)的判定。

  • 大白话:CPU 跑程序时,“取指令”看指令 Cache 存没存,“读写数据”看 TLB/页表/数据 Cache 存没存。页(Page)是操作系统管主存和硬盘的大格子(通常 4KB),块(Block)是硬件管 Cache 和主存的小格子(通常 32B/64B),不能把两者混为一谈。

核心内容

1. 存储层次的核心区别:页(Page)vs 块(Block)

  • 虚存的“页(Page)”:面向主存与磁盘之间的数据调度,单位大(如 4KB/8KB),由操作系统与 MMU 协同管理,缺失时触发缺页异常(软硬件协同处理,需读磁盘)

  • Cache 的“块(Block / Line)”:面向Cache 与主存之间的数据调度,单位小(如 32B/64B),由纯硬件管理,缺失时触发Cache Miss(纯硬件调块,不产生中断)

  • 换算关系:一个虚拟页内通常包含数十到数百个 Cache 块(如 块)。“数据全在同一页”仅保证不发生二次缺页,绝对不代表“只占一个 Cache 块”。

2. Cache 命中率精确分析(重点:代码跨块判定)

  • Cache 数据区容量公式

  • 命中率计算步骤

    1. 统计总取指次数

    2. 计算代码总占用空间

    3. 判定是否跨 Cache 块(核心陷阱点)

      • 若块大小为 字节,则块内地址由低 位决定()。

      • 计算代码起始地址与结束地址是否处于同一个 字节对齐区间

      • 未跨块:整段代码全在一个主存块内,循环开始时仅第 1 条指令发生 1 次冷缺失(Cold Miss),随后整块调入,后续访问全部命中。

      • 跨块:代码跨越了 个主存块,首轮循环会发生 次冷缺失

    4. 命中率公式

3. 指令执行与异常类型判定

  • 算术溢出异常(Overflow):仅在有符号数运算指令(如 ADDSUB)的结果超出机器字长表示范围时触发。无符号数或固定小范围自增计数器不会触发溢出。

  • 缺页异常(Page Fault):仅在访存指令(如 LOADSTORE)访问的虚拟页未调入主存(页表有效位为 0)时触发,属于内部异常(Fault)。

4. 访存开销统计(TLB vs 磁盘)

  • 查 TLB 次数只要 CPU 生成虚拟地址访问内存,就必须查 1 次 TLB。若循环中某 LOAD 指令执行了 次,则至少发起 次 TLB 查询。

  • 读磁盘次数:仅在缺页异常发生时由操作系统从磁盘调页。若所有目标数据均在同一物理扇区/同一页,则无论访问多少次数组元素,缺页和读磁盘均仅发生 1 次

例题

  • 题目:(2014年408统考真题)

    假设对于计算机 M 和程序 P 的机器代码,M 采用页式虚拟存储管理;P 开始执行时,,其机器代码已调入主存但不在 Cache 中;数组 A 未调入主存,且所有数组元素在同一页,并存储在磁盘的同一个扇区。

    1. P 执行结束时,R2 的内容是多少?

    2. M 的指令 Cache 和数据 Cache 分离。若指令 Cache 共有 16 行,Cache 和主存交换的块大小为 32B,则其数据区的容量是多少?若仅考虑程序段 P 的执行,则指令 Cache 的命中率为多少?

    3. P 在执行过程中,哪条指令的执行可能发生溢出异常?哪条指令的执行可能产生缺页异常?对于数组 A 的访问,需要读磁盘和 TLB 至少各多少次?

  • 分析

    • (1) R2 存放循环计数变量 ,终止条件为 (R6 值为 1000),因此结束时 R2 为 1000。

    • (2) 数据区容量为 。程序共 6 条 32 位定长指令,占 。起始地址为 0804 8100H,末尾指令地址为 0804 8114H(占到 0804 8117H)。因块大小为 32B(区间为 8100H ~ 811FH),24B 代码完全落在同一个 Cache 块内。总取指 次,仅首次取指缺失 1 次,其余 5999 次全命中。

    • (3) 指令 4 为 add R1, R1, R5,为累加指令,存在符号数溢出可能;指令 3 为 load R5, 0(R4),为访存指令,可能缺页。A 在同一页,缺页读磁盘仅 1 次;每次访问数组都要虚实转换,查 TLB 共 1000 次。

  • 答案

    1. R2 的内容为 1000(或十六进制 03E8H)。

    2. 数据区容量

      指令 Cache 命中率

    3. 可能发生溢出异常的指令:指令 4(add R1, R1, R5

      可能发生缺页异常的指令:指令 3(load R5, 0(R4)

      读磁盘至少 1 次,读 TLB 至少 1000 次

⚠️ 易错点

Warning

  • “同一页”与“同一 Cache 块”的概念混淆

    • 题目说“数组 A 在同一页”只能保证读磁盘/缺页仅 1 次,绝不能用来直接推断 Cache 的命中情况。

    • 分析 Cache 命中率时,必须根据指令代码的首尾地址与 Cache 块大小比对是否跨块

  • 代码跨块边界计算

    • 若起始地址为 0804 8110H,32B 块边界为 ...100H ~ ...11FH...120H ~ ...13FH

    • 24B 的代码会跨在两个块中,此时冷缺失为 2 次,命中率算式将变为

  • 查 TLB 次数与缺页次数的混淆

    • 缺页中断仅在主存无该页时发生(发生极少)。

    • 查 TLB 是每次 CPU 给出虚拟地址访存时的必经步骤(执行了多少次访存指令,就查了多少次 TLB)。

  • 循环变量自增指令(ADD i)不会溢出

    • 计数器指令(如 add R2, R2, 1)最大仅加到 1000,远低于 32 位整型上限 ,绝对不会溢出;可能溢出的只有累加指令 sum += A[i]