Appearance
题目
某计算机按字节编址,其动态分区内存管理采用最佳适应算法,每次分配和回收内存后都对空闲分区链重新排序。当前空闲分区信息如下表所示。
| 分区起始地址 | 20K | 500K | 1000K | 200K |
|---|---|---|---|---|
| 分区大小 | 40KB | 80KB | 100KB | 200KB |
回收起始地址为 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) 三段连续:
合并后空闲分区:
| 起始 | 大小 |
|---|---|
| 20K | 380KB(合并后的大块) |
| 500K | 80KB |
| 1000K | 100KB |
共 3 个分区。
第 2 步:按最佳适应排序(大小升序)
最佳适应链表按大小升序:分配时第一个够用的就是最贴合的,节省搜索时间。
| 排序后位置 | 起始 | 大小 |
|---|---|---|
| 第 1 | 500K | 80KB(最小) |
| 第 2 | 1000K | 100KB |
| 第 3 | 20K | 380KB |
第一个分区:起始 500K、大小 80KB。
| 项 | 答案 |
|---|---|
| 空闲分区数 | 3 |
| 链表第一个分区起址 | 500K |
| 链表第一个分区大小 | 80KB |
易错点:① 必须合并左右相邻空闲块("邻居都空闲就连成一片");② 最佳适应按大小升序排,所以"第一个" = "最小的那块",不是地址最小的。
最终答案是 B。