虚拟内存核心原理
什么是虚拟内存?
核心概念:虚拟内存是操作系统提供的一种内存管理技术,它为每个进程提供一个连续、独立且看似无限的地址空间,而实际上物理内存可能有限且分散。
为什么需要虚拟内存?
内存隔离
每个进程都有独立的地址空间,防止相互干扰
内存扩展
使用磁盘作为交换空间,提供比物理内存更大的地址空间
内存共享
多个进程可以共享同一物理内存页(如共享库)
简化编程
程序员无需关心物理内存布局,使用连续虚拟地址
物理内存 vs 虚拟内存
| 特性 |
物理内存 |
虚拟内存 |
| 可见性 |
操作系统管理,进程不可见 |
进程直接访问的地址空间 |
| 大小 |
受硬件限制(如16GB RAM) |
受CPU位数限制(32位→4GB,64位→16EB) |
| 连续性 |
可能分散、碎片化 |
对每个进程看似连续 |
| 分配 |
以页为单位分配给进程 |
进程看到完整的地址空间 |
交互演示:物理内存与虚拟内存的映射关系
地址翻译过程
核心机制:CPU生成的地址是虚拟地址,需要通过页表(Page Table)翻译成物理地址,才能访问实际的物理内存。
地址结构
虚拟地址(VA)= 虚拟页号(VPN) + 页内偏移(Offset)
例如:32位系统,页大小4KB(2^12),则低12位是Offset,高20位是VPN
页表原理
页表(Page Table):存储虚拟页到物理页映射关系的数据结构,每个进程都有自己的页表。
页表项(PTE)的关键字段
| 字段 |
作用 |
| 有效位(Valid Bit) |
该页是否在物理内存中(1=在内存,0=不在) |
| 物理页号(PPN) |
对应的物理页框号 |
| 访问位(Accessed Bit) |
该页是否被访问过(用于页面置换算法) |
| 修改位(Dirty Bit) |
该页是否被修改过(换出时是否需要写回磁盘) |
| 保护位(Protection Bits) |
读/写/执行权限 |
多级页表设计
为什么需要多级页表?如果虚拟地址空间很大(如64位系统的16EB),单级页表会占用巨大空间。多级页表只存储实际使用的部分,大幅节省内存。
单级页表的问题
问题:32位系统,4KB页 → 需要2^20个页表项,每个4字节 → 每个进程需要4MB连续内存存储页表!
多级页表的优势
节省空间
只为使用的虚拟地址分配页表
灵活性
支持大地址空间和稀疏地址分配
连续性要求低
各级页表可以分散在物理内存中
缺页中断(Page Fault)
缺页中断:当进程访问的页面不在物理内存中时,会触发缺页中断,操作系统需要将所需页面从磁盘加载到物理内存。
缺页中断处理流程
性能影响:缺页中断需要磁盘I/O,代价很高(通常是纳秒级内存访问 vs 毫秒级磁盘访问,相差百万倍)。好的程序应该尽量减少缺页中断次数。