栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java模拟操作系统的动态分区首次适应分配和回收算法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java模拟操作系统的动态分区首次适应分配和回收算法

 main函数:

public class czxt {
//    模拟动态分区首次适应分配和回收算法
    static ArrayList wei=new ArrayList();
    static ArrayList yi =new ArrayList();
    static Scanner sc=new Scanner(System.in);
    public static void main(String[] args) {
        fenqu fenqu1=new fenqu(wei.size()+1,60,200,1);
        wei.add(fenqu1);
        while (true) {
            System.out.println("********************");
            System.out.println("*       功能菜单     *");
            System.out.println("********************");
            System.out.println("*       1…分配      *");
            System.out.println("*       2…回收      *");
            System.out.println("*       3…显示      *");
            System.out.println("*       0…退出      *");
            System.out.println("********************");
            System.out.println("请输入您需要的功能:(0-3):");
            int x = sc.nextInt();
            if(x==0){
                System.out.println("感谢使用!");
                break;
            }
            if(x==1){
                fenpei();
            }if(x==2){
                huishou();
            }if(x==3){
                xianshi();
            }if(x<0||x>3){
                System.out.println("输入错误请重新输入!");
            }
        }
    }
    public static void fenpei(){
        System.out.println("请输入作业名:");
        String name= sc.next();
        System.out.println("请输入作业长度:");
        int x = sc.nextInt();
        int p=0;
        int c=0;
//        判断已分配区中是否含有相同作业名的作业
        for (int i = 0; i < yi.size(); i++) {
            if(yi.get(i).getName().equals(name)){
                System.out.println("请更换作业名!");
                p++;
                break;
            }
        }
        if(p==0){
            for (int i = 0; i < wei.size(); i++) {
                if(wei.get(i).getLength()>=x){
                    yifenqu y=new yifenqu(name,wei.get(i).getStart(),x,1);
                    yi.add(y);
                    wei.get(i).setStart(wei.get(i).getStart()+x);
                    wei.get(i).setLength(wei.get(i).getLength()-x);
//                    ||||||||||||
                    System.out.println("作业添加成功!");
                    c++;
                    break;
                }
            }
            if(c==0){
                int a=0;
//                判断合并的空闲分区大小是否可以容纳该作业
                for (int i = 0; i < wei.size(); i++) {
                    a=a+wei.get(i).getLength();
                }
                if(a>=x){
//                    紧凑算法:将所有已占用的空间放置在一起,使其首地址为空闲分区首地址,作业依次排列,
//                    将未分区地址放在所有作业的下边。
                    int start=yi.get(0).getStart();
//                    找出首地址最小的值,作为第一个作业的首地址
                    for (int i = 0; i < yi.size(); i++) {
                        if(yi.get(i).getStart() arr=new ArrayList<>();
//        在已分配区中寻找作业名相同的作业
        for (int i = 0; i < yi.size(); i++) {
            if(yi.get(i).getName().equals(name)){
                fen.setStart(yi.get(i).getStart());
                fen.setLength(yi.get(i).getLength());
                yi.remove(i);
                c++;
                break;
            }
        }
        if(c==0){
            System.out.println("已分配区表中不含此作业!");
        }
        if(c!=0){
//            为该作业的中的部分值赋值
            fen.setXuhao(wei.size()+1);
            fen.setZhuangtai(0);
            wei.add(fen);
//        合并分区
        for (int i = 0; i < wei.size(); i++) {
            for (int z = wei.size()-1; z > 0 ; z--) {
                if(wei.get(i).getStart()+wei.get(i).getLength()==wei.get(z).getStart()){
                    wei.get(i).setLength(wei.get(i).getLength()+wei.get(z).getLength());
                    wei.get(i).setStart(wei.get(i).getStart());
                    arr.add(z);
                }
                else if(wei.get(i).getStart()==wei.get(z).getStart()+wei.get(z).getLength()){
                    wei.get(z).setLength(wei.get(z).getLength()+wei.get(i).getLength());
                    wei.get(z).setStart(wei.get(z).getStart());
                    arr.add(i);
                }
            }
        }
//        将分区中被合并的区块从列表中移除
        for (int i = 0; i < arr.size() ; i++) {
            int e = arr.get(i) - i;
            wei.remove(e);
        }
        wei.get(0).setZhuangtai(1);
        System.out.println("作业回收成功!");
    }
    }


    public static void xianshi(){
        for (int i = 0; i < wei.size(); i++) {
//            if(wei.get(i).getZhuangtai()==1){
            if(wei.get(i).getLength()>=1){
                System.out.println(wei.get(i));
            }

//            }
        }
        for (int j = 0; j < yi.size(); j++) {
            System.out.println(yi.get(j));
        }
    }
}

未分区实体类:

public class fenqu {
    private int xuhao;
    private int start;     //始址
    private int length;    //长度
    private int zhuangtai; //状态

    @Override
    public String toString() {
        return "未分配分区表{" +
                "序号=" + xuhao +
                ", 始址(K)=" + start +
                ", 长度(KB)=" + length +
                ", 状态=" + zhuangtai +
                '}';
    }

    public fenqu() {
    }

    public fenqu(int xuhao, int start, int length, int zhuangtai) {
        this.xuhao = xuhao;
        this.start = start;
        this.length = length;
        this.zhuangtai = zhuangtai;
    }

    public int getStart() {
        return start;
    }

    public void setStart(int start) {
        this.start = start;
    }

    public int getLength() {
        return length;
    }

    public void setLength(int length) {
        this.length = length;
    }

    public int getZhuangtai() {
        return zhuangtai;
    }

    public void setZhuangtai(int zhuangtai) {
        this.zhuangtai = zhuangtai;
    }

    public int getXuhao() {
        return xuhao;
    }

    public void setXuhao(int xuhao) {
        this.xuhao = xuhao;
    }
}

已分区实体类:

ublic class yifenqu{
    private String name;
    private int start;     //始址
    private int length;    //长度
    private int zhuangtai; //状态


    @Override
    public String toString() {
        return "已分配区说明表{" +
                "名字='" + name + ''' +
                ", 始址=" + start +
                ", 长度=" + length +
                ", 状态=" + zhuangtai +
                '}';
    }

    public yifenqu() {
    }

    public yifenqu(String name, int start, int length, int zhuangtai) {
        this.name = name;
        this.start = start;
        this.length = length;
        this.zhuangtai = zhuangtai;
    }

    public int getStart() {
        return start;
    }

    public void setStart(int start) {
        this.start = start;
    }

    public int getLength() {
        return length;
    }

    public void setLength(int length) {
        this.length = length;
    }

    public int getZhuangtai() {
        return zhuangtai;
    }

    public void setZhuangtai(int zhuangtai) {
        this.zhuangtai = zhuangtai;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/671301.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号