java 实现进程调度

来源:互联网 发布:淘宝卖家留言在哪里 编辑:程序博客网 时间:2024/06/05 05:00




import java.util.LinkedList;  class PCB{      public int id;                            //进程ID      public int pri;                           //进程优先级      public int cput;                          //进程已占用的时间片      public int allt;                          //进程还需占用的时间片      public int startblock;                    //进程开始时间片      public int endblock;                      //进程阻塞时间片      public String state;                      //进程状态      public PCB(){      }                      }//进程控制块    public class DP {      public PCB rpcb=null;                     //正在运行的进程      public LinkedList<PCB> readyqueue=null;         //就绪队列      public LinkedList<PCB> blockqueue=null;         //阻塞队列      public LinkedList<PCB> tempqueue=null;          //临时队列,存储初始队列;      public LinkedList<PCB> overqueue=null;          //执行完成的队列      public int[] ids={0,1,2,3,4};      public int[] pris={19,18,12,17,11};      public int[] cputs={0,0,0,0,0};      public int[] allts={3,3,6,3,4};      public int[] sts={0,0,0,0,0};      public int[] ens={3,3,3,3,3};      public String[] states={"READY","READY","READY","READY","READY"};      public DP()      {          readyqueue=new LinkedList<PCB>();          blockqueue=new LinkedList<PCB>();          tempqueue=new LinkedList<PCB>();          overqueue=new LinkedList<PCB>();      }      public void readyqueueSort(LinkedList<PCB> queue)    //就绪队列优先权排序      {          PCB temppcb1,temppcb2,temppcb3;          int count1=queue.size();          int count2=queue.size()-1;          LinkedList<PCB> queueQ=new LinkedList<PCB>();          while(count1>0){              temppcb3=temppcb1=queue.poll();              count1--;              while(count2>0){                  temppcb2=queue.poll();                  count2--;                  if(temppcb2.pri>=temppcb1.pri)//优先权                  {                      queue.offer(temppcb2);                  }                  else                  {                      queue.offer(temppcb1);                      temppcb1=new PCB();                      temppcb1=temppcb2;                  }              }              queue.offer(temppcb1);              count2=queue.size()-1;          }      }      public void blockqueueSort(LinkedList<PCB> queue)    //初始化阻塞队列剩余时间片排序      {          PCB temppcb1,temppcb2;          int count1=queue.size();          int count2=queue.size()-1;                    while(count1>0){              temppcb1=queue.poll();              count1--;              while(count2>0){                  temppcb2=queue.poll();                  count2--;                  if(temppcb2.endblock<temppcb1.endblock)//剩余时间片                  {                      queue.offer(temppcb2);                  }                  else                  {                      queue.offer(temppcb1);                      temppcb1=new PCB();                      temppcb1=temppcb2;                  }              }              queue.offer(temppcb1);              count2=queue.size()-1;          }      }      public void tempqueueInit(LinkedList<PCB> queue)//临时队列的初始化2      {          for(int i=0;i<=4;i++)          {              PCB temPcb=new PCB();              temPcb.id=ids[i];              temPcb.pri=pris[i];              temPcb.cput=cputs[i];              temPcb.allt=allts[i];              temPcb.startblock=sts[i];              temPcb.endblock=ens[i];              temPcb.state=states[i];              queue.offer(temPcb);          }          System.out.println("临时队列初始化成功");      }      public String initqueue(LinkedList<PCB> queue0,LinkedList<PCB> queue1,LinkedList<PCB> queue2)      {          PCB temppcb;          while((temppcb=queue0.poll())!=null){              if(temppcb.state.equals("READY"))//就绪队列初始化              {                  queue1.offer(temppcb);              }              else                            //阻塞队列初始化              {                  queue2.offer(temppcb);              }          }                    readyqueueSort(queue1);          blockqueueSort(queue2);                return "队列初始化成功!";      }      public void inputQueue(LinkedList<PCB> queue)         //队列输出      {          LinkedList<PCB> tempqueue=new LinkedList<PCB>(queue);                    PCB temppcb;          while((temppcb=tempqueue.poll())!=null){              System.out.print("   "+temppcb.id+"   ");              System.out.print(temppcb.pri+"   ");              System.out.print(temppcb.cput+"   ");              System.out.print(temppcb.allt+"   ");              System.out.print(temppcb.startblock+"   ");              System.out.print(temppcb.endblock+"   ");              System.out.print(temppcb.state);              System.out.println();          }      }      public void input(DP sDp)  //打印输出    {          System.out.println("--------------------------------");          System.out.println("RUNNING_PROCESS:");          if(sDp.rpcb!=null)          {              System.out.println(sDp.rpcb.id+"  "+sDp.rpcb.pri+"  "+sDp.rpcb.allt);          }          else {              System.out.println("无进程在执行");          }          System.out.println("就绪队列:");          sDp.inputQueue(sDp.readyqueue);          System.out.println("阻塞队列:");          sDp.inputQueue(sDp.blockqueue);          System.out.println("完成的队列:");          sDp.inputQueue(sDp.overqueue);      }      public boolean judgePri(LinkedList<PCB> queue)//判断是否后来优先权更大      {          LinkedList<PCB> tempqueue=new LinkedList<PCB>(queue);          PCB tempPcb=tempqueue.poll();          if(tempPcb!=null)          {              if(tempPcb.pri>rpcb.pri)              {                  return true;              }              else {                  return false;              }          }          else {              return false;          }                }      public void readyqueueUpdate(LinkedList<PCB> queue)//就绪队列更新      {          int count=queue.size();          PCB tempPcb;          while(count>0)          {              count--;              tempPcb=queue.poll();              tempPcb.pri++;              queue.offer(tempPcb);          }          readyqueueSort(readyqueue);      }      public void blockqueueUpdate(LinkedList<PCB> queue)//阻塞队列更新      {          int count=queue.size();          PCB tempPcb;          while(count>0)          {              count--;              tempPcb=queue.poll();              tempPcb.endblock--;              if(tempPcb.endblock==0)              {                  tempPcb.endblock=3;                  tempPcb.state="READY";                  readyqueue.offer(tempPcb);                  readyqueueSort(readyqueue);//使得刚转移过来的进程参与优先权竞选              }              else{                  queue.offer(tempPcb);              }                        }          blockqueueSort(blockqueue);      }      public void stepupEnd()  //停止一个时间片    {          if(rpcb.allt==0)          {              rpcb.state="OVER";              overqueue.offer(rpcb);              rpcb=readyqueue.poll();              rpcb.state="EXECUTE";              rpcb.allt--;              rpcb.cput++;              rpcb.pri=rpcb.pri-3;                                      }          else          {              rpcb.allt--;              rpcb.cput++;              rpcb.pri=rpcb.pri-3;          }                }      public void stepup()        //运行一个时间片      {          if(rpcb!=null)          {              if(rpcb.allt==0)              {                  rpcb.state="OVER";                  overqueue.offer(rpcb);                  rpcb=readyqueue.poll();                  rpcb.state="EXECUTE";                  rpcb.allt--;                  rpcb.cput++;                  rpcb.pri=rpcb.pri-3;              }              else              {                  if(judgePri(readyqueue))                  {                      rpcb.state="BLOCK";                      blockqueue.offer(rpcb);                      rpcb=readyqueue.poll();                      rpcb.state="EXECUTE";                                        }                  rpcb.allt--;                  rpcb.cput++;                  rpcb.pri=rpcb.pri-3;              }              readyqueueUpdate(readyqueue);              blockqueueUpdate(blockqueue);          }          else          {              rpcb=readyqueue.poll();              rpcb.allt--;              rpcb.cput++;              rpcb.pri=rpcb.pri-3;              rpcb.state="EXECUTE";                            readyqueueUpdate(readyqueue);              blockqueueUpdate(blockqueue);          }      }      public static void main(String[] args) {          DP sDp=new DP();          sDp.tempqueueInit(sDp.tempqueue);          System.out.println(sDp.initqueue(sDp.tempqueue, sDp.readyqueue, sDp.blockqueue));                 System.out.println("就绪队列:");          sDp.inputQueue(sDp.readyqueue);          System.out.println("阻塞队列:");          sDp.inputQueue(sDp.blockqueue);          System.out.println("完成的队列:");          sDp.inputQueue(sDp.overqueue);                    PCB temPcb;          LinkedList<PCB> queue=new LinkedList<PCB>(sDp.readyqueue);          int count=0;          while((temPcb=queue.poll())!=null)          {              sDp.stepup();              count++;              System.out.println("第"+count+"个时间片后:");              sDp.input(sDp);              System.out.println();              queue=new LinkedList<PCB>(sDp.readyqueue);          }                    while(sDp.rpcb.allt!=0)          {              sDp.stepupEnd();              count++;              System.out.println("第"+count+"个时间片后:");              sDp.input(sDp);              System.out.println();          }          sDp.rpcb.state="OVER";          sDp.overqueue.offer(sDp.rpcb);          sDp.rpcb=null;                    count++;          System.out.println("第"+count+"个时间片后:");          sDp.input(sDp);      }  }

0 0