電腦作業系統的進程調度的五種演算法__演算法

來源:互聯網
上載者:User


電腦作業系統進程調度五種演算法為:1.先來先服務演算法  2.短作業優先演算法 3.高響應比優先演算法 4.時間片輪轉法  5.多級反饋隊列演算法

public class jcdu {String name;int id;int enter_time;int ser_time;jcdu(){}void setname(String aname){this.name=aname;}void setenter_time(int time){this.enter_time=time;}void setser_time(int time){this.ser_time=time;}void setid(int id){this.id=id;}String getname(){return this.name;}int getenter_time(){return this.enter_time;}int getser_time(){return this.ser_time;}int getid(){return this.id;}}

1.先來先服務演算法:主要為每次調度作業就是從後備的就緒隊列中就是選擇一個或者多個最先進入該隊列的作業。可以設定一個靜態變數,讓靜態變數逐漸遞增,用一個List容器判斷每秒中進入就緒隊列中的作業。當一個作業執行完畢,再從List容器選出第一個進入該隊列的作業。一直迴圈到所有作業執行完畢。

/*先來先服務*/  class test{public static int run_time=0;public static void main(String[] args) {    jcdu [] temp=new jcdu[5];Scanner in=new Scanner(System.in);int pro_count=0;int do_time=0;int en_time;int do_id=0;String name=null;System.out.println("請輸入進程資訊:");for(int i=0;i<5;i++){System.out.println("進程id"+i);temp[i]=new jcdu();temp[i].setid(i);System.out.print("進程名:");temp[i].setname(in.next());System.out.print("到達時間:");temp[i].setenter_time(in.nextInt());System.out.print("服務時間:");temp[i].setser_time(in.nextInt());}List <jcdu>li=new ArrayList<jcdu>();for(jcdu x:temp){li.add(x);}while(true){int j;en_time=Integer.MAX_VALUE;for(jcdu x:li){if(x.getenter_time()< en_time){      //找出一個執行進程do_id=x.getid();do_time=x.getser_time();name=x.getname();en_time=x.getenter_time();}}if(en_time>run_time){System.out.println("當前沒有進程到達");run_time++;}else{for(j=0;j<do_time;j++){             for(jcdu x:li){if(x.getenter_time()==run_time){System.out.println("進程"+x.getname()+"在第"+run_time+"秒到達");}}System.out.println("第"+run_time+"秒"+"執行進程"+name);try {Thread.currentThread().sleep(1000);}catch (InterruptedException e) {e.printStackTrace();}run_time++;}if(j==do_time){System.out.println(name+"進程執行結束");}pro_count++;for(int i=0;i<li.size();i++){if(li.get(i).getid()==do_id){li.remove(i);}}if(pro_count==5)break;}}try {Thread.currentThread().sleep(1000);}catch (InterruptedException e) {e.printStackTrace();} System.out.println("進程資訊"); show(temp);}public static void show(jcdu [] other){     System.out.printf("%-5s %-5s %-5s %-5s\n","進程id","進程名","到達時間","服務時間");   for(jcdu x:other){System.out.printf("%-5d  %-5s  %-5s  %-5s\n",x.getid(),x.getname(),x.getenter_time(),x.getser_time()); }}}

2.短作業優先演算法:主要為每次調度作業就是從後備的就緒隊列中就是選擇一個或者多個要求服務時間最短的作業。可以設定一個靜態變數,讓靜態變數逐漸遞增,用一個List容器判斷每秒中進入就緒隊列中的作業。當一個作業執行完畢,再從List容器選出服務時間最短的進入該隊列的作業。一直迴圈到所有作業執行完畢。

class test{public static int run_time=0;public static void main(String[] args) {    jcdu [] temp=new jcdu[5];Scanner in=new Scanner(System.in);int pro_count=0;int ser_time;int en_time=0;int do_id=0;String name=null;System.out.println("請輸入進程資訊:");for(int i=0;i<5;i++){System.out.println("進程id"+i);temp[i]=new jcdu();temp[i].setid(i);System.out.print("進程名:");temp[i].setname(in.next());System.out.print("到達時間:");temp[i].setenter_time(in.nextInt());System.out.print("服務時間:");temp[i].setser_time(in.nextInt());}List <jcdu>li=new ArrayList<jcdu>();for(jcdu x:temp){li.add(x);}while(true){int j;ser_time=Integer.MAX_VALUE;for(jcdu x:li){if(x.getenter_time()<=run_time && x.getser_time()< ser_time){      //找出一個執行進程do_id=x.getid();ser_time=x.getser_time();name=x.getname();en_time=x.getenter_time();}}if(en_time>run_time){System.out.println("當前沒有進程到達");run_time++;}else{for(j=0;j<ser_time;j++){             //根據執行時間 for(jcdu x:li){if(x.getenter_time()==run_time){System.out.println("進程"+x.getname()+"在第"+run_time+"秒到達");}}System.out.println("第"+run_time+"秒"+"執行進程"+name);try {Thread.currentThread().sleep(1000);}catch (InterruptedException e) {e.printStackTrace();}run_time++;}if(j==ser_time){System.out.println(name+"進程執行結束");}pro_count++;for(int i=0;i<li.size();i++){if(li.get(i).getid()==do_id){li.remove(i);}}if(pro_count==5)break;}}try {Thread.currentThread().sleep(1000);}catch (InterruptedException e) {e.printStackTrace();} System.out.println("進程資訊"); show(temp);}public static void show(jcdu [] other){     System.out.printf("%-5s %-5s %-5s %-5s\n","進程id","進程名","到達時間","服務時間");   for(jcdu x:other){System.out.printf("%-5d  %-5s  %-5s  %-5s\n",x.getid(),x.getname(),x.getenter_time(),x.getser_time()); }}}

3.高響應比優先演算法:主要為每次調度作業就是從後備的就緒隊列中就是選擇一個或者多個響應比最高的作業。可以設定一個靜態變數,讓靜態變數逐漸遞增,用一個List容器判斷每秒中進入就緒隊列中的作業,並且每秒計算該作業的響應比{(等待時間+要求服務時間)/要求服務時間}。當一個作業執行完畢,再從List容器選出響應比最高的作業。一直迴圈到所有作業執行完畢。

class test{public static int run_time=0;public static void main(String[] args) {    jcdu [] temp=new jcdu[5];Scanner in=new Scanner(System.in);int pro_count=0;int ser_time=0;int en_time=0;int do_id=0;String name=null;System.out.println("請輸入進程資訊:");for(int i=0;i<5;i++){System.out.println("進程id"+i);temp[i]=new jcdu();temp[i].setid(i);System.out.print("進程名:");temp[i].setname(in.next());System.out.print("到達時間:");temp[i].setenter_time(in.nextInt());System.out.print("服務時間:");temp[i].setser_time(in.nextInt());}List <jcdu>li=new ArrayList<jcdu>();for(jcdu x:temp){li.add(x);}while(true){int j;double wei=Double.MIN_VALUE;for(jcdu x:li){x.setweight(run_time);}for(jcdu x:li){if(x.getenter_time()<=run_time && x.getweight()>wei){      //找出一個執行進程do_id=x.getid();ser_time=x.getser_time();name=x.getname();en_time=x.getenter_time();wei=x.getweight();}}if(en_time>run_time){System.out.println("當前沒有進程到達");run_time++;}else{for(j=0;j<ser_time;j++){             //根據執行時間 for(jcdu x:li){if(x.getenter_time()==run_time){System.out.println("進程"+x.getname()+"在第"+run_time+"秒到達");}}System.out.println("第"+run_time+"秒"+"執行進程"+name);try {Thread.currentThread().sleep(1000);}catch (InterruptedException e) {e.printStackTrace();}run_time++;}if(j==ser_time){System.out.println(name+"進程執行結束");}pro_count++;for(int i=0;i<li.size();i++){if(li.get(i).getid()==do_id){li.remove(i);}}if(pro_count==5)break;}}try {Thread.currentThread().sleep(1000);}catch (InterruptedException e) {e.printStackTrace();} System.out.println("進程資訊"); show(temp);}public static void show(jcdu [] other){     System.out.printf("%-5s %-5s %-5s %-5s\n","進程id","進程名","到達時間","服務時間");   for(jcdu x:other){System.out.printf("%-5d  %-5s  %-5s  %-5s\n",x.getid(),x.getname(),x.getenter_time(),x.getser_time()); }}}

4.時間片輪轉演算法:主要為每次調度作業就是從後備的就緒隊列中就是選擇一個或者多個最先進入該隊列的作業。每次給隊列首元素分配時間片,當時間片執行完畢時,再把進程放到隊尾。一直迴圈到所有作業執行完畢。

class test{public static int run_time=0;public static void main(String[] args) {    jcdu [] temp=new jcdu[5];Scanner in=new Scanner(System.in);int pro_count=0;int en_time=0;int time_p=0;String name=null;System.out.println("請輸入進程資訊:");for(int i=0;i<5;i++){System.out.println("進程id"+i);temp[i]=new jcdu();temp[i].setid(i);System.out.print("進程名:");temp[i].setname(in.next());System.out.print("到達時間:");temp[i].setenter_time(in.nextInt());System.out.print("服務時間:");temp[i].setser_time(in.nextInt());}System.out.println("請輸入時間片的長度 :");time_p=in.nextInt();List <jcdu>li=new ArrayList<jcdu>();while(true){     int j;     int i;     int q=0;     for(i=0;i<temp.length;i++)         {     if(temp[i].getenter_time() == run_time)      //判讀是否有進程進入隊列      {        System.out.println(run_time+"進程"+temp[i].getname()+"進入就緒隊列");        li.add(temp[i]);          }                 }     if(li.isEmpty())         {       System.out.println(run_time+"沒有可執行性進程");         }     else         {     jcdu te=li.get(0);     li.remove(0);     for(j=0;j<time_p;j++)            {        name=te.getname();System.out.println("第"+run_time+"秒"+"執行進程"+name);te.setdoingtime();try {Thread.currentThread().sleep(1000);}catch (InterruptedException e) {e.printStackTrace();}if(te.com())    {pro_count++;System.out.println("第"+run_time+"秒"+"進程"+name+"執行結束");if(li.isEmpty())    {System.out.println("就緒隊列為空白");for(i=0;i<temp.length;i++)            {     if(temp[i].getenter_time() == run_time)      //判讀是否有進程進入隊列         {        System.out.println(run_time+"進程"+temp[i].getname()+"進入就緒隊列");        li.add(temp[i]);             }                   }    }else   {te=li.get(0);li.remove(0);   }    }run_time++;System.out.print("就緒隊列:");for(jcdu x:li){   System.out.print(x.getname()+" ");   }System.out.println(" ");            }     if(!te.com())     li.add(te);     System.out.println("時間片執行完畢");    System.out.println();         }     if(pro_count==5)    break;}                      /*int j;int q=0;double wei=Double.MIN_VALUE;en_time=Integer.MAX_VALUE;for(int i=0;i<temp.length;i++){if(temp[i].getenter_time() == run_time){      //判讀是否有進程進入隊列        for(jcdu x:li){   if(x.getname()!=temp[i].getname())           q++;   }        if(q==li.size()){        li.add(temp[i]);        }       }    System.out.print("就緒隊列:");for(jcdu x:li){   System.out.print(x.getname()+" ");   }System.out.println(" ");if(li.isEmpty()){    System.out.println("當前就緒隊列為空白");run_time++;    }else{jcdu te=li.get(0);li.remove(0);                     //取出當前執行的隊首元素    for(j=0;j<time_p;j++){name=te.getname();System.out.println("第"+run_time+"秒"+"執行進程"+name);try {Thread.currentThread().sleep(1000);}catch (InterruptedException e) {e.printStackTrace();}te.setdoingtime();            //已經執行的時間    if(te.com()){                 //已經執行完畢   重新選取隊首元素   System.out.println(name+"進程執行結束");   pro_count++;   if(li.isEmpty()){        System.out.println("就緒隊列已空");            }       else{          te=li.get(0);          li.remove(0);         }   }    run_time++;    for(int pi=0;pi<temp.length;pi++){if(temp[pi].getenter_time() == run_time){      //判讀下一秒是否有進程進入隊列        System.out.println("第"+run_time+"秒到達"+temp[pi].getname());li.add(temp[pi]);}         }       }    if(!te.com())                //如果時間片結束進程還沒有執行行結束從新放入隊尾元素     li.add(te);         }  if(pro_count==5)    break;       } }*/}public static void show(jcdu [] other){     System.out.printf("%-5s %-5s %-5s %-5s\n","進程id","進程名","到達時間","服務時間");   for(jcdu x:other){System.out.printf("%-5d  %-5s  %-5s  %-5s\n",x.getid(),x.getname(),x.getenter_time(),x.getser_time());     }    }}

5.多級反饋隊列演算法:設定多個隊列,每個隊列的時間片長度不同,當隊列1中作業未執行完畢時,在放入二級隊列依次類推。一直迴圈到所有作業執行完畢。

class test{public static int run_time=0;    //已耗用時間static int pro_count=0;          //進程完成數int ser_time=0;                  //要求服務時間int en_time;                     //到達時間String name=null;    staticjcdu [] temp={    new jcdu("A",1,0,3),new jcdu("B",2,2,6),    new jcdu("C",3,4,4),new jcdu("D",4,6,5),    new jcdu("E",5,8,2)};    public static void main(String[] args) {duojiqueue();}public static void duojiqueue(){List <jcdu> li1=new ArrayList<jcdu> ();List <jcdu> li2=new ArrayList<jcdu> ();Map<Integer,List <jcdu> > tmap=new HashMap<Integer,List <jcdu>>();      tmap.put(2,li1);    tmap.put(4,li2);    while(pro_count!=5){    for(int i=0;i<temp.length;i++)    {    if(temp[i].getenter_time() == run_time)      //判讀是否有進程進入隊列    {    System.out.println(run_time+"秒進程"+temp[i].getname()+"進入就緒隊列1");    li1.add(temp[i]);    }        }    Set<Integer> keys=tmap.keySet();      Iterator<Integer> i=keys.iterator();      while(i.hasNext()){      int key=i.next();      List <jcdu> li=tmap.get(key);      System.out.print("就緒隊列"+key/2);      if(!li.isEmpty())           {        for(jcdu r:li)        System.out.print(r.getname());           }      System.out.println();      }    while(!li1.isEmpty()){      jcdu r=li1.get(0);      li1.remove(r);      for(int j=0;j<2;j++)      {      System.out.println("目前時間片執行進程"+r.getname());      r.addser_time();       try {Thread.currentThread().sleep(1000);}catch (InterruptedException e) {e.printStackTrace();}      if(r.isequ()){      System.out.println("進程執行結束"+r.getname());      pro_count++;      break;      }       run_time++;       for(int w=0;w<temp.length;w++)          {      if(temp[w].getenter_time() == run_time)      //判讀是否有進程進入隊列          {      System.out.println(run_time+"進程"+temp[w].getname()+"進入就緒隊列1");      li1.add(temp[w]);          }      }      }      if(!r.isequ()){      li2.add(r);      }      keys=tmap.keySet();      i=keys.iterator();      while(i.hasNext()){      int key=i.next();      List <jcdu> li=tmap.get(key);       System.out.print("就緒隊列"+key/2);      if(!li.isEmpty())           {        for(jcdu rw:li)        System.out.print(rw.getname());           }      System.out.println();      }      }   while(!li2.isEmpty()){      jcdu r=li2.get(0);      li2.remove(r);      for(int j=0;j<4;j++)      {      System.out.println("目前時間片執行進程"+r.getname());      r.addser_time();       try {Thread.currentThread().sleep(1000);}catch (InterruptedException e) {e.printStackTrace();}      if(r.isequ()){      System.out.println("進程執行結束"+r.getname());      pro_count++;      break;      }       run_time++;       for(int w=0;w<temp.length;w++)          {      if(temp[w].getenter_time() == run_time)      //判讀是否有進程進入隊列          {      System.out.println(run_time+"進程"+temp[w].getname()+"進入就緒隊列1");      li1.add(temp[w]);          }      }      }            if(!r.isequ()){      li2.add(r);      }      keys=tmap.keySet();      i=keys.iterator();      while(i.hasNext()){      int key=i.next();      List <jcdu> li=tmap.get(key);      System.out.print("就緒隊列"+key/2);      if(!li.isEmpty())           {        for(jcdu rw:li)        System.out.print(rw.getname());           }      System.out.println();      }      }            }    System.out.println(run_time);   }}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.