可变式分区管理

可变式分区管理

介绍:

设计一个可变式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。

分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行,分区分配中所用的算法采用:首次适应算法、循环首次适应算法两种算法来实现主存的分配和回收,每次分配和回收后显示出空闲内存分区链的情况。

原理

使用链指针把所有的空闲分区链成一条链,为了实现对空闲分区的分配和链接,在每个分区的起始部分设置状态位、分区的大小和链接各个分区的前向指针,由状态位指示该分区是否分配出去了;同时,在分区尾部还设置有一后向指针,用来链接后面的一个分区;分区的中间部分是用来存放作业的空闲内存空间,当该分区分配出去后,状态位就由“0”置为“1”。

设计一个内存空闲分区表(链),内存空闲分区通过空闲分区表(链)来管理, 在进行内存分配时,系统优先使用空闲区低端的空间。

设计一个空闲分区说明表(链),设计一个某时刻主存空间占用情况表,作为主存当前使用基础。初始化空闲区和已分配区说明表的值。设计作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。要求每次分配和回收后显示出空闲内存分区表(链)的情况。

回收内存

流程图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pYMS2nUC-1611652517305)(file:///C:/Users/www24/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif)]

实现代码

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("回收失败,请重新输入作业名!");
    }

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值