操作系统:动态分区分配方式的模拟(Java实现)

本文模拟了操作系统中动态分区分配的首次适应和最佳适应算法,利用Java的ArrayList数据结构管理分区。实验涉及内存分配、回收、分区链管理,以及对不同请求序列的响应。经过测试,两种算法都能正确实现内存管理和分区合并。
摘要由CSDN通过智能技术生成

一、实验目的:

了解动态分区分配方式中的数据结构和分配算法,
并进一步加深对动态分区存储管理方式及其实现过程的理解。

二、实验内容:

  1. 用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程和回收过程。其中,空闲分区通过空闲分区链(表)来管理;在进行内存分配时,系统优先使用空闲区低端的空间。
  2. 假设初始状态下,可用的内存空间为640KB,并有下列的请求序列:
    •作业1申请130KB
    •作业2申请60KB
    •作业3申请100KB
    •作业2释放60KB
    •作业4申请200KB
    •作业3释放100KB
    •作业1释放130KB
    •作业5申请140KB
    •作业6申请60KB
    •作业7申请50KB
    •作业8申请60KB
    分别采用首次适应算法和最佳适应算法进行内存的分配和回收,要求每次分配和回收后显示出空闲内存分区链的情况。

三、实现思路:

  1. 采用java的ArrayList数据结构存储自定义分区类Block的实例对象分区作为分区链。
  2. 根据最先适应/最佳适应的思想为作业分配内存(改变内存属性大小、当前作业id、分配始址等),并根据实际情况来释放或合并Block对象的空间属性大小。

四、主要的数据结构:

//ArrayList 分区链
private static List<Block> blockList = new ArrayList<>();
/**
 * 自定义Block类,分区
 */
private static class Block {
   
    int address; //分区首地址
    int size;    //分区大小
    int id;      //进程id
}

五、程序流程图:

  • 最先适应算法FF:
    在这里插入图片描述
  • 最佳适应算法BF:
  • 在这里插入图片描述

六、算法关键代码:

/** 最先适应算法FF
 * 寻找空闲分区并为新作业分配空间
 * @param id
 * @param size
 */
private static boolean allocation(int id, int size){
   
    //分配成功与否的标志
    boolean flag = false;
    int blockAddress = 0;
    int blockSize = 0;
    int blockId = 0;

    /*顺序遍历所有分区*/
    for(int i = 0; i < blockList.size(); i++){
   
        blockAddress = blockList.get(i).address;
        blockSize = blockList.get(i).size;
        blockId = blockList.get(i).id;
        /*若存在空闲且内存合适的分区,重新分配*/
        if(blockId == -1 && blockSize >= size) {
   
            blockList.get(i).id = id;
            blockList.get(i).size = size;
            /*若当前分区重新分配后有剩余内存,
              则将其作为新的分区并设置新的address 和 size*/
            if (blockSize > size) {
   
                Fi
实验内容: 编写一个动态分区分配算法模拟程序,加深对动态分区存储管理方式及其实现过程的理解。 要求: 1.空闲分区通过空闲区链进行管理,在内存分配时,优先考虑低地址部分的空闲区。 2.分别采用首次适应算法、最佳适应算法和最坏适应算法模拟内存空间的动态分配与回收,每次分配和回收后显示出空闲区链的详细情况(说明:在申请不成功时,需要打印当前内存的占用情况信息)。 3.进程对内存空间的申请和释放可由用户自定义输入。 4.参考请求序列如下: (1) 初始状态下可用内存空间为640KB; (2) 进程1申请130KB; (3) 进程2申请60KB; (4) 进程3申请100KB; (5) 进程2释放60KB; (6) 进程4申请200KB; (7) 进程3释放100KB; (8) 进程1释放130KB; (9) 进程5申请140KB; (10) 进程6申请60KB; (11) 进程7申请50KB; (12) 进程6释放60KB。 测试用例格式如下: 输入: 动态分区分配算法选择 可用内存空间容量 序号/进程号/申请或释放操作/申请或释放的容量 其中: (1) 动态分区分配算法:1----首次适应,2----最佳适应,3----最坏适应 (2) 申请或释放操作: 1----申请操作,2----释放操作 输出: 序号/内存空间状态1/内存空间状态2...... 内存空间状态表示分为两种情况: (1) 内存空间被占用: 内存空间起始地址-内存空间结束地址.1.占用的进程号 (2) 内存空间空闲 内存空间起始地址-内存空间结束地址.0
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值