3. 分区内存管理(一):固定分区原理、分区大小与数量设计、内部碎片问题
说到内存管理,很多初学者第一反应就是“分页”、“分段”、“虚拟内存”这些高大上的概念。但说实话,操作系统刚起步那会儿,哪有这么复杂?最早期的内存管理方案,就是我今天要讲的——固定分区。
我记得刚入行时,带我的老工程师跟我说:“别看现在内存管理花样多,你先把固定分区吃透了,后面的分页分段理解起来就顺了。”当时我不信,后来自己踩了坑才明白——固定分区虽然简单,但它把内存管理最核心的矛盾暴露得清清楚楚:怎么分?分多大?分多少?
3.1 固定分区的基本原理
固定分区,说白了就是系统启动时就把内存切成若干块,每块大小固定,之后不再改变。每个分区可以放一个进程,进程来了就找个能装下它的分区塞进去。
我画了一张图,帮你直观理解这个结构:
你看,这张图里每个分区都有一段“浪费”的空间——那就是内部碎片。进程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,都快赶上一个小分区了。这就是内部碎片的威力。
⚠️ 注意:内部碎片和外部碎片是两码事。内部碎片是分区内部浪费的空间,外部碎片是分区之间零散的小空闲块。固定分区只有内部碎片,没有外部碎片——因为分区边界是固定的,不存在“小空闲块拼不成大块”的问题。
那怎么减少内部碎片?我分享几个实战经验:
- 合理设置分区粒度:分区大小不要跳得太猛。比如从64KB直接跳到256KB,中间缺了128KB,很多进程会被迫“升级”到更大的分区,造成浪费。
- 统计进程大小分布:先跑一段时间,记录每个进程的实际内存需求,然后调整分区大小,让分区大小尽量贴近常见进程的需求。
- 预留“弹性分区”:留一两个大分区给突发的大进程,其他分区按常规需求配置。这样既保证灵活性,又不会让大分区空转。
我曾经在一个工控项目里,用第三种方法把内部碎片从35%降到了12%左右。虽然还是浪费,但在固定分区的框架下,这已经算不错了。
3.4 固定分区的优缺点总结
说了这么多,咱们来做个总结。固定分区到底好在哪,差在哪?
| 维度 | 评价 | 说明 |
|---|---|---|
| 实现复杂度 | ⭐ 极低 | 只需要分区表 + 简单的分配/回收逻辑 |
| 运行效率 | ⭐ 高 | 分配和回收都是O(1)或O(n)操作,没有复杂算法 |
| 内存利用率 | ❌ 低 | 内部碎片不可避免,利用率通常在60%~80% |
| 灵活性 | ❌ 差 | 分区大小固定,无法动态调整,无法支持大进程 |
| 并发度 | ⚠️ 受限 | 分区数量固定,最多同时运行N个进程 |
说实话,现在纯用固定分区的操作系统已经很少了。但它作为内存管理的“入门课”,价值在于让你理解分区、碎片、利用率这些核心概念。后面讲动态分区、分页、分段时,你会发现很多思路都是从固定分区演变过来的。
一句话总结:固定分区是内存管理的“Hello World”——简单、直观、有硬伤,但它是理解一切复杂内存管理方案的基础。