Java 操作系统实验 时间片轮转法

学校布置作业,敲了好久代码,真的好累!

这里把时间片定为2 大家有需要的就参考参考 本人学艺不精.....

Main函数 调用方法
public class Main {
    public static void main(String[] args) {
        cal RR = new cal();
        RR.input();
    }
}

程序块类

public class pcb {
    private String name;
    private int needtime;

    int arrivetime = 0;
    private Integer cputime = 0;
    private String state;
    private int round = 0;
    private int count = 0;

    public pcb() {
    }

    public pcb(String name, int needtime) {
        this.name = name;
        this.needtime = needtime;

    }

    public String getName() {
        return name;
    }

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

    public int getNeedtime() {
        return needtime;
    }

    public void setNeedtime(int needtime) {
        this.needtime = needtime;
    }

    public Integer getCputime() {
        return cputime;
    }

    public void setCputime(Integer cputime) {
        this.cputime = cputime;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public int getRound() {
        return round;
    }

    public void setRound(int round) {
        this.round = round;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }





}

方法类

public class cal {
    public static void input() {
        Scanner sc = new Scanner(System.in);
        System.out.println("please input the number of processes:");
        int input = sc.nextInt();
        pcb[] pcb1 = new pcb[input];//创建pcb数组

        List Wait = new ArrayList<String>();     //创建等待队列

        List Ready = new ArrayList<String>();     //创建就绪队列

        List Done = new ArrayList<String>(); //创建完成队列

        List Sout = new ArrayList<String>();  //定义一个列表 用于排序

        System.out.println("input name and needtime:");
        int round = 2;//创建时间片大小
        int i;
        for (i = 0; i < input; i++) {
            String a = sc.next();//输入名字
            Sout.add(a);
            int b = sc.nextInt();//输入需要的时间
            pcb1[i] = new pcb(a, b);//创建数组  按照input的数量
        }

        pcb temp = new pcb();
        for (i = 0; i < input - 1; i++) {    //排列,按照arrivetime 先到达的排在前面
            int j;
            for (j = 0; j < input - 1 - i; j++) {
                if (pcb1[j].arrivetime > pcb1[j + 1].arrivetime)//冒泡排序
                {
                    temp = pcb1[j];
                    pcb1[j] = pcb1[j + 1];
                    pcb1[j + 1] = temp;
                }
            }
        }

        int nowtime = pcb1[0].arrivetime;  //现在的时间--直接从第一个pcb块到达的时间开始

        for (i = 0; i < input; i++) {
            if (pcb1[i].arrivetime >= nowtime) {         //如果现在的时间大于到达时间就进入就绪队列
                Ready.add(pcb1[i].getName());  //往就绪队列中添加名字
                pcb1[i].setState("W");//就绪队列的W
            } else {                                      //否则进入等待队列
                Wait.add(pcb1[i].getName());   //往等待队列中添加名字 String类型
                pcb1[i].setState("W");//等待队列的W
            }
        }

        //运行的次数等于?
        //当大家需要的时间都为0的时候,结束循环.
        while(true){
            check(input,Ready,Done,Sout,pcb1,round);
            int c = 0;//这是一个伟大的算法 先定义一个变量用于计数
            for (int j = 0; j < input; j++) {
                if(pcb1[j].getNeedtime()==0){
                    c+=1;//如果所有的时间块的needtime都为0了,就可以结束了
                }//顶级理解
            }

            if(c==input){
                break;
            }
        }





    }

    public static void check(int input,List Ready,List Done,List Sout,pcb[] pcb1,int round) {


        int r1 = 0;//把就绪队列中第一个抽出来 用于进入运行态
        int j;
        for (j = 0; j < input; j++) {
            if (Ready.get(0).equals(pcb1[j].getName())) {
                r1 = j;
            }


        }
        pcb1[r1].setState("R");//把状态设为R
        System.out.println("Name  cputime  needtime  count  round  state");   //输出排序后的进程
        for (j = 0; j < input; j++) {
            for (int i = 0; i < input; i++) {//遍历一下 取出与排列数组索引对应的程序块
                if (Sout.get(j).equals(pcb1[i].getName())){
                    System.out.print("  " + pcb1[i].getName() + "     ");//获取名字
                    System.out.print(pcb1[i].getCputime() + "      ");//获取占用cpu的时间
                    System.out.print(pcb1[i].getNeedtime() + "        ");//获取需要使用的时间
                    System.out.print(pcb1[i].getCount() + "         ");//获取使用cpu的轮数
                    System.out.print(round + "         ");//输出时间片
                    System.out.println(pcb1[i].getState());
                }
            }
        }

        Ready.remove(pcb1[r1].getName());//删除掉 就绪 队列中第一个
        Sout.remove(pcb1[r1].getName());//删除掉 排列 队列中对应就绪的元素 因为这个环节要用到他 后续要把它拿到第一位
        if(Ready.size()!=0){
            Sout.remove(Ready.get(0));//先把下一个要进入使用的删除
        }


        Integer realtime = 0;//定义一个变量 用于判断如果时间片没用完进程块就结束的情况 实际占用cpu的时间
        if (pcb1[r1].getNeedtime() - round >= 0) {
            realtime = round;
        } else if (pcb1[r1].getNeedtime() - round < 0) {
            realtime = pcb1[r1].getNeedtime();
        }

        pcb1[r1].setNeedtime(pcb1[r1].getNeedtime() - realtime);//设置还需要的时间 减去时间片

        if (realtime == round) {
            pcb1[r1].setCputime(pcb1[r1].getCputime() + round);

        } else if (realtime == 1) {                //设置Cpu占用时间
            pcb1[r1].setCputime(pcb1[r1].getCputime() + realtime);
        }


        if (pcb1[r1].getNeedtime() > 0) {
            Ready.add(pcb1[r1].getName());//如果需要时间仍然大于0 就重新添加回就绪队伍
            pcb1[r1].setState("W");
        } else {
            pcb1[r1].setState("F");
            Ready.remove(pcb1[r1].getName());
            Done.add(pcb1[r1].getName());
        }

        pcb1[r1].setCount(pcb1[r1].getCount() + 1);

        Sout.add(pcb1[r1].getName());
        if(Ready.size()!=0){
            Sout.add(0,Ready.get(0));//添加回去
        }



        System.out.println("就绪队列:" + Ready);
        System.out.println("完成队列:" + Done);

        if (Ready.size() == 0) {

            System.out.println("\n");
            System.out.println("最终结果:");
            System.out.println("Name  cputime  needtime  count  round  state");   //输出排序后的进程
            for (j = 0; j < input; j++) {
                for (int i = 0; i < input; i++) {//遍历一下 取出与排列数组索引对应的程序块
                    if (Sout.get(j).equals(pcb1[i].getName())){
                        System.out.print("  " + pcb1[i].getName() + "     ");//获取名字
                        System.out.print(pcb1[i].getCputime() + "      ");//获取占用cpu的时间
                        System.out.print(pcb1[i].getNeedtime() + "        ");//获取需要使用的时间
                        System.out.print(pcb1[i].getCount() + "         ");//获取使用cpu的轮数
                        System.out.print(round + "         ");//输出时间片
                        System.out.println(pcb1[i].getState());
                    }
                }
            }

            System.out.println("就绪队列:" + Ready);
            System.out.println("完成队列:" + Done);

        }
    }

 

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值