1. 虚拟内存概述

虚拟内存(Virtual Memory)是一种操作系统内存管理机制,它允许进程使用超过物理内存(RAM)大小的内存空间。其核心思想是:程序运行时只需要将部分代码和数据加载到内存中,其余部分可以保留在磁盘上,按需加载。

通过虚拟内存,系统可以:

  • 实现进程间的内存共享
  • 提高内存访问的安全性(通过内存隔离)
  • 使进程能够使用比物理内存更大的地址空间

虚拟内存为每个进程提供了一个连续的地址空间(逻辑地址空间),但实际上这些地址在物理内存中可能是分散的,甚至部分数据存储在磁盘上。

下图展示了虚拟内存的基本概念:

Compilation Flow Example Page 2

虚拟内存的实现主要有两种方式:

  • 分页(Paging)
  • 分段(Segmentation)

我们将在后续章节中分别介绍这两种机制,并进行对比。


2. 分页式虚拟内存

分页是最常见的虚拟内存实现方式。其核心思想是将内存划分为固定大小的块,称为页框(Frame),而程序的逻辑内存被划分为同样大小的块,称为页(Page)

在程序运行过程中,只有当前需要的页才会被加载到内存中,这种方式称为“按需分页(Demand Paging)”。

Compilation Flow Example Page 4

2.1. 分页的优势

  • 减少内存占用,提高系统并发处理能力
  • 降低 I/O 操作频率
  • 提高系统响应速度

2.2. 验证位(Validation Bit)

每个页表项(Page Table Entry)中都有一个验证位(Valid Bit),用于标识该页是否在内存中:

  • 1:表示该页在内存中
  • 0:表示该页不在内存中,或引用无效

当验证位为 0 时,访问该页会触发一个缺页异常(Page Fault),操作系统会负责将该页从磁盘加载到内存。

2.3. 缺页异常(Page Fault)

当发生缺页异常时,系统会执行以下操作:

  1. 定位磁盘中所需页的位置
  2. 寻找一个空闲页框(Frame)
  3. 将页加载到该页框
  4. 更新页表
  5. 继续执行触发异常的指令

如果内存中没有空闲页框,就需要进行页替换(Page Replacement)

2.4. 页替换算法

页替换的目标是选择一个页框将其内容换出(写回磁盘),以腾出空间给新页。常见算法包括:

算法 说明 特点
FIFO 先进先出 简单但可能产生“Belady 异常”
LRU 最近最少使用 性能较好,但实现复杂
LFU 最不经常使用 基于访问频率
MFU 最常使用 较少使用

⚠️ 最优页替换算法(OPT)理论上最优,但无法实际实现,因为它需要预知未来访问序列。


3. 分段式虚拟内存

分段(Segmentation)是另一种虚拟内存实现方式。与分页不同,分段将内存划分为大小不一的连续区域,称为“段(Segment)”

逻辑地址由两个部分组成:

  • 段号(Segment Number):用于在段表中查找段的描述信息
  • 偏移量(Offset):表示在该段内的位置

每个段表项中包含:

  • 基地址(Base Address):段在物理内存中的起始地址
  • 段长度(Limit):段的大小

Blank diagram 4

分段机制允许程序按照逻辑结构(如代码段、数据段、堆栈段等)组织内存,提高了内存的灵活性和可管理性。

3.1. 段描述符(Segment Descriptor)

段描述符是一个 8 字节的结构,用于描述段的属性。其字段包括:

字段 含义
BA 基地址
G 粒度(0: 字节,1: 4KB 页)
D 默认操作数大小(16/32 位)
B 同 D
L 长模式(64 位)
AVL 可用位(供软件使用)
P 是否在内存中
DPL 描述符特权等级
T 类型
C 是否可跨特权级访问
E 扩展方向
R/W 可读写标志
A 是否被访问过

段描述符保存在两种表中:

  • GDT(Global Descriptor Table):全局描述符表,系统唯一
  • LDT(Local Descriptor Table):局部描述符表,每个进程一个

3.2. 段选择子(Segment Selector)

段选择子是一个 16 位的结构,用于定位段描述符。其字段包括:

字段 含义
Index 描述符索引
TI 表指示器(0: GDT,1: LDT)
RPL 请求者特权等级

当进程访问内存时,首先通过段选择子找到对应的段描述符,再根据描述符中的信息定位到物理内存中的段。


4. 分页 vs 分段

特性 分页(Paging) 分段(Segmentation)
地址划分 固定大小 可变大小
碎片问题 无外部碎片,有内部碎片 有外部碎片
内存共享 难以直接共享 易于共享整个段
内存保护 通过页表权限控制 通过段描述符控制
实现复杂度 相对简单 较复杂
支持逻辑结构 不支持 支持模块化结构

分页更适合现代操作系统,因为它简化了内存管理和页替换机制,同时避免了外部碎片问题。

分段虽然更符合程序逻辑结构,但实现复杂且容易产生外部碎片,因此在现代系统中逐渐被弃用。


5. 总结

虚拟内存是操作系统内存管理的关键机制,它通过分页或分段技术,使得程序可以使用比物理内存更大的地址空间。

  • 分页:固定大小,易于实现,适合现代系统
  • 分段:逻辑结构清晰,但复杂且易产生碎片

在实际系统中,通常采用分页机制,有时也会结合分段实现段页式内存管理(Segmented Paging),以兼顾逻辑结构与性能。

💡 踩坑提醒:理解虚拟内存的工作机制对于系统调优和性能分析至关重要,尤其是在处理缺页异常和页替换时,合理选择算法能显著提升系统效率。


原始标题:Virtual Memory