是什么
-
定义:现代计算机层次化存储体系(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 数据区容量公式:
-
命中率计算步骤:
-
统计总取指次数:。
-
计算代码总占用空间:。
-
判定是否跨 Cache 块(核心陷阱点):
-
若块大小为 字节,则块内地址由低 位决定()。
-
计算代码起始地址与结束地址是否处于同一个 字节对齐区间 。
-
未跨块:整段代码全在一个主存块内,循环开始时仅第 1 条指令发生 1 次冷缺失(Cold Miss),随后整块调入,后续访问全部命中。
-
跨块:代码跨越了 个主存块,首轮循环会发生 次冷缺失。
-
-
命中率公式:
-
3. 指令执行与异常类型判定
-
算术溢出异常(Overflow):仅在有符号数运算指令(如
ADD、SUB)的结果超出机器字长表示范围时触发。无符号数或固定小范围自增计数器不会触发溢出。 -
缺页异常(Page Fault):仅在访存指令(如
LOAD、STORE)访问的虚拟页未调入主存(页表有效位为 0)时触发,属于内部异常(Fault)。
4. 访存开销统计(TLB vs 磁盘)
-
查 TLB 次数:只要 CPU 生成虚拟地址访问内存,就必须查 1 次 TLB。若循环中某
LOAD指令执行了 次,则至少发起 次 TLB 查询。 -
读磁盘次数:仅在缺页异常发生时由操作系统从磁盘调页。若所有目标数据均在同一物理扇区/同一页,则无论访问多少次数组元素,缺页和读磁盘均仅发生 1 次。
例题
-
题目:(2014年408统考真题)
假设对于计算机 M 和程序 P 的机器代码,M 采用页式虚拟存储管理;P 开始执行时,,,其机器代码已调入主存但不在 Cache 中;数组 A 未调入主存,且所有数组元素在同一页,并存储在磁盘的同一个扇区。
-
P 执行结束时,R2 的内容是多少?
-
M 的指令 Cache 和数据 Cache 分离。若指令 Cache 共有 16 行,Cache 和主存交换的块大小为 32B,则其数据区的容量是多少?若仅考虑程序段 P 的执行,则指令 Cache 的命中率为多少?
-
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 次。
-
-
答案:
-
R2 的内容为 1000(或十六进制
03E8H)。 -
数据区容量:
指令 Cache 命中率:
-
可能发生溢出异常的指令:指令 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]。