外部碎片与定长分配思维 —— 补充理解

本文档作为第 17 章(空闲空间管理)与第 18 章(分页)之间的概念桥梁,深入理解"外部碎片 vs 内部碎片"这对核心矛盾,以及操作系统从"变长分配"转向"定长分配"背后的工程哲学。


一、什么是外部碎片?

外部碎片 (External Fragmentation):系统中虽然有足够的总空闲空间来满足一个内存请求,但由于这些空间是零散的、不连续的小孔,导致无法分配出一个完整的连续块。

直觉理解:

内存总共有 100MB 空闲。你想运行一个需要 20MB 的程序。

但这 100MB 是由 50 个分布在各处、每个大小仅为 2MB 的小空隙组成的。

结果:虽然还有 100MB 空闲,但连一个 20MB 的程序都塞不进去。


二、外部碎片是如何产生的?

两个关键因素交织:

  1. 变长分配:每个程序请求的大小都不一样(10MB、15MB、3KB……)
  2. 随机释放:程序运行时间不同,退出的顺序也不同

动态演进的例子:

阶段 状态
初始 一整块连续空闲内存
分配 A(10MB), B(20MB), C(10MB) 依次进入,挨个排好
释放 B 运行完毕退出,A 和 C 之间留下一个 20MB 的洞
尴尬 D 需要 25MB——20MB 的洞太小,后面的空间虽够但不连续,D 无法加载

随着系统运行时间变长,内存就像被虫蛀过的木头,到处是无法利用的小孔。


三、外部碎片 vs 内部碎片

外部碎片 (External Fragmentation) 内部碎片 (Internal Fragmentation)
本质 空闲空间被分割成不连续的小块 已分配块内部多余未用的空间
成因 变长分配 + 随机释放 定长/对齐分配(分配的大小 > 请求的大小)
是否阻止分配 是——即使总量够,但不连续 否——分配本身成功,只是内部有浪费
可控性 不可控——严重时系统无法运行新程序 可控且可预测——每块浪费不超过一个分配单位
解决方案 分割 + 合并;或转向定长分配 调整分配粒度,接受可控浪费

核心权衡: 操作系统设计中不存在免费的午餐。消灭外部碎片的唯一可靠办法就是转向定长分配——而这必然引入内部碎片。


四、为什么"定长分片"能彻底消灭外部碎片?

这就是分页 (Paging) 技术的逻辑基础。核心思想:不再按需切割,而是标准化。

逻辑闭环

  1. 物理空间标准化:把物理内存切割成固定大小的块(如每块 4KB),称为页帧 (Page Frame)
  2. 请求标准化:不管程序实际需要多少,分配大小必须是 4KB 的整数倍
  3. 非连续映射:最关键的一点——程序不再需要物理上连续的空间

为什么这样就没碎片了?

因为所有的"洞"和所有的"块"大小完全一样


五、完整策略对照

策略 核心思想 外部碎片 内部碎片 时间开销
最优匹配 (Best-fit) 找最接近请求大小的块 尽量减少 高(遍历列表)
首次匹配 (First-fit) 找第一个够用的块 较多 低(找到即停)
伙伴系统 (Buddy System) 只分配 2 的幂次方大小,位运算合并 较少 有(平均浪费 ~25%) 极快(合并通过异或)
分离空闲列表 (Segregated List) 为常用大小维护独立缓存池 消灭 有(定长缓存) 极快(无遍历)
分页 (Paging) 固定 4KB 页帧,非连续映射 彻底消灭 有(每页最多浪费 ~4KB) 硬件加速(MMU/TLB)

关键转折: 从最优匹配一路到分页,发展脉络清晰地表明——与其在变长分配中与外部碎片缠斗不休,不如彻底转向定长分配,用可控的内部碎片换取确定性性能


六、工程哲学:从"裁缝铺"到"制衣厂"

变长分配(裁缝铺) 定长分配(制衣厂)
模式 量体裁衣,每个客户量身定做 只做标准码
空间效率 理论上最优(无内部浪费) 有内部浪费(S/M/L 不一定合身)
管理复杂度 高——要跟踪无数不同大小的碎片 低——所有块大小一样,管理简单
风险 外部碎片积累到一定程度系统瘫痪 内部碎片可控,系统稳定性有保障

操作系统的选择很明确:宁可要可控的低效,也不要不可控的风险。


七、术语速查表

术语 英文 定义
外部碎片 External Fragmentation 空闲空间被分割成不连续小块,无法满足连续分配请求
内部碎片 Internal Fragmentation 已分配块内超出实际需求的多余空间
空闲列表 Free List 记录所有空闲内存块位置和大小的数据结构
分割 Splitting 将一个大空闲块切分为分配块和剩余空闲块
合并 Coalescing 将物理地址相邻的空闲块合并为一个大块
页帧 Page Frame 物理内存被划分成的固定大小单位(通常 4KB)
分页 Paging 将虚拟内存映射到不连续的物理页帧的内存管理方案


导师的下一步建议:

从变长分配到定长分配,是操作系统内存管理中最重要的思维转换之一。外部碎片不可控,而内部碎片可控——操作系统宁可接受可控的低效,也不要不可控的风险。这个"标准化"的思路不仅体现在分页中,在文件系统、网络协议栈中都能看到它的影子。

接下来进入第 18 章,正式学习分页技术——它是如何通过固定大小的页和页帧,配合页表完成虚拟地址到物理地址的转换。

MOC · 下一章:Ch18 分页