虚拟内存核心原理

基础概念
地址翻译
页表结构
多级页表
缺页中断

什么是虚拟内存?

核心概念:虚拟内存是操作系统提供的一种内存管理技术,它为每个进程提供一个连续、独立且看似无限的地址空间,而实际上物理内存可能有限且分散。

为什么需要虚拟内存?

内存隔离
每个进程都有独立的地址空间,防止相互干扰
内存扩展
使用磁盘作为交换空间,提供比物理内存更大的地址空间
内存共享
多个进程可以共享同一物理内存页(如共享库)
简化编程
程序员无需关心物理内存布局,使用连续虚拟地址

物理内存 vs 虚拟内存

特性 物理内存 虚拟内存
可见性 操作系统管理,进程不可见 进程直接访问的地址空间
大小 受硬件限制(如16GB RAM) 受CPU位数限制(32位→4GB,64位→16EB)
连续性 可能分散、碎片化 对每个进程看似连续
分配 以页为单位分配给进程 进程看到完整的地址空间

交互演示:物理内存与虚拟内存的映射关系

地址翻译过程

核心机制:CPU生成的地址是虚拟地址,需要通过页表(Page Table)翻译成物理地址,才能访问实际的物理内存。

地址结构

虚拟地址(VA)= 虚拟页号(VPN) + 页内偏移(Offset)
例如:32位系统,页大小4KB(2^12),则低12位是Offset,高20位是VPN
1
2
3
4

交互演示:地址翻译流程

点击"下一步"开始演示地址翻译过程...

页表原理

页表(Page Table):存储虚拟页到物理页映射关系的数据结构,每个进程都有自己的页表。

页表项(PTE)的关键字段

字段 作用
有效位(Valid Bit) 该页是否在物理内存中(1=在内存,0=不在)
物理页号(PPN) 对应的物理页框号
访问位(Accessed Bit) 该页是否被访问过(用于页面置换算法)
修改位(Dirty Bit) 该页是否被修改过(换出时是否需要写回磁盘)
保护位(Protection Bits) 读/写/执行权限

交互演示:页表查找过程

多级页表设计

为什么需要多级页表?如果虚拟地址空间很大(如64位系统的16EB),单级页表会占用巨大空间。多级页表只存储实际使用的部分,大幅节省内存。

单级页表的问题

问题:32位系统,4KB页 → 需要2^20个页表项,每个4字节 → 每个进程需要4MB连续内存存储页表!

多级页表的优势

节省空间
只为使用的虚拟地址分配页表
灵活性
支持大地址空间和稀疏地址分配
连续性要求低
各级页表可以分散在物理内存中

交互演示:两级页表地址翻译

缺页中断(Page Fault)

缺页中断:当进程访问的页面不在物理内存中时,会触发缺页中断,操作系统需要将所需页面从磁盘加载到物理内存。

缺页中断处理流程

1
2
3
4
5

交互演示:缺页中断处理流程

点击"下一步"开始演示缺页中断处理流程...

性能影响:缺页中断需要磁盘I/O,代价很高(通常是纳秒级内存访问 vs 毫秒级磁盘访问,相差百万倍)。好的程序应该尽量减少缺页中断次数。