动态分区分配算法模拟

//进程类封装

package pers.jintao.firstfit;

public class Progress {
    private int size;
    private String name;
    public Progress() {

    }
public Progress(int size,String name) {
        this.size=size;
        this.name=name;
    }
    public int getSize() {
         return this.size;
     }
    public void setSize(int size) {
          this.size=size;
     }
    public String getName() {
         return this.name;
     }
    public void setName(String name) {
          this.name=name;
     }
}

//空闲分区封装

package pers.jintao.firstfit;


public class Partition {
    private int size;
    private int residualSize;
    private String progress;
    
     public  Partition() {
        size=0;
        residualSize=0;
    }
     public  Partition(int size,int residualSize,String progress) {
            this.size=size;
            this.residualSize=residualSize;
            this.progress=progress;
        }
     public int getSize() {
         return this.size;
     }
     public int getResidualSize() {
         return this.residualSize;
     }
     public String getProgress() {
         return this.progress;
     }
     public void setSize(int size) {
         this.size=size;
     }
     public void setResidualSize(int residualSize) {
         this.residualSize=residualSize;
     }
     public void setProgress(String progress){
         this.progress+=progress;
     }
}

//首次适应算法

package pers.jintao.firstfit;

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


public class FirstFit {
    public static void main(String[] args) {
        int partitionNum = 0;    //空闲分区数
        int progressNum =0;        //进程数
        boolean isEnd= false;    //初始化完成标志
        int flag=0;            //空闲分区操作标志
        int flag2=-1;        //进程操作标志
        ArrayList<Partition> arryPartition=new ArrayList<Partition>(); 
        ArrayList<Progress> arryProgress=new ArrayList<Progress>();
        Scanner sc=new Scanner(System.in);
        while(!isEnd){
            //空闲分区初始化
            if(flag==0) {
                System.out.print("输入空闲分区数");
                partitionNum=sc.nextInt();    
                flag++;
            }
            else if(flag2==-1){
                System.out.print("输入空闲分区"+flag+"大小");
                int size=sc.nextInt();
                Partition par=new Partition(size,size,"");            
                arryPartition.add(par);
                flag++;
                if(flag==partitionNum+1) {
                    flag2++;
                }
            }    
            //进程初始化
            else if(flag2==0) {
                System.out.print("输入进程数");
                progressNum=sc.nextInt();    
                flag2++;
            }
            else {
                System.out.print("输入进程"+flag2+"名称、大小");
                String name =sc.next();
                int size=sc.nextInt();
                Progress pro=new Progress(size,name);
                arryProgress.add(pro);
                flag2++;
                if(flag2==progressNum+1) {
                    isEnd=true;
                }
                
            }
        }
        sc.close();
        
        for(int i=0;i< progressNum;i++) {
            for(int j=0;j<partitionNum;) {
                if(arryProgress.get(i).getSize()<=arryPartition.get(j).getResidualSize()) {
                    arryPartition.get(j).setProgress(arryProgress.get(i).getName());
                    arryPartition.get(j).setResidualSize(arryPartition.get(j).getResidualSize()-arryProgress.get(i).getSize());
                    break;
                }
                j++;
                if(j==partitionNum) {
                    System.out.println(arryProgress.get(i).getName()+"无法分配");
                }
            }
        }
        System.out.println("分配后分区大小"+'\t'+"分配进程"+'\t');
        for(int i=0;i<arryPartition.size();i++) {
            System.out.println(""+arryPartition.get(i).getResidualSize()+'\t'+'\t'+arryPartition.get(i).getProgress()+'\t');
        }
    }

       

//循环首次适应算法

package pers.jintao.nextfit;

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

import pers.jintao.firstfit.Partition;
import pers.jintao.firstfit.Progress;

public class NextFit {
    public static void main(String[] args) {
        int partitionNum = 0;    //空闲分区数
        int progressNum =0;        //进程数
        boolean isEnd= false;    //初始化完成标志
        int flag=0;            //空闲分区操作标志
        int flag2=-1;        //进程操作标志
        ArrayList<Partition> arryPartition=new ArrayList<Partition>(); 
        ArrayList<Progress> arryProgress=new ArrayList<Progress>();
        Scanner sc=new Scanner(System.in);
        while(!isEnd){
            //空闲分区初始化
            if(flag==0) {
                System.out.print("输入空闲分区数");
                partitionNum=sc.nextInt();    
                flag++;
            }
            else if(flag2==-1){
                System.out.print("输入空闲分区"+flag+"大小");
                int size=sc.nextInt();
                Partition par=new Partition(size,size,"");            
                arryPartition.add(par);
                flag++;
                if(flag==partitionNum+1) {
                    flag2++;
                }
            }    
            //进程初始化
            else if(flag2==0) {
                System.out.print("输入进程数");
                progressNum=sc.nextInt();    
                flag2++;
            }
            else {
                System.out.print("输入进程"+flag2+"名称、大小");
                String name =sc.next();
                int size=sc.nextInt();
                Progress pro=new Progress(size,name);
                arryProgress.add(pro);
                flag2++;
                if(flag2==progressNum+1) {
                    isEnd=true;
                }
                
            }
        }
        sc.close();
        int progressFlag=0;
        for(int i=0;i< progressNum;i++) {
            for(int j=0;j<partitionNum;) {
                int num=progressFlag % partitionNum;
                if(arryProgress.get(i).getSize()<=arryPartition.get(num).getResidualSize()) {
                    arryPartition.get(num).setProgress(arryProgress.get(i).getName());
                    arryPartition.get(num).setResidualSize(arryPartition.get(num).getResidualSize()-arryProgress.get(i).getSize());
                    break;
                }
                progressFlag++;
                j++;
                if(j==partitionNum) {
                    System.out.println(arryProgress.get(i).getName()+"无法分配");
                }
            }
        }
        System.out.println("分配后分区大小"+'\t'+"分配进程"+'\t');
        for(int i=0;i<arryPartition.size();i++) {
            System.out.println(""+arryPartition.get(i).getResidualSize()+'\t'+'\t'+arryPartition.get(i).getProgress()+'\t');
        }
    }
}


//最佳适应算法

package pers.jintao.bestfit;

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

import pers.jintao.firstfit.Partition;
import pers.jintao.firstfit.Progress;

public class BestFit {
    public static void main(String[] args) {
        int partitionNum = 0;    //空闲分区数
        int progressNum =0;        //进程数
        boolean isEnd= false;    //初始化完成标志
        int flag=0;            //空闲分区操作标志
        int flag2=-1;        //进程操作标志
        ArrayList<Partition> arryPartition=new ArrayList<Partition>(); 
        ArrayList<Progress> arryProgress=new ArrayList<Progress>();
        Scanner sc=new Scanner(System.in);
        while(!isEnd){
            //空闲分区初始化
            if(flag==0) {
                System.out.print("输入空闲分区数");
                partitionNum=sc.nextInt();    
                flag++;
            }
            else if(flag2==-1){
                System.out.print("输入空闲分区"+flag+"大小");
                int size=sc.nextInt();
                Partition par=new Partition(size,size,"");            
                arryPartition.add(par);
                flag++;
                if(flag==partitionNum+1) {
                    flag2++;
                }
            }    
            //进程初始化
            else if(flag2==0) {
                System.out.print("输入进程数");
                progressNum=sc.nextInt();    
                flag2++;
            }
            else {
                System.out.print("输入进程"+flag2+"名称、大小");
                String name =sc.next();
                int size=sc.nextInt();
                Progress pro=new Progress(size,name);
                arryProgress.add(pro);
                flag2++;
                if(flag2==progressNum+1) {
                    isEnd=true;
                }
                
            }
        }
        sc.close();
        
        for(int i=0;i< progressNum;i++) {
            int size=999;
            int num=0;
            for(int j=0;j<partitionNum;) {
                if(arryProgress.get(i).getSize()<=arryPartition.get(j).getResidualSize()&&size>arryPartition.get(j).getResidualSize()-arryProgress.get(i).getSize()) {
                    size=arryPartition.get(j).getResidualSize()-arryProgress.get(i).getSize();
                    num=j;
                }
                j++;
                if(j==partitionNum) {
                    if(size!=arryPartition.get(num).getResidualSize()-arryProgress.get(i).getSize()) {
                        System.out.println(arryProgress.get(i).getName()+"无法分配");
                    }
                    else {
                        arryPartition.get(num).setProgress(arryProgress.get(i).getName());
                        arryPartition.get(num).setResidualSize(size);
                    }
                }
            }
        }
        System.out.println("分配后分区大小"+'\t'+"分配进程"+'\t');
        for(int i=0;i<arryPartition.size();i++) {
            System.out.println(""+arryPartition.get(i).getResidualSize()+'\t'+'\t'+arryPartition.get(i).getProgress()+'\t');
        }
    }
}


//最坏适应算法

package pers.jintao.worstfit;

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

import pers.jintao.firstfit.Partition;
import pers.jintao.firstfit.Progress;

public class WorstFit {
    public static void main(String[] args) {
        int partitionNum = 0;    //空闲分区数
        int progressNum =0;        //进程数
        boolean isEnd= false;    //初始化完成标志
        int flag=0;            //空闲分区操作标志
        int flag2=-1;        //进程操作标志
        ArrayList<Partition> arryPartition=new ArrayList<Partition>(); 
        ArrayList<Progress> arryProgress=new ArrayList<Progress>();
        Scanner sc=new Scanner(System.in);
        while(!isEnd){
            //空闲分区初始化
            if(flag==0) {
                System.out.print("输入空闲分区数");
                partitionNum=sc.nextInt();    
                flag++;
            }
            else if(flag2==-1){
                System.out.print("输入空闲分区"+flag+"大小");
                int size=sc.nextInt();
                Partition par=new Partition(size,size,"");            
                arryPartition.add(par);
                flag++;
                if(flag==partitionNum+1) {
                    flag2++;
                }
            }    
            //进程初始化
            else if(flag2==0) {
                System.out.print("输入进程数");
                progressNum=sc.nextInt();    
                flag2++;
            }
            else {
                System.out.print("输入进程"+flag2+"名称、大小");
                String name =sc.next();
                int size=sc.nextInt();
                Progress pro=new Progress(size,name);
                arryProgress.add(pro);
                flag2++;
                if(flag2==progressNum+1) {
                    isEnd=true;
                }
                
            }
        }
        sc.close();
        
        for(int i=0;i< progressNum;i++) {
            int size=0;
            int num=0;
            for(int j=0;j<partitionNum;) {
                if(arryProgress.get(i).getSize()<=arryPartition.get(j).getResidualSize()&&size<arryPartition.get(j).getResidualSize()-arryProgress.get(i).getSize()) {
                    size=arryPartition.get(j).getResidualSize()-arryProgress.get(i).getSize();
                    num=j;
                }
                j++;
                if(j==partitionNum) {
                    if(size!=arryPartition.get(num).getResidualSize()-arryProgress.get(i).getSize()) {
                        System.out.println(arryProgress.get(i).getName()+"无法分配");
                    }
                    else {
                        arryPartition.get(num).setProgress(arryProgress.get(i).getName());
                        arryPartition.get(num).setResidualSize(size);
                    }
                }
            }
        }
        System.out.println("分配后分区大小"+'\t'+"分配进程"+'\t');
        for(int i=0;i<arryPartition.size();i++) {
            System.out.println(""+arryPartition.get(i).getResidualSize()+'\t'+'\t'+arryPartition.get(i).getProgress()+'\t');
        }
    }
}

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值