分页、分段与虚拟内存
虚拟内存(Virtual Memory)是现代操作系统最伟大的发明之一——它让每个进程以为自己独享一片连续、私有的地址空间(如 64 位下 2^48 的虚拟地址),而真实物理内存(RAM)只有几 GB 到几百 GB。这层"假象"靠地址翻译实现:CPU 发出的虚拟地址,经页表(Page Table)+ MMU翻译成物理地址,再访问 DRAM。没有虚拟内存,进程之间无法隔离(一个进程能写坏另一个进程的内存),也无法运行比物理内存大的程序(早期裸机时代程序受限于物理 RAM)。有了虚拟内存,进程隔离(地址空间独立)、按需加载(只有用到的页才进内存)、内存超售(swap 让总和大于物理内存)都成为可能。
理解虚拟内存的全部考点围绕地址翻译机制与内存不够时的应对展开:①分页机制(固定大小的页/帧、页表映射、内部碎片);②多级页表与 TLB(如何让页表省内存、如何让翻译不慢);③分段与段页式(按逻辑段切分的另一种思路);④虚拟内存原理与缺页中断(页不在内存时从磁盘读回的 fault 流程);⑤请求分页与局部性(按需调页的依据是程序访问的时空局部性);⑥页面置换算法(FIFO/LRU/最优/Clock,内存满时淘汰谁);⑦Belady 异常(FIFO 帧数增加缺页反增的反直觉现象);⑧抖动与工作集(频繁缺页导致 CPU 几乎空转的灾难,及工作集理论如何指导分配帧数)。本叶是内存管理的核心与重镇——页表机制是隔离与保护的基础,页面置换是有限内存下运行大程序的工程智慧,几乎所有 OS 面试与考研的内存管理题都集中于此。
评价
优点
- 进程隔离与保护:每个进程独立地址空间 + 页表权限位,进程之间无法读写对方内存(页表不映射),崩溃只影响自己
- 内存超售与按需加载:程序不必全部装入内存(请求分页),用到的页才驻留;swap 让虚拟内存总和远大于物理 RAM
- 简化编程与链接:每个进程都看到统一的虚拟地址空间(代码段/数据段/堆/栈布局一致),编译器与链接器无需关心物理地址
- 高效的内存利用:分页消除外部碎片,按 4KB 页分配;空闲帧可共享、可缓存、可写时复制(COW)
缺点
- 翻译开销:每次访存都要查页表——若无 TLB 缓存,一次访存变成多次(多级页表更糟);TLB miss 与缺页中断是性能黑洞
- 页表占内存:单进程页表可达数 MB(64 位下更大),多级页表虽省但增加翻译层级
- 缺页与抖动:内存压力大时频繁缺页(磁盘 IO 极慢),极端下陷入抖动(thrashing)——CPU 几乎全在换页,吞吐崩塌
- 碎片与浪费:分页有内部碎片(最后一页填不满);分段有外部碎片(空闲块零碎不连续)
本叶地图
- 入门 —— 虚拟内存思想、分页 vs 分段、页表与 TLB、缺页机制、局部性原理
- 分页、分段与页表 —— 分页(页/帧/页表/内部碎片)、多级页表、TLB 命中率、反置页表、分段、段页式、逻辑地址→物理地址转换计算
- 页面置换算法与抖动 —— FIFO、LRU、最优 OPT、Clock(二次机会)、Belady 异常、抖动与工作集理论
- 参考 —— 分页 vs 分段对比、置换算法对比表、地址转换计算模板、易错点清单、权威链接