• 时间局部性:某数据被访问后,不久后是否会被再次访问。

  • 空间局部性:某数据被访问后,其临近的数据是否很快被访问。

是什么

  • 定义:在分页存储管理中,数组在虚拟地址空间中分配时,其首地址在页内的偏移量决定了它是否与物理/虚拟页面边界对齐。当按线性顺序访问未调入内存的数组时,数组跨越的虚拟页数即为发生的缺页异常次数,每次跨入新页面的第一个访问地址即为缺页故障地址。

  • 大白话:页就像固定容量的箱子(比如 一个)。数组对齐就是刚好从箱子开头装;不对齐就是从箱子中间装。从中间装会导致前一个箱子装不满,原本 2 个箱子能装下的东西可能被挤到第 3 个箱子里,从而多产生一次缺页。

核心内容

1. 虚拟地址划分

对于页面大小为 的系统:

  • 页内偏移量(Offset):虚拟地址的低 (十六进制后 3 位)。

  • 虚拟页号(VPN):虚拟地址的高位部分(右移 12 位)。

2. 数组跨越页数计算公式

通用首尾页号法(最稳妥,不易出错)

  • 起始虚拟页号

  • 末尾字节地址必须减 1,指向最后一个有效字节):

  • 末尾虚拟页号

  • 跨越总页数

向上取整公式法

设页面大小为 ,起始页内偏移量为

  • 页对齐(

  • 非页对齐(

3. 缺页次数与故障地址判定规则

前提条件:数组初始均不在主存、访问过程不发生页面置换,且按内存地址顺序线性递增访问。

  • 总缺页次数:====

  • 第 1 次缺页故障地址:发生在访问数组首个元素时,==地址为起始虚拟地址 ==(带起始偏移)。

  • 次缺页故障地址 ():发生在跨入新页面的第一个访问地址处。由于是线性连续扫描,该地址必然是新页面的页首对齐地址(低 12 位全为 0)

例题

  • 题目

    已知某分页虚拟存储管理系统中,页面大小为 。一个二维整型数组 A[24][64] 每个元素占 ,数组按行优先顺序存储。程序执行前该数组完全不在内存中,访问过程不发生页面置换。

    (1)若数组起始虚拟地址为 0042 2000H,计算线性遍历该数组发生的缺页次数及各次缺页的虚拟地址。

    (2)若数组起始虚拟地址为 0042 2A00H,计算线性遍历该数组发生的缺页次数及各次缺页的虚拟地址。

  • 分析

    数组总字节大小为

    页面大小为

    通过计算起始虚拟页号与末尾字节所在的虚拟页号,即可确定跨越页数及各次缺页触发的地址。

  • 答案

    (1)起始地址为 0042 2000H 时(页对齐):

    末尾字节地址为:

    起始页号 ,末尾页号

    跨越页数

    因此,发生缺页次数为 2 次

  • 第 1 次缺页故障地址:0042 2000H

  • 第 2 次缺页故障地址:0042 3000H

(2)起始地址为 0042 2A00H 时(非页对齐):

末尾字节地址为:

起始页号 ,末尾页号

跨越页数

因此,发生缺页次数为 3 次

  • 第 1 次缺页故障地址:0042 2A00H

  • 第 2 次缺页故障地址:0042 3000H

  • 第 3 次缺页故障地址:0042 4000H

⚠️ 易错点

Warning

  • 末尾地址未减 1 导致误判多跨一页(差一错误) 计算末尾字节地址时,公式必须是 。如果数组恰好占满某一页(如末尾在 ...3FFFH),不减 1 会算成 ...4000H,导致虚拟页号多进位 1,从而错误地多算一次缺页。

  • 后续缺页故障地址误带初始页内偏移 第 1 次缺页地址是带偏移的 ,但==第 2 次及以后的缺页地址必然落在新页的首字节(低 12 位为 000H)==,切勿把起始偏移量加到后续页面上。

  • 十六进制容量换算进位错误 。切忌把十进制的 直接当作 参与十六进制地址运算。