Appearance
408
操作系统
OS-03-02 连续分配方式(单一/固定/动态分区)
一、定位信息
- 所属圈层:核心层
- 前置知识回顾:理解逻辑地址与物理地址的区别,知道地址转换的基本过程。了解内存是有限资源,操作系统需要管理内存的分配与回收。
- 知识网络位置:本单元是内存管理具体分配策略的起点,承接OS-03-01的基本概念,向下引出非连续分配(页式、段式)的动机。连续分配是最直观的内存管理方式,理解其局限性有助于理解为何需要更复杂的分配策略。
- 考点热度等级:M级(中频常考)——动态分区分配算法(首次适应、最佳适应等)是常见选择题考点。
二、知识点讲解
2.1 单一连续分配
单一连续分配是最简单的内存管理方式:内存被分为系统区(通常在低地址,供OS使用)和用户区(供用户程序使用),同一时刻只允许一个用户程序在内存中运行。
优点:实现极其简单,无需复杂算法,无外部碎片。缺点:内存利用率极低(用户区大部分时间闲置),不支持多道程序,CPU利用率低。这种方式只适用于早期单用户操作系统或嵌入式简单系统。
2.2 固定分区分配
固定分区分配将用户区划分为若干个大小固定的分区,每个分区装入一道程序。分区划分方式有两种:
- 分区大小相等:所有分区大小相同,适合控制多个相同对象的场景(如多个终端),缺乏灵活性。
- 分区大小不等:划分为多个不同大小的分区,灵活性稍好。
操作系统维护一张分区说明表,记录每个分区的起始地址、大小和状态(是否已分配)。当有程序需要装入时,查找能满足其大小需求的空闲分区。
优点:实现简单,支持多道程序。缺点:①内部碎片——程序可能比分区小很多,分区内的剩余空间被浪费;②分区大小固定,无法适应程序大小的变化;③分区数在系统初启时确定,限制了并发程序数量。
2.3 动态分区分配
动态分区分配(也称可变分区分配)不预先划分分区,而是在程序装入时根据其大小动态创建分区。分区大小恰好等于程序大小,消除内部碎片。
核心问题:如何从空闲分区中选择一个分配给程序?这就是动态分区分配算法要解决的问题。操作系统需要维护一张空闲分区表或空闲分区链来记录当前所有空闲内存块。
常见分配算法:
| 算法 | 策略 | 优点 | 缺点 |
|---|---|---|---|
| 首次适应(First Fit) | 从头开始找第一个能满足大小的空闲分区 | 实现简单,综合性能好 | 低地址产生大量小碎片 |
| 最佳适应(Best Fit) | 找最小的能满足需求的空闲分区 | 大碎片保留率高 | 产生大量极小碎片(外部碎片) |
| 最坏适应(Worst Fit) | 找最大的空闲分区 | 碎片较大,不易太小 | 大空闲分区很快被用完 |
| 邻近适应(Next Fit) | 从上次分配位置开始找 | 分布均匀 | 缺乏大空闲块 |
外部碎片:内存中存在很多小的空闲分区,每个都很小无法满足任何程序需求。**紧凑(Compaction)**技术通过移动内存中的程序,将小碎片合并为大块,但代价很高。
三、记忆与理解辅助
1. 口诀记忆:"单一分区一人用,固定分区画格子;动态分区按需切,四算法选空间。"
2. 内部碎片 vs 外部碎片:
- 内部碎片:分配的分区内未被使用的空间(固定分区的主要问题)
- 外部碎片:分区之间的空闲空间太小无法利用(动态分区的主要问题)
- 记忆技巧:内部碎片在分配内部,外部碎片在分区之外(空隙中)
3. 四种动态分区算法对比表(★高频考点):
| 对比项 | 首次适应 | 最佳适应 | 最坏适应 | 邻近适应 |
|---|---|---|---|---|
| 查找策略 | 从头找第一个够大的 | 找最小的够大的 | 找最大的 | 从上次位置开始找 |
| 空闲分区排序 | 按地址递增 | 按大小递增 | 按大小递减 | 按地址递增(循环) |
| 大块保留 | 一般 | 好 | 差 | 一般 |
| 碎片倾向 | 低地址碎片多 | 极小碎片多 | 大块消耗快 | 均匀分散 |
| 综合性能 | 最好 | 较差 | 最差 | 一般 |
4. 三种连续分配方式演进:单一 → 固定 → 动态,演进动力是提高内存利用率和支持多道程序。每一步都解决了前一步的主要问题,但也引入了新的问题。
四、例题与精解
例题1(基础巩固)
题目:某系统内存大小为 ,采用固定分区分配,划分为4个分区:、、、。现有三个程序需要装入:程序A(8KB)、程序B(18KB)、程序C(25KB)。问如何分配?每个分区的内部碎片是多少?
命题意图:考查固定分区分配的基本概念和内部碎片计算。
精解:
1. 审题分析:四个分区大小分别为10KB、20KB、30KB、40KB。三个程序分别需要8KB、18KB、25KB。需要为每个程序找到合适的分区。
2. 解题思路:将程序装入能容纳它的最小分区(类似最佳适应),计算内部碎片 = 分区大小 - 程序大小。
3. 完整步骤:
- 程序A(8KB)→ 装入分区1(10KB),内部碎片 =
- 程序B(18KB)→ 装入分区2(20KB),内部碎片 =
- 程序C(25KB)→ 装入分区3(30KB),内部碎片 =
- 分区4(40KB)空闲,无内部碎片问题
- 总内部碎片 =
4. 方法反思:固定分区的内部碎片是不可避免的,因为分区大小是预先固定的。即使程序只比分区小1字节,整个剩余空间都是内部碎片。
例题2(中等提升)
题目:某系统采用动态分区分配,当前空闲分区链(按地址递增排列)为:、、。现依次有三个请求:①申请 ;②申请 ;③申请 。分别用首次适应算法和最佳适应算法处理,写出每次分配后空闲分区链的状态。
命题意图:考查动态分区分配算法的具体执行过程。
精解:
1. 审题分析:初始空闲分区有三个,依次处理三个内存请求,需要分别用两种算法模拟全过程。
2. 解题思路:按算法规则逐一处理请求,每次分配后更新空闲分区链。
3. 完整步骤:
首次适应算法(从头找第一个够大的):
- 请求①(60KB):第一个空闲分区 大小80KB ≥ 60KB ✓,分配。空闲链变为:、、
- 请求②(100KB): 大小20KB < 100KB ✗; 大小120KB ≥ 100KB ✓,分配。空闲链变为:、、
- 请求③(40KB): 大小20KB < 40KB ✗; 大小20KB < 40KB ✗; 大小100KB ≥ 40KB ✓,分配。空闲链变为:、、
最佳适应算法(找最小的够大的):
- 请求①(60KB):候选分区大小80KB、120KB、100KB,最小够大的是80KB(),分配。空闲链变为:、、
- 请求②(100KB):候选分区大小20KB、120KB、100KB,最小够大的是100KB(),分配。空闲链变为:、
- 请求③(40KB):候选分区大小20KB、120KB,最小够大的是120KB(),分配。空闲链变为:、
4. 方法反思:首次适应倾向于使用低地址空间的分区,最佳适应倾向于保留大分区。本题中两种算法的结果不同——最佳适应在处理请求②时选择了 而非 ,保留了更大的连续空间。但最佳适应产生的碎片更小(20KB的 被完全利用),这也是其"产生大量极小碎片"特性的体现。
五、考情分析
- 考查频次:动态分区分配算法在近5年真题中出现约3-4次,以选择题为主。
- 常见题型:选择题(判断某个分配请求在特定算法下的结果)、偶尔在综合题中作为内存管理的第一步。
- 分值占比:选择题2分,综合题子问题3-5分。
- 命题趋势:单纯的连续分配算法题减少,更多与分页管理、虚拟内存结合考查。但固定分区的内部碎片和动态分区的外部碎片概念是理解后续知识的基础。基于大纲与命题规律推测。
六、易错点提醒
错误表现:混淆内部碎片和外部碎片,分不清哪种分配方式产生哪种碎片。 错误原因:对"内部"和"外部"的参照物理解不清。 正确理解/做法:内部碎片在已分配的分区内部(固定分区、页式管理的最后一页);外部碎片在已分配分区之间的空隙(动态分区、段式管理)。记住:固定→内部,动态→外部。
错误表现:最佳适应算法中,认为"找最小的够大的"一定能减少碎片。 错误原因:只看到大分区被保留,忽略了产生的极小碎片反而更难利用。 正确理解/做法:最佳适应保留了大分区,但每次分配都"刚好切",产生大量很小的碎片。实际效果往往不如首次适应。
错误表现:在动态分区分配中,忘记回收时需要考虑相邻空闲分区的合并。 错误原因:只关注分配过程,忽略回收过程。 正确理解/做法:回收内存时,需要检查回收区域的前后是否也是空闲分区。若是,则合并为一个更大的空闲分区,否则会产生越来越多的外部碎片。
七、来源标注
- 依据2026考研统考408大纲
- 依据《操作系统概念》(Operating System Concepts, Silberschatz)第9章
- 依据汤小丹《计算机操作系统》第4版第3章