3. 分区内存管理(一):固定分区原理、分区大小与数量设计、内部碎片问题

说到内存管理,很多初学者第一反应就是“分页”、“分段”、“虚拟内存”这些高大上的概念。但说实话,操作系统刚起步那会儿,哪有这么复杂?最早期的内存管理方案,就是我今天要讲的——固定分区。

我记得刚入行时,带我的老工程师跟我说:“别看现在内存管理花样多,你先把固定分区吃透了,后面的分页分段理解起来就顺了。”当时我不信,后来自己踩了坑才明白——固定分区虽然简单,但它把内存管理最核心的矛盾暴露得清清楚楚:怎么分?分多大?分多少?

3.1 固定分区的基本原理

固定分区,说白了就是系统启动时就把内存切成若干块,每块大小固定,之后不再改变。每个分区可以放一个进程,进程来了就找个能装下它的分区塞进去。

我画了一张图,帮你直观理解这个结构:

固定分区内存布局示意图 操作系统内核 (占用低地址区域) 分区 1:64 KB — 进程 A (实际使用 48 KB) 分区 2:128 KB — 进程 B (实际使用 96 KB) 分区 3:256 KB — 进程 C (实际使用 200 KB) 分区 4:512 KB — 空闲 (未分配) ← 内部碎片 16 KB ← 内部碎片 32 KB ← 内部碎片 56 KB 💡 说明: 每个分区大小固定,进程实际使用量 ≤ 分区大小,差额即为内部碎片。

你看,这张图里每个分区都有一段“浪费”的空间——那就是内部碎片。进程A只需要48KB,但分区是64KB,剩下的16KB谁也拿不走,只能空着。

核心要点:固定分区下,分区表是系统的关键数据结构。它记录了每个分区的起始地址、大小和分配状态。每次进程创建或终止,系统就查这张表,做简单的分配或回收。

3.2 分区大小与数量设计

好,原理讲完了。接下来是真正考验设计能力的地方——分区大小和数量怎么定?

这个问题,我在做嵌入式系统时遇到过。当时产品经理说:“内存就256KB,你看着分。”我一开始拍脑袋分了4个64KB的分区,结果跑起来发现:小进程浪费空间,大进程装不下。后来改成了混合大小,才勉强够用。

这里我总结了几种常见的设计策略:

策略 分区方式 优点 缺点 适用场景
等分法 所有分区大小相同 实现简单,管理方便 灵活性差,碎片严重 进程大小相近的专用系统
等比法 分区大小按比例递增(如2倍) 兼顾大小进程,利用率较高 中等分区可能浪费 通用操作系统
定制法 根据典型进程大小定制 碎片最少,利用率最高 需要提前分析负载 嵌入式/专用系统

我个人比较推荐等比法。为什么?你想想看,进程的大小分布通常是不均匀的——小进程多,大进程少。用等比递增(比如16KB、32KB、64KB、128KB、256KB),既能覆盖小进程,又能容纳大进程,算是一个不错的折中。

我的经验:分区数量一般控制在8~16个比较合适。太少会导致并发度低,太多会增加分区表管理开销和碎片总量。我曾经在一个项目里试过32个分区,结果分区表占了不少内存,得不偿失。

3.3 内部碎片问题

内部碎片,是固定分区最让人头疼的问题。说白了就是“大材小用”——你给进程分了一个大分区,它实际只用了一小半,剩下的空间谁也借不走。

我举个例子你就明白了:

  • 系统有3个分区:64KB、128KB、256KB
  • 进程A需要50KB → 只能放64KB分区 → 浪费14KB
  • 进程B需要100KB → 只能放128KB分区 → 浪费28KB
  • 进程C需要200KB → 只能放256KB分区 → 浪费56KB

你看,三个进程加起来浪费了98KB,都快赶上一个小分区了。这就是内部碎片的威力。

⚠️ 注意:内部碎片和外部碎片是两码事。内部碎片是分区内部浪费的空间,外部碎片是分区之间零散的小空闲块。固定分区只有内部碎片,没有外部碎片——因为分区边界是固定的,不存在“小空闲块拼不成大块”的问题。

那怎么减少内部碎片?我分享几个实战经验:

  1. 合理设置分区粒度:分区大小不要跳得太猛。比如从64KB直接跳到256KB,中间缺了128KB,很多进程会被迫“升级”到更大的分区,造成浪费。
  2. 统计进程大小分布:先跑一段时间,记录每个进程的实际内存需求,然后调整分区大小,让分区大小尽量贴近常见进程的需求。
  3. 预留“弹性分区”:留一两个大分区给突发的大进程,其他分区按常规需求配置。这样既保证灵活性,又不会让大分区空转。

我曾经在一个工控项目里,用第三种方法把内部碎片从35%降到了12%左右。虽然还是浪费,但在固定分区的框架下,这已经算不错了。

3.4 固定分区的优缺点总结

说了这么多,咱们来做个总结。固定分区到底好在哪,差在哪?

维度 评价 说明
实现复杂度 ⭐ 极低 只需要分区表 + 简单的分配/回收逻辑
运行效率 ⭐ 高 分配和回收都是O(1)或O(n)操作,没有复杂算法
内存利用率 ❌ 低 内部碎片不可避免,利用率通常在60%~80%
灵活性 ❌ 差 分区大小固定,无法动态调整,无法支持大进程
并发度 ⚠️ 受限 分区数量固定,最多同时运行N个进程

说实话,现在纯用固定分区的操作系统已经很少了。但它作为内存管理的“入门课”,价值在于让你理解分区、碎片、利用率这些核心概念。后面讲动态分区、分页、分段时,你会发现很多思路都是从固定分区演变过来的。

一句话总结:固定分区是内存管理的“Hello World”——简单、直观、有硬伤,但它是理解一切复杂内存管理方案的基础。