内存管理

核心问题只有一个:如何在有限、异构、昂贵的物理存储资源之上,构造一个安全、可扩展、对程序友好的逻辑地址世界。


一、问题起点:物理内存的客观约束

1.1 分层存储器体系(Memory Hierarchy)

物理现实:

结论

内存管理的本质,是在分层存储器体系之上进行数据放置与迁移决策

1.2 存储管理器的职责

操作系统中负责内存的核心子系统,其职责不是“分配内存”,而是:


二、第一阶段:无存储器抽象(Bare Machine Model)

2.1 直接暴露物理地址的问题

在无抽象模型下:

导致两个根本性缺陷:

  1. **无法隔离**:安全性不可控
  2. **无法并发**:多道程序设计几乎不可实现

2.2 静态重定位的历史方案

如 IBM 360:

关键认知

这不是“抽象”,只是一次性地址修正。


三、核心抽象的诞生:地址空间(Address Space)

3.1 地址空间的本质定义

地址空间 = 一组逻辑地址的有序集合

关键不是“地址”,而是:

这与编程语言中的作用域 / 命名空间是同一类抽象。

3.2 抽象带来的两个核心能力

运行多个程序而互不干扰,必须解决:

  1. **保护(Protection)**:禁止非法访问
  2. **重定位(Relocation)**:地址可移动

3.3 基址 / 界限寄存器模型

认知层结论

这是最小可用的地址空间实现,但扩展性极差。


四、资源压力的应对:交换与连续内存管理

4.1 局部性原理(Locality)

程序行为呈现:

这是虚拟内存一切机制的理论基础

4.2 交换(Swapping)的思想

问题:

4.3 连续内存的空闲管理

两类本质模型

所有“首次 / 最佳 / 最差 / 快速适配”算法,本质上都是:

在碎片率与搜索成本之间取舍


五、质变点:虚拟内存(Virtual Memory)

5.1 抽象升级

地址空间 ≠ 物理内存大小

虚拟内存将地址空间切分为页(Page)

5.2 页、页框与映射

访问不存在映射的页 → 缺页中断


六、地址转换体系:MMU + 页表 + TLB

6.1 MMU 的角色定位

MMU 不是“操作系统组件”,而是:

硬件执行抽象的载体

职责:

6.2 页表的逻辑模型

每个页表项(PTE)至少包含:

6.3 TLB:缓存加速抽象

TLB 的本质:

地址转换结果的高速缓存

它将一次可能需要多次内存访问的操作,压缩为一次硬件并行匹配。


七、规模问题:大地址空间的页表设计

7.1 多级页表

7.2 倒排页表

统一认知

页表设计的本质是:稀疏映射的压缩表达


八、多进程语义:共享、隔离与保护

8.1 虚拟内存的进程视角

8.2 共享的工程价值

8.3 内存保护模型

权限控制并不作用于“物理内存”,而是:

作用于地址空间到物理页的映射关系


九、缓存淘汰的统一模型:页面置换算法

9.1 统一抽象

页面置换 ≈ 缓存淘汰

9.2 算法谱系

核心权衡


十、系统稳定性问题:颠簸与负载控制

目标只有一个:

防止系统进入自激振荡(Thrashing)


十一、分段、分页与历史融合

11.1 分段的动机

11.2 分页的动机

11.3 段页式模型

结论

分段解决“语义”,分页解决“规模”。


十二、进程内存布局与系统调用接口

现代内存管理已高度依赖 mmap 作为统一抽象接口


十三、用户态分配器:再一次抽象

13.1 malloc 的真实职责

malloc 并不管理“内存”,而是:

管理一段虚拟地址区间的子分配

13.2 分配器的核心设计问题

所有实现(ptmalloc / jemalloc / tcmalloc)都是在这组问题上的不同取舍。


十四、异常与中断:抽象失效的处理路径

14.1 页异常类型

14.2 缺页中断处理流程


十五、虚拟化场景下的内存管理

结论

虚拟化并没有引入新问题,只是把“地址转换”堆叠了一层。


十六、常见内存错误的抽象视角

所有内存错误,本质都源于:

程序假设的地址语义,与系统维护的真实映射不一致

关联内容(自动生成)