Imitate_ProcessRR轮盘调度

package Imitate_Process;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author ray
 */
public class Imitate_ProcessRR {
    /**
     *  1、通过数组 , String[] id = new  String[5];
     *            id[i] = new String[5];
     *  id    cputime   alltime  startblock   blocktime  state   next
     *  2、List<RR>---新建一个beans  PCB
     *      Map<key,value>------List<Map< Key, Value>> 
     *              List.get(1).get(key)
     *  3、链表---enitity--
     */
    private static List<enitity_PCB> ready,run,block,finish;
    private static enitity_PCB p1 ,p2,p3,p4,p5;
    //private static enitity_PCB p;

    protected void rrInit(){
        int p = 0;
        int allT= 0;
        int sbt = 0;
        // 初始化ready队列,并生成相关数据
        ready = new ArrayList<enitity_PCB>();
        run = new ArrayList<enitity_PCB>();
        block = new ArrayList<enitity_PCB>();
        finish = new ArrayList<enitity_PCB>();
        p1 = new enitity_PCB();
        p2 = new enitity_PCB();
        p3 = new enitity_PCB();
        p4 = new enitity_PCB();
        p5 = new enitity_PCB();
        ready.add(p1);
        ready.add(p2);
        ready.add(p3);
        ready.add(p4);
        ready.add(p5);
        for(int i=0;i<5;i++){
            //list.add(new enitity_PCB());
            ready.get(i).setId(i+1);
            allT=(int)(Math.random()*100)%5+1;
            ready.get(i).setAllTime(allT);
            // 保证BlockTime < AllTime
            ready.get(i).setBlockTime((int)(Math.random()*100)%allT+1);
            //ready.get(i).setCpuTime((int)(Math.random()*100)%5+1);
            ready.get(i).setCpuTime(p);
            ready.get(i).setStartBlock((int)(Math.random()*100)%5+1);
            ready.get(i).setState("ready");
            if(i<4)
                ready.get(i).setNext(ready.get(i+1));
        }   
    }

    protected void rrRun(){
        while(!((block.size()==0)&&(ready.size()==0)&&(run.size()==0))){
        if(ready.size()<=0){
            //判断 ready 队列是否为空
            // 为空,则减少blocktime 的时间片
            rrJudgeBlock(); 
            rrRun();
            rPrint();
        }
        else if(ready.size()>0){
            // ready 不为空,则从ready获取新的元素
            run.add(ready.get(0));
            ready.remove(0);//}
            // 更改状态为run
            run.get(0).setState("run");
            //对于Run队列中的进程:cputime+1,alltime-1,startblock-1;
            run();
            // block队列中同时 减去一个时间片
                if(rrFinish()){
                    run.remove(0);
                    rrRun();
                    }else{
                    rrReady();
                }
            }
        }   
    }
    protected void run(){
        int pcpuTime=0;
        int palltime=0;
        int startblock=0;
        // run 队列运行一个时间片
        if((run.get(0).getBlockTime()==0)&&(
            run.get(0).getStartBlock()==0)){
         pcpuTime = run.get(0).getCpuTime(); 
            pcpuTime++;     
            run.get(0).setCpuTime(pcpuTime);
         palltime = run.get(0).getAllTime(); 
            palltime--;     run.get(0).setAllTime(palltime);
        }else{
         pcpuTime = run.get(0).getCpuTime(); 
            pcpuTime++;     run.get(0).setCpuTime(pcpuTime);
         palltime = run.get(0).getAllTime(); 
            palltime--;     run.get(0).setAllTime(palltime);
         startblock = run.get(0).getStartBlock(); 
            startblock--;   run.get(0).setStartBlock(startblock);
            }
        // block 运行一个时间片,且同时将接触block添加到ready队列
            if(block.size()>0){
                rrJudgeBlock();
            //System.out.println("----------------------运行过rrJudgeBlock了,+block.get(0).getBlockTime():"+block.get(0).getBlockTime());
            }
        rPrint();
        //isBlock();
    }
    // 递归运行
    protected void isBlock(){
        // 一个时间片之后判断有无 需要阻塞的元素 添加到block 队列中
         if(run.get(0).getStartBlock()==0){
            run.get(0).setState("block");
            // 可以阻塞,加入block队列,并且递归运行
            block.add(run.get(0));
            run.remove(0);
            rrRun();
            }
    }
    protected void rrReady(){
        if(run.get(0).getStartBlock()>0
                && run.get(0).getAllTime()>0){
            run.get(0).setState("ready");
            // 将运行一次的元素重新放置到ready队列
            ready.add(run.get(0));
            // 重新链接 逻辑关系
            rrSort();
            // 移除现run队列元素并低轨运行
            run.remove(0);
            rrRun();    
        }else{
            isBlock();
        }
    }
    protected void rrSort(){// 重新链接逻辑关系
        for(int i=0;i<ready.size()-1;i++){
            ready.get(i).setNext(ready.get(i+1));
        }   
    }
    protected boolean rrFinish(){
        // 判断alltime=0 run队列中的元素是否运行结束,结束则更改状态为 finish 且放入到finish队列
        //System.out.println("---------run.get(0).getAllTime():"+run.get(0).getAllTime());
        int allTime = run.get(0).getAllTime();
        if(allTime!=0){
            return false;
        }else {
            // 已运行结束,加入finish队列
            run.get(0).setState("finish");
            enitity_PCB p = run.get(0);
            finish.add(p);
            return true;
        }
    }

