定义
- 虚拟存储器:将主存和辅存统一管理,给用户提供比实际内存大得多的地址空间
- 程序运行时只将当前需要的部分装入内存,其余在辅存
- 虚拟空间大小由地址宽度决定(32 位→4GB,64 位→16EB)
- 以时间换空间:利用外存扩展内存逻辑容量
理论基础:局部性原理(Locality Principle)
- 时间局部性:刚被访问的数据近期很可能再次被访问(如循环体)
- 空间局部性:刚被访问的数据附近的地址很可能被访问(如数组遍历)
- 程序执行时有热点区域(循环、子程序调用),一段时间内仅访问少数页
- 基于此,无需一次性装入全部程序
实现方式
虚拟页式存储的页表结构
较普通页表更复杂,页表项包含:
| 字段 | 说明 |
|---|---|
| 合法位(Valid) | 1=在内存,0=在外存 |
| 修改位(Modified) | 是否被修改(决定淘汰时是否回写) |
| 页类型 | 零页/swap 区/文件映射(决定缺页处理方式) |
| 保护码 | 读写执行权限 |
| 外存块号 | 页在外存的位置 |
| 物理页帧号 | 在内存时的页帧号 |
Swap 分区(交换区)
- 硬盘上专门划分的交换区空间
- 代码页:从程序文件读入(只读,无需回写)
- 数据页:运行中可能修改,需回写到 swap 区
- 零页(未初始化数据):在内存中直接清零,不从外存读
重点 缺页中断处理流程
- CPU 发出逻辑地址,MMU 查页表
- 合法位 = 0(页不在内存)→ 产生缺页中断(硬件 trap)
- 进入缺页中断处理子程序
- 申请空闲页帧:
- 有空闲 → 直接分配
- 无空闲 → 按 页面置换策略 淘汰一页
- 检查页类型:
- 零页 → 物理页帧清零
- 非零页 → 从外存读入数据到页帧
- 填写页表项(页帧号、合法位置 1)
- 恢复执行访存指令
页淘汰流程
- 检查淘汰页的修改位:
- 未修改 → 合法位清零,页帧回收(无需 I/O)
- 已修改 → 需回写到外存(分配 swap 空间,调用 I/O 子系统)
- 页帧回收,更新页表项(合法位清零,更新外存块号)
关键问题
- 调入策略:何时调入(请求调页 vs 预调页)、调入多少
- 放置策略:放在内存何处
- 置换策略:内存满时选择哪个页/段调出 → 见 页面置换策略
重点 虚存访问过程
- CPU 发出逻辑地址
- MMU 查询页表
- 页在内存中 → 形成物理地址访问
- 页不在内存中 → 缺页中断 → 从磁盘调入 → 更新页表 → 重新执行
抖动(Thrashing)
- 定义:页面频繁在内存和外存间调入调出,系统效率急剧下降
- 原因:置换算法不合理 / 驻留集太小(工作集 > 物理内存)
- 解决:动态调整进程驻留集大小(工作集模型、缺页频率控制 PFF)