2. 内存管理基础回顾:虚拟地址空间、物理内存、页表与MMU工作原理

在深入页表回收与Swap协同设计之前,必须牢固掌握内存管理的四大核心支柱:虚拟地址空间、物理内存、页表与MMU(内存管理单元)。它们共同构成了现代操作系统内存虚拟化的基石,也是后续所有性能调优动作的硬件与软件基础。

2.1 虚拟地址空间与物理内存

每个进程拥有独立的虚拟地址空间(如32位下4GB,64位下理论16EB),而物理内存是有限的硬件资源。操作系统通过地址翻译将虚拟地址映射到物理地址,实现隔离与共享。

核心概念:虚拟地址空间使每个进程“以为”自己独占内存,简化了编程模型;物理内存则是实际存储指令与数据的DRAM芯片。
维度 虚拟地址空间 物理内存
本质 进程看到的抽象内存视图 硬件提供的实际存储介质
大小 由CPU位宽决定(如48位地址线) 由主板DIMM插槽与颗粒决定
分配 按需分配虚拟页 按需分配物理页框
映射关系 通过页表映射到物理页框或磁盘 被多个虚拟页共享或独占
典型瓶颈 地址空间碎片、TLB缺失 容量不足、带宽受限
虚拟地址空间与物理内存映射关系 虚拟地址空间 进程A 虚拟页0 进程A 虚拟页1 进程A 虚拟页2 进程A 虚拟页3 进程A 虚拟页4 进程A 虚拟页5 物理内存 物理页框0 物理页框1 物理页框2 物理页框3 物理页框4 物理页框5 页表维护映射关系

2.2 页表:虚拟到物理的转换表

页表是操作系统为每个进程维护的数据结构,记录虚拟页号(VPN)到物理页框号(PFN)的映射。现代系统普遍采用多级页表(如x86_64的四级页表)以节省内存。

  • 单级页表:连续存储所有映射项,占用大量连续物理内存(32位系统需4MB)。
  • 多级页表:按需分配中间页目录,未使用的虚拟地址区域不分配页表页,大幅降低内存开销。
  • 页表项(PTE):包含PFN、存在位(Present)、读写位(R/W)、用户/超级用户位(U/S)、脏位(Dirty)、访问位(Accessed)等标志位。
性能关键:脏位(Dirty)和访问位(Accessed)是页表回收与Swap换出决策的核心依据。操作系统定期扫描这些位以判断页面活跃度。
四级页表地址翻译流程 虚拟地址 (48位) PML4 PDPT PD PT 页内偏移 (Offset) PML4表 PDPT表 PD表 PT表 物理页框 翻译流程:CR3 → PML4表 → PDPT表 → PD表 → PT表 → 物理页框 每级页表占用一个4KB页框,未使用的中间表不分配 TLB缓存最近使用的翻译结果,减少内存访问次数

2.3 MMU工作原理

MMU是CPU内部的硬件模块,负责自动完成虚拟地址到物理地址的翻译。每次CPU访问内存时,MMU执行以下步骤:

  1. 解析虚拟地址:提取页号(VPN)和页内偏移(Offset)。
  2. TLB查找:在Translation Lookaside Buffer(TLB)中查找VPN对应的PFN。若命中(TLB Hit),直接得到物理地址。
  3. 页表遍历:若TLB未命中(TLB Miss),MMU硬件自动遍历多级页表,逐级读取页目录和页表项。
  4. 权限检查:检查PTE中的R/W、U/S等标志位,若违反权限则触发缺页异常(Page Fault)。
  5. 物理地址生成:将PFN与Offset拼接,形成最终物理地址,发送到内存控制器。
性能陷阱:TLB Miss会导致多次内存访问(四级页表最多4次),严重拖慢程序执行。大页(Huge Pages)通过减少页表层级和TLB项覆盖范围,是缓解TLB Miss的有效手段。
MMU地址翻译流程图 CPU发出虚拟地址 TLB查找 TLB命中 → 直接翻译 TLB未命中 → 页表遍历 权限检查 & 物理地址生成 访问物理内存

2.4 关键数据结构:页表项(PTE)

页表项是页表的基本单元,每个PTE对应一个虚拟页的映射信息。以x86_64架构为例,PTE大小为8字节,其关键字段如下:

位域 名称 说明
Bit 0 Present (P) 页面是否在物理内存中。为0时触发缺页异常,Swap换入流程启动。
Bit 1 Read/Write (R/W) 0表示只读,1表示可读写。写保护页用于写时复制(CoW)。
Bit 2 User/Supervisor (U/S) 0表示仅内核可访问,1表示用户态也可访问。
Bit 5 Accessed (A) 硬件自动置位,表示页面被访问过。操作系统定期清除该位以统计活跃度。
Bit 6 Dirty (D) 硬件自动置位,表示页面被写入过。脏页在换出时必须写回Swap设备。
Bits 12-51 Physical Frame Number (PFN) 物理页框号,指向4KB对齐的物理页框。
回收决策依据:页表回收算法(如LRU、Clock、工作集模型)依赖Accessed位和Dirty位判断页面热度。未被访问的干净页(A=0, D=0)是优先回收对象;脏页(D=1)换出前需写回磁盘,代价更高。

2.5 缺页异常与Swap入口

当MMU遍历页表发现PTE的Present位为0时,触发缺页异常(Page Fault)。操作系统缺页异常处理程序根据异常类型执行不同流程:

  • 有效缺页(Major Page Fault):页面已被换出到Swap设备,需从磁盘读入物理内存。这是Swap换入的核心路径,I/O延迟高。
  • 轻微缺页(Minor Page Fault):页面在物理内存中但PTE未建立映射(如共享页、匿名页首次访问),只需分配页框并建立PTE。
  • 无效缺页(Invalid Page Fault):访问非法地址(如空指针、越界),触发段错误(Segmentation Fault)。
缺页异常分类与处理流程 缺页异常触发 有效缺页 从Swap读入磁盘 轻微缺页 分配页框,建立映射 无效缺页 发送SIGSEGV信号 有效缺页是Swap换入的主要路径,其延迟直接影响内存压力场景下的应用性能

2.6 小结:内存管理基础与后续章节的关联

虚拟地址空间、物理内存、页表与MMU构成了内存管理的闭环。理解这些基础后,后续章节将深入探讨:

  • 页表回收算法:如何利用PTE的Accessed/Dirty位高效选择回收候选页。
  • Swap换出/换入:缺页异常处理程序如何与块设备层交互,完成页面换入换出。
  • 性能调优:TLB缺失率、缺页异常频率、Swap I/O吞吐量等指标如何指导系统优化。