Skip to content

内存管理基础

内存(RAM)是 CPU 能直接访问的易失性主存,程序要运行必须先把代码与数据载入内存。但物理内存有限、又是多进程共享的稀缺资源——操作系统必须决定:每个进程的地址怎么安排(地址绑定)、内存怎么切成块分给进程(连续分配)、分不下了产生的零头怎么处理(碎片整理)、以及内核自己频繁创建/销毁小对象时如何高效分配(伙伴系统/slab)。这些是内存管理的地基——不理解逻辑地址与物理地址的分离,就无法理解虚拟内存;不理解碎片,就无法诊断为什么"内存还剩很多却分配失败";不理解伙伴系统与 slab,就读不懂 Linux 内核的 kmalloc/slab 机制。

本叶聚焦连续内存分配这一最朴素也最基础的模型,全部考点围绕三条主线展开:①地址抽象——逻辑地址 vs 物理地址、地址绑定的三个时机(编译时/加载时/执行时),讲清"程序里的地址"如何变成"硬件上的地址";②连续分配方案——单一分区、固定分区(产生内部碎片)、动态分区(产生外部碎片),以及动态分区的三种放置策略(首次/最佳/最坏适应)与紧凑(compaction);③碎片与高效分配——内部 vs 外部碎片的区别、伙伴系统(2 的幂次分配与合并,O(log n))、slab 分配(内核对象池,预分配复用)。非连续分配(分页/分段/虚拟内存)是下一叶的主题,本叶不展开缺页与页面置换。

评价

优点

  • 地址抽象:逻辑地址/物理地址分离,让程序可重定位、可同时多份运行,为虚拟内存奠基
  • 方案直观:连续分配是最朴素的模型,固定/动态分区易于理解,是学习分页/分段的前置
  • 伙伴系统高效:按 2 的幂次分配,合并查找 O(log n),外碎片可控,是 Linux 物理页分配器的核心
  • slab 消除对象开销:预分配对象池复用,避免反复初始化,把小对象分配降到 O(1)

缺点

  • 连续分配外碎片严重:动态分区随分配/释放产生大量小空洞,总空闲够但无大块可用
  • 固定分区内碎片浪费:小进程占大分区,分区内的剩余空间被白白浪费且无法被他人使用
  • 紧凑代价高:搬移进程要重新绑定地址(必须是执行时绑定),且是停机操作,开销大
  • 伙伴系统内部碎片:要 17KB 给 32KB,约 50% 浪费(向上取整到 2 的幂)

本叶地图

  • 入门 —— 为何要内存管理、逻辑地址 vs 物理地址、地址绑定三时机、连续分配方案概览
  • 连续分配与碎片 —— 固定分区(内部碎片)、动态分区(外部碎片)、首次/最佳/最坏适应、紧凑 compaction、内部 vs 外部碎片
  • 伙伴系统与 Slab 分配 —— 伙伴系统(2 的幂次分配与合并,O(log n))、slab 分配(内核对象池,预分配)、非连续分配引入
  • 参考 —— 分配策略对比表、碎片类型、伙伴系统/slab 速查、易错点、权威链接

幻灯片地址

内存管理基础

测试题

内存管理基础测试题