Skip to content

2017年 408 操作系统 第 25 题

操作系统2017年选择题2分

题目

某计算机按字节编址,其动态分区内存管理采用最佳适应算法,每次分配和回收内存后都对空闲分区链重新排序。当前空闲分区信息如下表所示。

分区起始地址20K500K1000K200K
分区大小40KB80KB100KB200KB

回收起始地址为 60K、大小为 140KB 的分区后,系统中空闲分区的数量、空闲分区链第一个分区的起始地址和大小分别是( )。

错因

A

合并对了(3 个分区 + 380KB 大块),但第一个分区的位置搞错——按最佳适应"按大小升序排",380KB 是最大的,应该排在末尾,不是首位。把"地址最小"和"链表第一个"混了:最佳适应链表是按分区大小排序,不是按地址。

C

数量算成 4 个——没合并相邻的左右两个空闲块。回收的 [60K, 200K) 和左边 [20K, 60K)(40KB 块)紧邻,要合并;和右边 [200K, 400K)(200KB 块)也紧邻,也要合并。漏掉合并就会把回收的 140KB 当成独立新块,得到 4 个分区。

D

数量错(4 而非 3),且大小排序对了 80KB 在最前——但这个 80KB 排在最前必须是合并后的结果,跟"4 个分区"逻辑互斥(4 个意味着没合并,没合并的话 40KB 还存在、它比 80KB 小,应该排最前)。

总解析

回收 [60K, 200K)(大小 140KB)。先看相邻关系:

现有空闲分区区间与回收块相邻?
20K, 40KB[20K, 60K)左邻
200K, 200KB[200K, 400K)右邻
500K, 80KB[500K, 580K)不相邻
1000K, 100KB[1000K, 1100K)不相邻

第 1 步:合并相邻分区

回收的 [60K, 200K) 与左邻 [20K, 60K)、右邻 [200K, 400K) 三段连续:

合并后空闲分区:

起始大小
20K380KB(合并后的大块)
500K80KB
1000K100KB

共 3 个分区

第 2 步:按最佳适应排序(大小升序)

最佳适应链表按大小升序:分配时第一个够用的就是最贴合的,节省搜索时间。

排序后位置起始大小
第 1500K80KB(最小)
第 21000K100KB
第 320K380KB

第一个分区:起始 500K、大小 80KB。

答案
空闲分区数3
链表第一个分区起址500K
链表第一个分区大小80KB

易错点:① 必须合并左右相邻空闲块("邻居都空闲就连成一片");② 最佳适应按大小升序排,所以"第一个" = "最小的那块",不是地址最小的。

最终答案是 B

最后更新:

🎬 可视化演示
加载中...

提示:可在可视化区直接操作播放、步进、修改参数