主存空间的分配与回收实验报告 下载本文

.

在一定程度上解决这个问题,如果空闲分区的大小比作业要求的长度略大一点,不再将空闲区分区分割成已分分区和空闲分区两部分,而是将整个空闲区分配给作业。 在实现最佳适应算法时,可把空闲分区按长度递增方式登记在空闲区表中。分配时顺序查找空闲表,查找到的第一个空闲区就是满足作业要求的最小分区。这样查找 速度快,但是为使空闲区按照长度递增登记在空闲表中,就必须在分配回收时进行空闲区的调整。空闲区表调整时移动标模的代价要高于查询整张表的代价,所以实 验中不采用空闲区有序登记在空闲表中的方法。 3. 动态分区方式下的主存回收 动态分区方式下回收主存空间时应该检查是否有与归还区相邻的空闲区域。若有,则应该合并成一个空闲区。一个归还区可能有上邻空闲区,也可能有下邻空闲区,或者既有上邻空闲区又有下邻空闲区,或者既无上邻空闲区也无下邻空闲区。 在实现回收时,首先将作业归还的区域在已分配表中找到,将该栏目的状态变为“空”,然后检查空闲区表中标志为“未分配”栏目,查找是否又相邻空闲区;最后合并空闲区,修改空闲区表。假定归还作业的分区起始地址为S,长度为L,则: 1) 归还区又下邻空闲区 如果S+L正好等于空闲区表中某个登记栏目(假定为第j栏)的起始地址则表明归还区有一个下邻空闲区。这时候只需要修改第j栏登记项的内容: 起始地址=S; 第j栏长度=第j栏长度+L 精品

.

则第j栏指示的空闲区时归还区和下邻空闲区合并后的大空闲区。 2) 归还区又上邻空闲区 如果空闲区表中某个登记栏目(假定为第k栏)的“起始地址+长度”正好等于S,则表明归还区有一个上邻空闲区。这时要修改第k栏登记项的内容(起始地址不变): 第k栏长度=第k栏长度+L; 于是第k栏指示的空闲区是归还区和上邻空闲区合并后的大空闲区。 3) 归还区既有上邻空闲区又有下邻空闲区 如果S+L正好等于空闲区表中某个登记栏目(假定为第j栏)的起始地址,同时还有某个登记栏目(假定为第k栏)的“起始地址+长度”正好等于S,这表明归还区既有一个上邻空闲区又又一个下邻空闲区。此时对空闲区的修改如下: 第k栏的长度=第k栏的长度+第j栏的长度+L;(第k 栏的起始地址不变) 第j栏的状态=“空”(将第j栏的登记项删除) 这样,第k栏指示的空闲区是归还区和上、下邻空闲区合并后的大空闲区;原来的下邻空闲区登记项(第j栏)被删除,置为“空”。 4) 归还区既无上邻空闲区又无下邻空闲区 如果在检查空闲区表时,无上述三种情况出现,则表明归还区既无上邻空闲区又无下邻空闲区。这时,应该在空闲区表中查找一个状态为“空”的栏目(假定查到的是第t栏),则第t栏的内容修改如下: 第t栏起始地址=S; 精品

.

第t栏的长度=L; 第t栏的状态=“未分配”; 这样,第t栏指示的空闲区是归还区。 由于是实验,没有真正的主存要分配,所有在实验中,首先应建立一张空闲区表,初始状态只有一个空闲登记项(假定的主存空闲区)和一张所有状态都为“空”的 已分配区表,假定主存空间100KB,全部为空闲区(实际上操作系统需要占用一部分);然后,可以选择进行主存分配或回收,如果是分配,要求输入作业名和 所需主存空间大小;如果是回收,输入回收作业名;循环进行主存分配和回收后,如果需要,则显示两张表的内容,以检查主存的分配和回收是否正确。 4)实验测试及分析: 精品

.

6、实验心得体会 这次实验比较复杂,用了很多时间,但同时收获了很多,对主存空间分配认识加深了很多 附录:源代码

#include #include

#define OK 1 //完成 #define ERROR 0 //出错

精品