    protected void rrJudgeBlock(){
        // 运行一个时间片,减少阻塞时间blockTime
        // 将blocktime==0的元素放置到 ready队列中
            for (int i=0;i<block.size() ;i++ ) {
                int rBlockTime=block.get(i).getBlockTime();
                if(rBlockTime == 0){
                    //将 blcoktime==0 的元素放置到 ready 队列中
                    // 并重新确定逻辑关系
                //  System.out.println("-----------------------------rrJudgeBlock内部二,rBlockTime="+rBlockTime);
                    block.get(i).setBlockTime(rBlockTime);
                    block.get(i).setState("ready");
                        ready.add(block.get(i));
                        rrSort();
                        // 移除block队列中该元素
                        block.remove(i);    
                    //System.out.println("-----------------------------rrJudgeBlock内部三,block.size():"+block.size());
                    }else{
                        rBlockTime--;
                        block.get(i).setBlockTime(rBlockTime);
                    }               
                }
            //  rPrint();
        }
    //  // 判断startblock=0,阻塞进程,并加入到阻塞队列,更改状态block
    //  for(int i=0;i<run.size();i++){
    //      if(run.get(i).getStartBlock==0){
    //           block.add(run.get(i));
    //           block.get(i).setState("block");
    //          // 重新排序 ready 队列
    //           run.remove(i);
    //           rrSort(i);
    //           i--;
    //      }
    //          int s=0;
    //          System.out.println("block.size ="+block.size());
    //          //生成block链表链接
    //       while(s<block.size()){
    //          block.get(i).setNext(run.get(i+1));
    //          s++;
    //  }
    // }

//  protected void rrJudgeReady(){
//      //判断block结束进程,直接放置ready队尾,状态更改为ready
//      while(int i=0;i<block.size();i++){
//          if
//      }
//  }

    public static void main(String[] argv){
        Imitate_ProcessRR ip = new Imitate_ProcessRR();
        ip.rrInit();
        System.out.println("--------------------------------------初始队列值--------------------------------");
        for(int i =0;i<5;i++){
            System.out.print(
                    "id:"+ready.get(i).getId()+" "+
                    //"地址:"+ready.get(i)+
                    "/getBlockTime: "+ready.get(i).getBlockTime()+" "+
                    "/getAllTime: "+ready.get(i).getAllTime()+" "+ 
                    "/getCpuTime: "+ready.get(i).getCpuTime()+" "+
                    "/getStartBlock: "+ready.get(i).getStartBlock()+" "+
                    "/getState: "+ready.get(i).getState()+" "
                    +"/getNext: "+ready.get(i).getNext()
                    );
            System.out.println("");
        }

            ip.rrRun();
            ip.rPrint();

    }




    protected void rPrint(){
        System.out.println("");
        System.out.println("*******************************************************************************");
        System.out.println("READY:");
        for(int i=0;i<ready.size();i++){
            System.out.print("id:"+ready.get(i).getId()+" "+
                    //"地址:"+ready.get(i)+
                    "/getBlockTime: "+ready.get(i).getBlockTime()+" "+
                    "/getAllTime: "+ready.get(i).getAllTime()+" "+ 
                    "/getCpuTime: "+ready.get(i).getCpuTime()+" "+
                    "/getStartBlock: "+ready.get(i).getStartBlock()+" "+
                    "/getState: "+ready.get(i).getState()+" "
//                  "/getNext: "+ready.get(i).getNext()
                    );
            System.out.println("");
        }
        System.out.println("");
        System.out.println("RUN:");
        for(int j=0;j<run.size();j++){
            System.out.print("id:"+run.get(j).getId()+" "+
                    //"地址:"+run.get(j)+
                    "/getBlockTime: "+run.get(j).getBlockTime()+" "+
                    "/getAllTime: "+run.get(j).getAllTime()+" "+ 
                    "/getCpuTime: "+run.get(j).getCpuTime()+" "+
                    "/getStartBlock: "+run.get(j).getStartBlock()+" "+
                    "/getState: "+run.get(j).getState()+" "
//                  "/getNext: "+run.get(j).getNext()
                    );
            System.out.println("");
        }
        System.out.println("");
        System.out.println("BLOCK:");
        for(int m=0;m<block.size();m++){    
            System.out.print("id:"+block.get(m).getId()+" "+
                    //"地址:"+block.get(m)+
                    "/getBlockTime: "+block.get(m).getBlockTime()+" "+
                    "/getAllTime: "+block.get(m).getAllTime()+" "+ 
                    "/getCpuTime: "+block.get(m).getCpuTime()+" "+
                    "/getStartBlock: "+block.get(m).getStartBlock()+" "+
                    "/getState: "+block.get(m).getState()+" "
//                  +"/getNext: "+block.get(m).getNext()
                    );
            System.out.println("");
        }
        System.out.println("");
        System.out.println("FINISH:");
        for(int n=0;n<finish.size();n++){
            System.out.print("id:"+finish.get(n).getId()+" "+
                    //"地址:"+finish.get(n)+
                    "/getBlockTime: "+finish.get(n).getBlockTime()+" "+
                    "/getAllTime: "+finish.get(n).getAllTime()+" "+ 
                    "/getCpuTime: "+finish.get(n).getCpuTime()+" "+
                    "/getStartBlock: "+finish.get(n).getStartBlock()+" "+
                    "/getState: "+finish.get(n).getState()+" "
//                  +"/getNext: "+finish.get(n).getNext()
                    );
            System.out.println("");
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值