操作系统位示图bitMap算法实现(2.0)

1.位示图简介(Bit Map)

由于上次有分配完内存还能继续分配的bug,和一点释放内存的bug
对代码进行了小修改。


爆肝4小时~
这种方法是为文件存储空间建立一张位示图用以反映整个存储空间的分配情况。
普遍采用这种方法的OS:NOVA机中的RDOS,PDP-11的DOS和微型机CP/M
基本思想:用若干字节构成一张图,每个字节中的每一位对应文件存储器中的一个物理块。文件存储器上的物理块,依次编号为0,1,2,3……。在位示图中的第一个字节对应物理块为0,1,2…,7号块,第二字节对应8,9,…,15号块,依次类推。若某位为“1”,表示对应的物理块已分配;若某位为“0”,表示对应的物理块空闲。
在这里插入图片描述
上代码:
//Manager.java

package com.xin;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class Manager {
    int m, p, q;//磁盘柱面数,每柱面磁道数, 每磁道物理块数
    int size, length = 8;//行数,列数
    int[][] block;//相对磁盘块号 table
    int[][] bitmap;//位示图
    Stored list = null;//已分配磁盘对象
    ArrayList<Stored> lists = new ArrayList<Stored>();//已分配磁盘链表

    //构造方法输入m,p,q以及随机生成数据对位示图进行初始化
    public Manager() {
        System.out.println("请分别输入磁盘柱面数,每柱面磁道数, 每磁道物理块数:");
        Scanner scanner = new Scanner(System.in);
        m = scanner.nextInt();
        p = scanner.nextInt();
        q = scanner.nextInt();
        size = m * p * q / length;
        bitmap = new int[size][length];
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < length; j++) {
                int random = new Random().nextInt(2);
                //Random随机数类.nextInt()方法生成随机数
                bitmap[i][j] = random;
            }
        }
    }

    //输出位示图
    public void printBM() {
        System.out.println("位示图:");
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < length; j++) System.out.print(bitmap[i][j] + "  ");
            System.out.println();
        }
        System.out.println("-----------------------");
    }

    //输出相对磁盘块号 table
    public void printBlock() {
        block = new int[size][length];//创建相对磁盘块号 table
        System.out.println("block:");
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < length; j++) {
                block[i][j] = i * length + j;//计算对应的磁盘块号
                System.out.print(block[i][j] + "   \t");
            }
            System.out.println();
        }
        System.out.println("----------------------------------------------------------");
    }

    public void setStored() {
        lists.clear();
        int index = 0;
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < length; j++) {
                if (bitmap[i][j] == 1) {
                    lists.add(new Stored(block[i][j] / (p * length),//柱面号
                            block[i][j] % (p * length) / length,//磁道号
                            block[i][j] % length, index++));//物理块号
                }
            }
        }
    }

    //输出已分配磁盘块表
    public void printStored() {
        setStored();
        System.out.println("柱面号     磁道号      物理块号");
        for (Stored list : lists) {//遍历已分配磁盘链表 foreh循环
            System.out.println(list.C + "        \t" + list.H + "       \t" + list.R);
        }
        System.out.println("-----------------");
    }

    //申请磁盘块
    public void apply() {
        System.out.print("申请前的");
        printBM();//申请前位示图
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < length; j++) {
                if (bitmap[i][j] == 0) {//如果 == 0就申请
                    bitmap[i][j] = 1;//置位1
                    System.out.println("申请磁盘信息:" + block[i][j] / (p * length) + "," +
                            " " + block[i][j] % (p * length) / length + ", " + block[i][j] % length);
                    System.out.print("申请后的");
                    printBM();//申请后位示图
                    return;
                }
            }
        }
        System.out.println("存储空间已满,没有可用存储空间!");
    }

    //释放磁盘号
    public void release() {
        //随机数随机释放一块被占用的
        if (lists.size() == 0) System.out.println("当前存储块全部为空!");
        else {
            int random = new Random().nextInt(lists.size());
            System.out.println("释放的random:" + random);
            for (int i = 0; i < lists.size(); i++) {
                if (random == lists.get(i).index) {//寻找释放块
                    list = lists.get(i);
                    int bnum = list.C * p * length + list.H * length + list.R;//相对磁盘块号
                    System.out.println("Block相对磁块:" + bnum);
                    int x = bnum / length;//第x行
                    int y = bnum % length;//第y列
                    System.out.println("i = " + x + ", j = " + y);
                    System.out.print("释放前的");
                    printBM();
                    bitmap[x][y] = 0;
                    System.out.print("释放后的");
                    printBM();
                    setStored();
                    return;
                }
            }
        }
    }
}

//Stored.java

package com.xin;

public class Stored {
    int C, H, R, index;//  柱面号,磁道号,物理块号,下标

    public Stored(int c, int h, int r, int index) {
        C = c;
        H = h;
        R = r;
        this.index = index;
    }

}

//Start.java

package com.xin;

import java.util.Scanner;

public class Start {
    public static void main(String[] args) {
        Manager manager = new Manager();
        int i = 0;
        do {
            System.out.println("1.打印位示图");
            System.out.println("2.打印block");
            System.out.println("3.打印存储信息");
            System.out.println("4.申请磁盘块");
            System.out.println("5.释放磁盘块");
            System.out.println("6.退出");
            System.out.println("请输入操作序号:");
            Scanner scanner = new Scanner(System.in);
            i = scanner.nextInt();
            switch (i) {
                case 1:
                    manager.printBM();
                    break;
                case 2:
                    manager.printBlock();
                    break;
                case 3:
                    manager.printStored();
                    break;
                case 4:
                    manager.apply();
                    break;
                case 5:
                    manager.release();
                    break;
                case 6:
                    break;
            }
        } while (i != 6);
        System.out.println("运行结束!");
    }
}

运行结果
在这里插入图片描述

原创作品,谢谢浏览!

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只影~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值