外部碎片与定长分配思维 —— 补充理解
本文档作为第 17 章(空闲空间管理)与第 18 章(分页)之间的概念桥梁,深入理解"外部碎片 vs 内部碎片"这对核心矛盾,以及操作系统从"变长分配"转向"定长分配"背后的工程哲学。
一、什么是外部碎片?
外部碎片 (External Fragmentation):系统中虽然有足够的总空闲空间来满足一个内存请求,但由于这些空间是零散的、不连续的小孔,导致无法分配出一个完整的连续块。
直觉理解:
内存总共有 100MB 空闲。你想运行一个需要 20MB 的程序。
但这 100MB 是由 50 个分布在各处、每个大小仅为 2MB 的小空隙组成的。
结果:虽然还有 100MB 空闲,但连一个 20MB 的程序都塞不进去。
二、外部碎片是如何产生的?
两个关键因素交织:
- 变长分配:每个程序请求的大小都不一样(10MB、15MB、3KB……)
- 随机释放:程序运行时间不同,退出的顺序也不同
动态演进的例子:
| 阶段 | 状态 |
|---|---|
| 初始 | 一整块连续空闲内存 |
| 分配 | A(10MB), B(20MB), C(10MB) 依次进入,挨个排好 |
| 释放 | B 运行完毕退出,A 和 C 之间留下一个 20MB 的洞 |
| 尴尬 | D 需要 25MB——20MB 的洞太小,后面的空间虽够但不连续,D 无法加载 |
随着系统运行时间变长,内存就像被虫蛀过的木头,到处是无法利用的小孔。
三、外部碎片 vs 内部碎片
| 外部碎片 (External Fragmentation) | 内部碎片 (Internal Fragmentation) | |
|---|---|---|
| 本质 | 空闲空间被分割成不连续的小块 | 已分配块内部多余未用的空间 |
| 成因 | 变长分配 + 随机释放 | 定长/对齐分配(分配的大小 > 请求的大小) |
| 是否阻止分配 | 是——即使总量够,但不连续 | 否——分配本身成功,只是内部有浪费 |
| 可控性 | 不可控——严重时系统无法运行新程序 | 可控且可预测——每块浪费不超过一个分配单位 |
| 解决方案 | 分割 + 合并;或转向定长分配 | 调整分配粒度,接受可控浪费 |
核心权衡: 操作系统设计中不存在免费的午餐。消灭外部碎片的唯一可靠办法就是转向定长分配——而这必然引入内部碎片。
四、为什么"定长分片"能彻底消灭外部碎片?
这就是分页 (Paging) 技术的逻辑基础。核心思想:不再按需切割,而是标准化。
逻辑闭环
- 物理空间标准化:把物理内存切割成固定大小的块(如每块 4KB),称为页帧 (Page Frame)
- 请求标准化:不管程序实际需要多少,分配大小必须是 4KB 的整数倍
- 非连续映射:最关键的一点——程序不再需要物理上连续的空间
为什么这样就没碎片了?
因为所有的"洞"和所有的"块"大小完全一样。
- 只要系统还有一个 4KB 的空闲页帧,就能满足任何一个 4KB 的请求
- 就像乐高积木——只要还有一个空位,不管在哪里,一个标准块总能按进去
- 没有"放不下"的尴尬,因为不存在"奇形怪状"的请求
五、完整策略对照
| 策略 | 核心思想 | 外部碎片 | 内部碎片 | 时间开销 |
|---|---|---|---|---|
| 最优匹配 (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 章,正式学习分页技术——它是如何通过固定大小的页和页帧,配合页表完成虚拟地址到物理地址的转换。