⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 processcall.java

📁 操作系统中的进程调度
💻 JAVA
字号:
import java.util.*;
import java.io.*;

//进程类,可以产生进程对象
class Process{
   private String  name;
   private int     state;     //0 表示就绪 1等待
   private int     sort;      //优先级,sort越大优先级越高,随机产生(1-5)
   private int     time;      //执行时间
   private Random rd=new Random();      //用于产生随机数

   Process (String in_name){
         name=in_name;
         time=rd.nextInt(20)+1;         //随机产生0到19的整数
         sort=rd.nextInt(5)+1;
   }
   int Begin_state(){

      state=rd.nextInt(2);          //返回随机产生的0或1,用于判断处于就绪还是等待队列
      return state;
   }
   String getName(){
     return name; 
   }
   int getTime(){
     return time;
   }
   void setTime(int inputtime){
      time=inputtime;
   }
   int getSort(){
      return sort;
   }
   void print(){
      System.out.println("进程名 "+name+"  "+"执行所需时间"+time+"ms"+"\t\t"+"进程状态: "+state+"  "+"优先数  "+sort);
   }

}
//主类
public class ProcessCall{
   //主函数,调用各种不同算法函数
   public static void main(String []args)throws IOException{
       LinkedList<Process> ready=new LinkedList<Process>();          //就绪队列链表头
       LinkedList<Process> wait =new LinkedList<Process>();          //等待队列链表头

       BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
       boolean in=true;
       String s=new String();
      
       String []name={"a","b","c","d","e","f","g","h","i","j"};  //进程名

       while(in){
          for(int i=0;i<10;i++){
             Process process=new Process(name[i]);        //产生一个进程
             if (process.Begin_state()==0){
                   ready.addLast(process);
             }
             else{ 
                   wait.addLast(process);
             }     
          }
       
          System.out.println("\n选择调度算法"+"\n\n"+"1-先进先出调度算法  2-基于优先数的调度算法  3-最短执行时间调度算法  其他数字键键-退出");

          try{
             s=br.readLine();          //接受Ascii码,1的Ascii码为49;
          }catch(IOException e){};

          switch(Integer.parseInt(s)){
             case 1: call_FCFS(ready,wait);in=true;break;      //调用先进先出算法
             case 2: call_PrevSort(ready,wait);in=true;break;      //调用基于优先数的调度算法
             case 3: call_LessTime(ready,wait);in=true;break;   //调用最短执行时间调度算法
             default: in=false;System.out.println("退出系统!");
          }
       }                  
  }
//输出链表内容
  static void outPrint(LinkedList<Process> list){
       Process temp;         
       if(list.size()>0){
          for(int i=0;i<list.size();i++){
              temp=list.get(i);
              System.out.print("第"+(i+1)+"个进程:"+"\t");
              temp.print();
          }
       }
       else  
          System.out.println("空队列");
  }
//输出所有进程信息
  static void process_Print(LinkedList<Process> ready,LinkedList<Process> wait){
      System.out.println("\n就绪队列:");
      outPrint(ready);
      System.out.println("等待队列:");
      outPrint(wait);
  }

//先进先出调度算法函数
  static void call_FCFS(LinkedList<Process> ready,LinkedList<Process> wait){
      int time=0;        //处理机分配的时间片
      Random rd=new Random();
     
      //执行进程
      while(ready.size()>0 || wait.size()>0){
          process_Print(ready,wait);      //输出所有进程信息
          time=rd.nextInt(15)+5;   //随机产生时间片长度
          System.out.println("\n时间片长度: "+time);
          
          if(ready.size()>0){
             
             if(ready.get(0).getTime() > time){              //进程执行所需时间大于处理机分配的时间片,执行完时间片长度后
                 ready.get(0).setTime(ready.get(0).getTime()-time);   //该进程随机进入等待或就绪对列,否则该进程执行完毕删除
                 if(rd.nextInt(2)==0){                                 //该进程
                     ready.add(ready.get(0));
                     System.out.print("进程:"+ready.get(0).getName()+" 时间片不够进入就绪对列队尾。  ");
                 }
                  else{
                     wait.add(ready.get(0));
                     System.out.print("进程:"+ready.get(0).getName()+" 时间片不够进入等待对列队尾。  ");
                  }
             }
             else 
                System.out.print("进程:"+ready.get(0).getName()+" 执行完毕! ");

             ready.remove(0); 
          }
          //在进程执行过程中,产生随机数0或1,该随机数为1时,将等待队列中的第一个PCB加入就绪队列的对尾
          if(wait.size()>0){
             waittoready(ready,wait); 
          }
      }
      System.out.println("\n\n所有进程执行完毕!");
  }    


//基于优先数的调度算法函数
  static void call_PrevSort(LinkedList<Process> ready,LinkedList<Process> wait){
      int time=0;        //处理机分配的时间片
      Random rd=new Random();
      Process pro_hightsort;

      while(ready.size()>0 || wait.size()>0){
          process_Print(ready,wait);      //输出所有进程信息
          time=rd.nextInt(15)+5;   //随机产生时间片长度
          System.out.println("\n时间片长度: "+time);

          if(ready.size()>0){
             pro_hightsort=search_HightSort(ready);       //寻找一个优先数最高的进程

             System.out.print("进程"+pro_hightsort.getName()+"优先数最高。  ");
             if(pro_hightsort.getTime() > time){        //进程执行所需时间大于处理机分配的时间片,执行完时间片长度后
                 pro_hightsort.setTime(pro_hightsort.getTime()-time); //该进程随机进入等待或就绪对列,
                 if(rd.nextInt(2)==0){                                         //否则该进程执行完毕删除该进程
                     ready.add(pro_hightsort);
                     System.out.print("进程:"+pro_hightsort.getName()+" 时间片不够进入就绪对列队尾。  ");
                 }
                  else{
                     wait.add(pro_hightsort);
                     System.out.print("进程:"+pro_hightsort.getName()+" 时间片不够进入等待对列队尾。  ");
                  }
             }
             else 
                System.out.print("进程:"+pro_hightsort.getName()+" 执行完毕!  ");

             ready.remove(ready.indexOf(pro_hightsort)); 
          }
          //在进程执行过程中,产生随机数0或1,该随机数为1时,将等待队列中的第一个PCB加入就绪队列的对尾
          if(wait.size()>0){
             waittoready(ready,wait); 
          }
      }
      System.out.println("\n\n所有进程执行完毕!");
  } 


//最短执行时间调度算法函数

