如题:2020年10月
分析:这个题挺唬人的,什么低地址?《操作系统考点之存储管理》也只是说明了下可变分区的原理,只说是回收依靠的是两个表,已分配表和空闲表,没有涉及到具体的回收算法。两个关键数据结构分别的作用如下:
- 已分配区表:记录已装入的程序在内存中占用分区的起始地址和长度,用标志位指出占用分区的程序名。
- 空闲区表:记录内存中可供分配的空闲区的起始地址和长度,用标志位指出该分区是未分配的空闲区
- 另外,由于已分区与空闲区个数不定,所有很多空栏
具体的回收算法:回收时,先将使用完毕的分区,记录在空闲区表中,检查相邻空闲区表中的“未分配”栏目,有,应该合并成一个空闲区,这样空闲区个数其实是没变,除非合并两个原有的分区,才会出现空闲区数减1的情形。所以答案选D.
假设:归还分区在空闲表中的起始地址是S,长度为L
1、回收分区的上邻分区(地址是从低到高增长的)空闲,需要合并.
如果空闲表中的第i号“未分配栏”的 起始地址+长度 = S,就说明有上邻的分区,合并也很简单,只要第i栏起始地址不变,长度为 未分配区长度+L就可以了。可见,脑补内存情形还是很重要的,写C时也是重要的基本功。
2、回收分区的下邻分区空闲,需要合并
如果 S+L = 相邻“未分配栏”的起始地址,说明有下邻分区,合并是:S(作为起始地址)不变,长度为 未分配区长度+L
3、回收分区的上邻与下邻都是空闲,需要将三个分区合并
判断条件:S = 第i栏起始地址 + 长度
S + L = 第k栏起始地址 合并是第i栏起始地址不变(上邻起始地址),长度为 i栏原长度 + L + k栏的长度。同时将 k栏(下邻)清空,这样才实现空闲区表个数减1,也正是本题所考察的点。
4、上邻和下邻都不空闲,不需要合并
没有合并,在空闲区表找一个“空”栏,登记上回收的分区的起始地址和长度就可以了,实现了空闲区表分区个数的加1。