Appearance
题目
回收分区时,仅合并大小相等的空闲分区的算法是( )。
错因
B
把"分配策略"和"回收策略"混为一谈。最佳适应是分配时找最小够用块,回收时只看"是否物理相邻"——相邻空闲分区不论大小都合并。"最佳"修饰的是分配查找策略,对合并规则没有特殊约束。
C
同 B 的思路。最坏适应是分配时找最大块(避免产生小碎片),回收时同样只看相邻就合并,不要求大小相等。
D
同 B 的思路。首次适应是分配时按地址顺序找第一个够用块,回收时合并相邻空闲分区——也不要求大小相等。
B/C/D 的共同特点:它们都是"动态分区分配"家族的成员,回收策略一致(相邻就合并),区别只在分配时的查找方式。把"分配策略不同"误推成"回收规则也不同",是这三个选项被选中的常见误解。
总解析
伙伴算法核心:内存按 2 的幂次切块(1KB, 2KB, 4KB, ..., 1MB ...)。每个块只能跟它的"伙伴"合并。
伙伴的定义:两个块同时满足——
- 大小相等(同为 )
- 物理相邻
- 来自同一个父块(即合并它们后能恰好拼出一个 的块)
回收时,OS 检查被释放块的伙伴:
- 伙伴空闲 → 合并成 的块,再递归检查上一层伙伴
- 伙伴占用 → 不合并
这正对应题面的"仅合并大小相等的空闲分区"——而且伙伴算法还有一个隐式约束:必须是同父的伙伴对,不是任意两个等大块都能合。
对比四种算法:
| 算法 | 分配查找策略 | 回收合并规则 |
|---|---|---|
| 伙伴算法(A) | 分级链表,从最小够用的层级取 | 大小相等且互为伙伴才合并 |
| 最佳适应(B) | 空闲分区链表(按容量升序),找最小够用 | 物理相邻就合并(不论大小) |
| 最坏适应(C) | 空闲分区链表(按容量降序),找最大块 | 物理相邻就合并 |
| 首次适应(D) | 空闲分区链表(按地址升序),找第一个够用 | 物理相邻就合并 |
关键区分:B/C/D 都是动态分区分配——分区任意大小,回收只看相邻;伙伴算法是定长分级——分区只能 2 的幂次,回收只合伙伴。
为什么伙伴算法这样设计:分级管理 + 伙伴约束让分配/回收的复杂度都是 ,且能高效抑制碎片(合并到上一层后块更大、可用性更强)。代价是只能分配 2 的幂次大小,会有一定内部碎片。
最终答案是 A。