  static void call_LessTime(LinkedList<Process> ready,LinkedList<Process> wait){
      int time=0;        //处理机分配的时间片
      Random rd=new Random();
      Process pro_lesstime;
    
      while(ready.size()>0 || wait.size()>0){
     
          process_Print(ready,wait);      //输出所有进程信息
          time=rd.nextInt(15)+5;   //随机产生时间片长度
          System.out.println("\n时间片长度: "+time);

          if(ready.size()>0){
             pro_lesstime=search_LessTime(ready);
             System.out.print("进程"+pro_lesstime.getName()+"执行时间最短。  ");
             if(pro_lesstime.getTime() > time){        //进程执行所需时间大于处理机分配的时间片,执行完时间片长度后
                 pro_lesstime.setTime(pro_lesstime.getTime()-time); //该进程随机进入等待或就绪对列,
                 if(rd.nextInt(2)==0){                                         //否则该进程执行完毕删除该进程
                     ready.add(pro_lesstime);
                     System.out.print("进程:"+pro_lesstime.getName()+" 时间片不够进入就绪对列队尾。  ");
                 }
                  else{
                     wait.add(pro_lesstime);
                     System.out.print("进程:"+pro_lesstime.getName()+" 时间片不够进入等待对列队尾。  ");
                  }
             }
             else 
                System.out.print("进程:"+pro_lesstime.getName()+" 执行完毕!  ");

             ready.remove(ready.indexOf(pro_lesstime)); 
          }

       //在进程执行过程中,产生随机数0或1,该随机数为1时,将等待队列中的第一个PCB加入就绪队列的对尾
          if(wait.size()>0){
             waittoready(ready,wait); 
          }
      }
      System.out.println("\n\n所有进程执行完毕!");
  } 

//在进程执行过程中,产生随机数0或1,该随机数为1时,将等待队列中的第一个PCB加入就绪队列的对尾;
  static void waittoready(LinkedList<Process> ready,LinkedList<Process> wait){
       Random rd=new Random();
       if(rd.nextInt(2)==1){
           ready.add(wait.get(0));
           System.out.println("等待队列第一个进程: "+wait.get(0).getName()+" 进入就绪对列队尾!");
       }
       else{
           wait.add(wait.get(0));
           System.out.println("等待队列第一个进程: "+wait.get(0).getName()+" 进入等待对列队尾!");
       }
      wait.remove(0);
  }

//寻找一个所需时间最少的进程
 static Process search_LessTime(LinkedList<Process> ready){
      Process lesstime=ready.get(0);

      for(int i=1;i<ready.size();i++){
         if(lesstime.getTime()>ready.get(i).getTime())
            lesstime=ready.get(i);
      }
      return lesstime;    
  }

//寻找一个优先数最高的进程
   static Process search_HightSort(LinkedList<Process> ready){
      Process hightsort=ready.get(0);

      for(int i=1;i<ready.size();i++){
         if(hightsort.getSort()<ready.get(i).getSort())
            hightsort=ready.get(i);
      }
      return hightsort;    
   }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -