可变式分区管理
介绍:
设计一个可变式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。
分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行,分区分配中所用的算法采用:首次适应算法、循环首次适应算法两种算法来实现主存的分配和回收,每次分配和回收后显示出空闲内存分区链的情况。
原理
使用链指针把所有的空闲分区链成一条链,为了实现对空闲分区的分配和链接,在每个分区的起始部分设置状态位、分区的大小和链接各个分区的前向指针,由状态位指示该分区是否分配出去了;同时,在分区尾部还设置有一后向指针,用来链接后面的一个分区;分区的中间部分是用来存放作业的空闲内存空间,当该分区分配出去后,状态位就由“0”置为“1”。
设计一个内存空闲分区表(链),内存空闲分区通过空闲分区表(链)来管理, 在进行内存分配时,系统优先使用空闲区低端的空间。
设计一个空闲分区说明表(链),设计一个某时刻主存空间占用情况表,作为主存当前使用基础。初始化空闲区和已分配区说明表的值。设计作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。要求每次分配和回收后显示出空闲内存分区表(链)的情况。
回收内存
流程图
实现代码
if (f != null && flag) {
for (i = 0; i < blockList.size(); i++) {
Block b1 = copy_blockList.get(i);
Block b2 = null;
System.out.println("i=" + i + "blockList.size()=" + blockList.size());
if (i + 2 <= blockList.size()) b2 = copy_blockList.get(i + 1);
//与上面空闲合并
if ((b1.InitialAddress + b1.length == f.InitialAddress)) {
boolean tip = false;
if (b2 != null && (f.InitialAddress + f.length == b2.InitialAddress)) {
b1.length += (f.length + b2.length);
copy_blockList.remove(b2);
System.out.println("上下都合");
tip = true;
} else if (b2 == null || (f.InitialAddress + f.length != b2.InitialAddress)) {
b1.length += f.length;
System.out.println("与上合并");
tip = true;
}//上下合并
if (tip == true) break;
} else if (f.InitialAddress + f.length == b1.InitialAddress) {
System.out.println("f.InitialAddress:" + f.InitialAddress + "f.length:" + f.length + "b1.InitialAddress" + b1.InitialAddress);
b1.InitialAddress = f.InitialAddress;
b1.length = f.length + b1.length;
System.out.println("与下");
break;
}
//与下面空闲合并
else if ((b1.InitialAddress + b1.length < f.InitialAddress) && (f.InitialAddress + f.length == b2.InitialAddress)) {
b2.InitialAddress = f.InitialAddress;
b2.length += f.length;
System.out.println("与下合并");
break;
}
}
// 上下都没有相邻空闲,添加此空闲
if (i >= blockList.size()) {
int t = 0;
System.out.println("copy blockList size:" + copy_blockList.size());
while (copy_blockList.get(t) != null && (f.InitialAddress > copy_blockList.get(t).InitialAddress)) {
t++;
if (t >= copy_blockList.size()) break;
}
copy_blockList.add(t, new Block(f.InitialAddress, f.length, "free"));
System.out.println("copy blockList size:" + copy_blockList.size());
System.out.println("上下都无");
}
} else {
System.out.println("回收失败,请重新输入作业名!");
}
} else {
System.out.println("回收失败,请重新输入作业名!");
}