【操作系统】虚拟存储管理(局部性原理、缺页中断)

考点频率 :★★★★★(选择题必考,也是理解页面置换算法的基础)

难度 :⭐⭐⭐

建议:理解局部性原理是虚拟存储的理论基础,掌握缺页中断的完整处理流程

1️⃣ 为什么需要虚拟存储?

之前讨论的页式/段式存储管理有一个共同前提:程序的全部代码和数据必须一次性装入内存才能运行。这带来了两个问题:

  1. 程序大小受限于物理内存:如果程序大于物理内存,就无法运行
  2. 内存利用率低:程序运行时,往往只有部分代码和数据被频繁使用(如错误处理代码、初始化代码在运行后不再需要)

虚拟存储 的解决思路:程序不需要全部装入内存,只需要将当前运行需要的部分装入内存,其余部分存放在磁盘上,需要时再调入。

类比:读一本很厚的书,不需要把整本书一次性全背下来,只需要把当前要读的几页放在桌上,读完了再换下一页。

虚拟存储管理可以基于页式 (虚拟页式)或段式(虚拟段式)来实现,软考中主要考查虚拟页式存储。

2️⃣ 局部性原理------虚拟存储的理论基础

局部性原理是虚拟存储能够高效工作的理论依据。程序在运行过程中,其访问行为表现出两种局部性:

时间局部性:如果一个内存位置被访问,那么它在不久的将来很可能再次被访问。

  • 典型例子:循环体中的代码、被反复调用的函数、被频繁访问的计数器变量

空间局部性:如果一个内存位置被访问,那么它附近的位置也很可能被访问。

  • 典型例子:数组的顺序遍历、顺序执行的指令序列、结构体中的成员变量

正是因为局部性原理,虚拟存储系统只需要把当前需要的少量页面放入内存,就能获得较高的命中率(页面在内存中的比例高)。

3️⃣ 虚拟页式存储的核心机制

3.1 页表项新增字段

虚拟页式存储的页表在普通页表的基础上,增加了以下关键字段:

字段 作用
存在位(有效位) 标记该页当前是否在物理内存中(1=在内存,0=在外存)
访问位(引用位) 记录该页最近是否被访问过(用于页面置换算法)
修改位(脏位) 记录该页是否被修改过(换出时判断是否需要写回磁盘)
外存地址 该页在磁盘上的存放位置(换入时使用)

3.2 地址转换流程(带缺页处理)

复制代码
程序给出逻辑地址
    ↓
提取页号和偏移量
    ↓
查页表 → 检查存在位
    ↓
  存在位=1 → 页框号 + 偏移 → 物理地址(正常访问)
    ↓
  存在位=0 → 触发缺页中断 → 操作系统处理缺页

4️⃣ 缺页中断(Page Fault)

缺页中断是指当CPU访问的页面不在物理内存中时,由硬件触发的中断。操作系统在中断处理程序中负责从磁盘将缺失的页面调入内存。

4.1 缺页中断的完整处理流程

  1. 触发缺页:CPU访问的逻辑页不存在于物理内存中,硬件触发缺页中断
  2. 保存现场:操作系统保存当前进程的CPU上下文(寄存器、程序计数器等)
  3. 查找空闲页框:在物理内存中查找空闲页框
  4. 页面置换(如果内存已满):选择一页换出到磁盘(根据页面置换算法)
  5. 磁盘I/O:从磁盘中读取缺失的页面到分配的页框中
  6. 更新页表:修改页表项,将存在位设为1,记录页框号
  7. 恢复现场:恢复被中断进程的CPU上下文
  8. 重新执行:进程重新执行引发缺页的那条指令(此时页面已在内存中)

一次缺页中断会触发一次磁盘I/O,而磁盘I/O的速度比内存访问慢几个数量级,因此缺页中断的代价非常高------这也是页面置换算法和TLB能极大提升系统性能的根本原因。

4.2 缺页中断与普通中断的区别

对比项 普通中断 缺页中断
触发原因 I/O完成、时钟中断等外部或内部事件 访问的页面不在内存中
发生时间 指令执行完成后 指令执行过程中(地址转换时)
处理完成后 返回原指令下一条执行 重新执行原指令(因为页面已调入)
是否涉及磁盘I/O 通常不涉及 通常涉及(从磁盘读页)
处理时间 微秒级 毫秒级(磁盘I/O主导)

5️⃣ 经典例题

例题1:以下关于局部性原理的叙述中,正确的是( )。

A. 时间局部性是指程序访问了某个数据后,不久后会访问它附近的数据

B. 空间局部性是虚拟存储管理的唯一理论依据

C. 循环结构体现了时间局部性

D. 数组的随机访问体现了空间局部性

解析 :A描述的是空间局部性;B错误,虚拟存储的依据是时间局部性和空间局部性两者;D错误,随机访问不体现空间局部性(顺序访问才体现)。C正确,循环中的代码反复执行,体现了时间局部性。选 C


例题2:缺页中断处理完成后,操作系统应该( )。

A. 从下一条指令开始继续执行

B. 重新执行引发缺页的那条指令

C. 终止当前进程

D. 调度下一个进程

解析 :缺页中断处理完成后,操作系统恢复现场并重新执行引发缺页的那条指令(此时页面已在内存中,可以正常完成)。选 B


例题3(判断):发生缺页中断时,系统一定存在空闲页框。( )

解析:错误。缺页中断发生时,物理内存可能已经满了,此时需要通过页面置换算法换出一页,腾出空闲页框。

6️⃣ 记忆口诀

虚拟存储靠局部,时间空间两局部。

缺页中断代价高,磁盘I/O最耗时。

处理完恢复现场,重新执行原指令。

7️⃣ 小测验(评论区对答案)

某虚拟页式存储系统中,CPU访问某逻辑页时发现该页不在内存中,此时会触发( )。操作系统处理完成后,应该( )。

A. 缺页中断;从下一条指令继续执行

B. 缺页中断;重新执行该指令

C. 越界中断;从下一条指令继续执行

D. 越界中断;重新执行该指令

🔔 本专栏日更2篇,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容

#软考中级 #软件设计师 #虚拟存储 #局部性原理 #缺页中断 #操作系统

相关推荐
NULL指向我2 小时前
TMS320F28379D笔记5:CAN通信多邮箱配置
笔记
aaaameliaaa3 小时前
进制练习题【找出只出现一次的数字、交换两个变量(不创建临时变量)、统计二进制中1的个数、打印整数二进制的奇数位和偶数位、求两个数二进制中不同位的个数】
c语言·数据结构·笔记·算法
RainCity4 小时前
Java Swing 自定义组件库分享(十三)
java·笔记·后端
llllliznc7 小时前
LLM 学习笔记 Day 5:Agent 核心组件——Planner、Memory 与 Reflection
笔记·学习
risc1234567 小时前
“解决了什么痛点”与“为什么有这个东西”的关系?
笔记
hj2862517 小时前
Docker 容器化技术标准化笔记
java·笔记·docker
hyhsandy18037 小时前
STM32F103 TIM学习笔记
笔记·stm32·学习
栈溢出了7 小时前
Redis 消息队列笔记:List 与 Pub/Sub
redis·笔记·list
鹰影478 小时前
一款AI笔记助手和远程同步的markdown笔记idea-note
人工智能·笔记·rust·typescript·react