定义

  • 虚拟存储器:将主存和辅存统一管理,给用户提供比实际内存大得多的地址空间
  • 程序运行时只将当前需要的部分装入内存,其余在辅存
  • 虚拟空间大小由地址宽度决定(32 位→4GB,64 位→16EB)
  • 时间换空间:利用外存扩展内存逻辑容量

理论基础:局部性原理(Locality Principle)

  • 时间局部性:刚被访问的数据近期很可能再次被访问(如循环体)
  • 空间局部性:刚被访问的数据附近的地址很可能被访问(如数组遍历)
  • 程序执行时有热点区域(循环、子程序调用),一段时间内仅访问少数页
  • 基于此,无需一次性装入全部程序

实现方式

虚拟页式存储的页表结构

较普通页表更复杂,页表项包含:

字段说明
合法位(Valid)1=在内存,0=在外存
修改位(Modified)是否被修改(决定淘汰时是否回写)
页类型零页/swap 区/文件映射(决定缺页处理方式)
保护码读写执行权限
外存块号页在外存的位置
物理页帧号在内存时的页帧号

Swap 分区(交换区)

  • 硬盘上专门划分的交换区空间
  • 代码页:从程序文件读入(只读,无需回写)
  • 数据页:运行中可能修改,需回写到 swap 区
  • 零页(未初始化数据):在内存中直接清零,不从外存读

重点 缺页中断处理流程

  1. CPU 发出逻辑地址,MMU 查页表
  2. 合法位 = 0(页不在内存)→ 产生缺页中断(硬件 trap)
  3. 进入缺页中断处理子程序
  4. 申请空闲页帧:
  5. 检查页类型:
    • 零页 → 物理页帧清零
    • 非零页 → 从外存读入数据到页帧
  6. 填写页表项(页帧号、合法位置 1)
  7. 恢复执行访存指令

页淘汰流程

  1. 检查淘汰页的修改位
    • 未修改 → 合法位清零,页帧回收(无需 I/O)
    • 已修改 → 需回写到外存(分配 swap 空间,调用 I/O 子系统)
  2. 页帧回收,更新页表项(合法位清零,更新外存块号)

关键问题

  • 调入策略:何时调入(请求调页 vs 预调页)、调入多少
  • 放置策略:放在内存何处
  • 置换策略:内存满时选择哪个页/段调出 → 见 页面置换策略

重点 虚存访问过程

  1. CPU 发出逻辑地址
  2. MMU 查询页表
  3. 页在内存中 → 形成物理地址访问
  4. 页不在内存中 → 缺页中断 → 从磁盘调入 → 更新页表 → 重新执行

抖动(Thrashing)

  • 定义:页面频繁在内存和外存间调入调出,系统效率急剧下降
  • 原因:置换算法不合理 / 驻留集太小(工作集 > 物理内存)
  • 解决:动态调整进程驻留集大小(工作集模型、缺页频率控制 PFF)

相关概念