操作系统中的几种调度算法(JAVA版)

  1 import java.text.DecimalFormat;
  2 import java.util.Arrays;
  3 import java.util.Scanner;
  4
  5 /*
  6  * 作者:Chensx1020
  7  * 时间:2016-12-11
  8  * 功能:CPU调度算法
  9  *         1)先到先服务调度算法(FCFS)
 10  *         2)最短作业优先调度算法,非抢占式(SJF)
 11  *         3)优先级调度算法(PSA)
 12  *         4)轮转法调度算法(RR)
 13  *         5)最高响应比调度算法(HRR)
 14  *         6)最短作业优先调度算法,抢占式(SJF)
 15  */
 16
 17 public class CPU {
 18     //排序方法
 19     public static String whichComp="FCFS";
 20     //时间片
 21     public static int timeSlice=4;
 22
 23     //进程类...............................................................
 24     public static class MyProcess implements Comparable<MyProcess> {
 25
 26         private String name;    //进程名字
 27         private int arrive;    //到达时间
 28         private int work;    //区间时间(服务时间)
 29         private int rWork;    //还需时间
 30         private int priority;    //优先级
 31         private int begin;    //开始时间
 32         private double hrr;    //响应比
 33         private boolean flag;    //标记该进程是否执行
 34
 35         public MyProcess(String name){
 36             this.name = name;
 37             this.flag = false;
 38         }
 39
 40         public void setArrive(int arrive){
 41             this.arrive = arrive;
 42         }
 43         public void setWork(int work){
 44             this.work = work;
 45         }
 46         public void setRwork(int rWork){
 47             this.rWork = rWork;
 48         }
 49         public void setPriority(int priority){
 50             this.priority = priority;
 51         }
 52         public void setBegin(int begin){
 53             this.begin = begin;
 54         }
 55         public void setHrr(){
 56             this.hrr = (this.begin-this.arrive)*1.0/this.work + 1;
 57         }
 58         public void setHrr(double hrr){
 59             this.hrr = hrr;
 60         }
 61         public void setFlag(){
 62             this.flag = true;
 63         }
 64
 65         public String getName(){
 66             return this.name;
 67         }
 68         public int getArrive(){
 69             return this.arrive;
 70         }
 71         public int getWork(){
 72             return this.work;
 73         }
 74         public int getRwork(){
 75             return this.rWork;
 76         }
 77         public int getPriority(){
 78             return this.priority;
 79         }
 80         public int getBegin(){
 81             return this.begin;
 82         }
 83         public double getHrr(){
 84             return this.hrr;
 85         }
 86         public boolean getFlag(){
 87             return this.flag;
 88         }
 89
 90         @Override
 91         public int compareTo(MyProcess o) {
 92             if(whichComp.equals("FCFS")){
 93                 if(this.arrive>o.arrive)
 94                     return 1;
 95                 else if(this.arrive<o.arrive)
 96                     return -1;
 97                 else
 98                     return this.work-o.work;
 99             }
100             else if(whichComp.equals("SJF")){
101                 if(this.work>o.work)
102                     return 1;
103                 else if(this.work<o.work)
104                     return -1;
105                 else
106                     return this.arrive-o.arrive;
107             }
108             else if(whichComp.equals("SJFS")){
109                 if(this.rWork>o.rWork)
110                     return 1;
111                 else if(this.rWork<o.rWork)
112                     return -1;
113                 else
114                     return this.arrive-o.arrive;
115
116             }
117             else if(whichComp.equals("PSA")){
118                 if(this.priority>o.priority)
119                     return 1;
120                 else if(this.priority<o.priority)
121                     return -1;
122                 else
123                     return this.arrive-o.arrive;
124             }
125             else if(whichComp.equals("HRR")){
126                 if(this.begin>o.begin)
127                     return 1;
128                 else if(this.begin<o.begin)
129                     return -1;
130                 else{
131                     if(this.hrr < o.hrr)
132                         return 1;
133                     else if(this.hrr > o.hrr)
134                         return -1;
135                     else{
136                         return this.arrive-o.arrive;
137 //                        if(this.arrive>o.arrive)
138 //                            return 1;
139 //                        else if(this.arrive<o.arrive)
140 //                            return -1;
141 //                        else
142 //                            return this.work-o.work;
143                     }
144                 }
145             }
146             else{
147                 return 0;
148             }
149         }
150     }
151
152
153     //FCFS类...............................................................
154     public static class FCFS{
155
156         private int count;
157         private String temp;
158
159         public FCFS(MyProcess test[]){
160             Arrays.sort(test);
161
162             count = test[0].getArrive();
163             temp = "";
164
165             int length = test.length;
166
167             int wait = 0;    //总等待时间
168             int cycle = 0;    //总周转时间
169
170             System.out.print("------------------------------------------------------------------");
171             System.out.println("------------------------------------------------------------------");
172             System.out.println("先到先服务调度算法的结果为:");
173             System.out.println("进程名字\t到达时间\t服务时间\t开始时间\t结束时间\t等待时间\t"
174                     + "周转时间\t带权周转时间\t");
175
176             for(int i=0; i<length-1; ++i){
177
178                 System.out.println(test[i].getName()+"\t"
179                         +test[i].getArrive()+"\t"
180                         +test[i].getWork()+"\t"
181                         +count+"\t"
182                         +(count+test[i].getWork())+"\t"
183                         +(count-test[i].getArrive())+"\t"
184                         +(count-test[i].getArrive()+test[i].getWork())+"\t"
185                         +(count-test[i].getArrive()+test[i].getWork())*1.0/test[i].getWork()+"\t"
186                         );
187
188                 wait += count-test[i].getArrive();
189                 cycle += count-test[i].getArrive()+test[i].getWork();
190
191                 count += test[i].getWork();
192
193                 if(count < test[i+1].getArrive())
194                     count = test[i+1].getArrive();
195                 temp += test[i].getName()+"   ";
196
197             }
198
199             System.out.println(test[length-1].getName()+"\t"
200                     +test[length-1].getArrive()+"\t"
201                     +test[length-1].getWork()+"\t"
202                     +count+"\t"
203                     +(count+test[length-1].getWork())+"\t"
204                     +(count-test[length-1].getArrive())+"\t"
205                     +(count-test[length-1].getArrive()+test[length-1].getWork())+"\t"
206                     +(count-test[length-1].getArrive()+test[length-1].getWork())*1.0/test[length-1].getWork()+"\t"
207                     );
208
209             wait += count-test[length-1].getArrive();
210             cycle += count-test[length-1].getArrive()+test[length-1].getWork();
211
212             temp += test[test.length-1].getName()+"   ";
213
214             System.out.println("\n所以最后先到先服务调度算法执行的顺序为:" + temp);
215             System.out.println("平均等待时间为:" + wait*1.0/length + ",平均周转时间为:" + cycle*1.0/length);
216         }
217
218     }
219
220
221     //SJF类非抢占式...............................................................
222     public static class SJF{
223
224         private int count;
225         private String temp;
226
227         public SJF(MyProcess test[]){
228             Arrays.sort(test);
229
230             count = test[0].getArrive();
231             temp = "";
232
233             int length = test.length;
234
235             int wait = 0;    //总等待时间
236             int cycle = 0;    //总周转时间
237
238             System.out.print("------------------------------------------------------------------");
239             System.out.println("------------------------------------------------------------------");
240             System.out.println("最短作业优先调度算法非抢占式的结果为:");
241             System.out.println("进程名字\t到达时间\t服务时间\t开始时间\t结束时间\t等待时间\t"
242                     + "周转时间\t带权周转时间\t");
243
244             for(int i=0; i<length-1; ++i){
245                 System.out.println(test[i].getName()+"\t"
246                         +test[i].getArrive()+"\t"
247                         +test[i].getWork()+"\t"
248                         +count+"\t"
249                         +(count+test[i].getWork())+"\t"
250                         +(count-test[i].getArrive())+"\t"
251                         +(count-test[i].getArrive()+test[i].getWork())+"\t"
252                         +(count-test[i].getArrive()+test[i].getWork())*1.0/test[i].getWork()+"\t"
253                         );
254
255                 wait += count-test[i].getArrive();
256                 cycle += count-test[i].getArrive()+test[i].getWork();
257
258                 count += test[i].getWork();
259
260                 if(count < test[i+1].getArrive())
261                     count = test[i+1].getArrive();
262                 temp += test[i].getName()+"   ";
263
264             }
265
266             System.out.println(test[length-1].getName()+"\t"
267                     +test[length-1].getArrive()+"\t"
268                     +test[length-1].getWork()+"\t"
269                     +count+"\t"
270                     +(count+test[length-1].getWork())+"\t"
271                     +(count-test[length-1].getArrive())+"\t"
272                     +(count-test[length-1].getArrive()+test[length-1].getWork())+"\t"
273                     +(count-test[length-1].getArrive()+test[length-1].getWork())*1.0/test[length-1].getWork()+"\t"
274                     );
275
276             wait += count-test[length-1].getArrive();
277             cycle += count-test[length-1].getArrive()+test[length-1].getWork();
278
279             temp += test[test.length-1].getName()+"   ";
280
281             System.out.println("\n所以最后最短作业优先调度算法非抢占式执行的顺序为:" + temp);
282             System.out.println("平均等待时间为:" + wait*1.0/length + ",平均周转时间为:" + cycle*1.0/length);
283         }
284
285     }
286
287
288     //SJF类抢占式...............................................................
289     public static class SJFS{
290
291         private int count;
292         private String temp;    //执行的顺序
293         private int flag = 0;    //计数,用于判断是否所有进程执行完毕
294
295         public SJFS(MyProcess test[]){
296
297             int wait = 0;    //总等待时间
298             int cycle = 0;    //总周转时间
299
300             System.out.print("------------------------------------------------------------------");
301             System.out.println("------------------------------------------------------------------");
302             System.out.println("最短作业优先调度算法抢占式的结果为:");
303             System.out.println("进程名字\t到达时间\t区间时长\t开始时间\t结束时间\t剩余服务时间\t等待时间\t"
304                     + "周转时间\t带权周转时间\t");
305
306             int length = test.length;    //长度
307
308             whichComp="FCFS";
309             Arrays.sort(test);    //按照进程的到达时间排序
310             count = test[0].getArrive();    //count的值为程序最先到达的进程的到达时间
311
312             whichComp="SJFS";
313             Arrays.sort(test);     //所有进程按照剩余服务时间的长短排序
314
315             String lastName = "";    //上一次执行的进程的名字
316             for(int i=0; i<length; ++i){
317                 if(test[i].getArrive()<=count){
318                     lastName = test[i].getName();
319                     System.out.print(test[i].getName() + "\t"
320                             + test[i].getArrive() + "\t"
321                             + test[i].getWork() + "\t"
322                             + count + "\t");
323                     temp = test[i].getName()+"   ";
324                     break;
325                 }
326             }
327
328             boolean done = false;
329
330             while(true){
331                 done = false;
332                 ++count;
333
334                 for(int j=0; j<length; ++j){
335                     if(test[j].getName().equals(lastName)){
336                         test[j].setRwork(test[j].getRwork()-1);    //剩余时间-1
337                         if(test[j].getRwork() == 0){
338                             ++flag;
339                             test[j].setRwork(999999999);
340                             System.out.println(count + "\t"
341                                     + "0\t\t"
342                                     + (count-test[j].getWork()-test[j].getArrive()) + "\t"    //等待时间
343                                     + (count-test[j].getArrive()) + "\t"                        //周转时间
344                                     + ((count-test[j].getArrive())*1.0/test[j].getWork()) + "\t" //带权周转
345                                     );
346                             wait += count-test[j].getWork()-test[j].getArrive();
347                             cycle += count-test[j].getArrive();
348                             done = true;
349                         }
350                         break;
351                     }
352                 }
353
354                 if(flag==length){
355                     break;
356                 }
357
358                 Arrays.sort(test);     //所有进程按照剩余服务时间的长短重新排序
359
360                 for(int i=0; i<length; ++i){
361                     if(test[i].getArrive()<=count){
362                         if(lastName.equals(test[i].getName())){
363 //                            System.out.println(test[i].getName());
364                         }
365                         else{
366                             for(int j=0; j<length; ++j){
367                                 if(test[j].getName().equals(lastName)){
368                                     if(!done){
369                                         System.out.println(count + "\t"
370                                                 + test[j].getRwork()+ "\t\t"
371                                                 + "未执行完\t" + "未执行完\t" + "未执行完\t");
372                                     }
373                                 }
374                             }
375
376                             lastName = test[i].getName();
377
378                             System.out.print(test[i].getName() + "\t"
379                                     + test[i].getArrive() + "\t"
380                                     + test[i].getWork() + "\t"
381                                     + count + "\t");
382                             temp += test[i].getName()+"   ";
383                         }
384                         break;
385                     }
386                 }
387
388             }
389
390             System.out.println("\n所以最后最短作业优先调度算法抢占式执行的顺序为:" + temp);
391             System.out.println("平均等待时间为:" + wait*1.0/length + ",平均周转时间为:" + cycle*1.0/length);
392
393         }
394
395     }
396
397
398     //PSA类...............................................................
399     public static class PSA{
400
401         private int count;
402         private String temp;
403
404         public PSA(MyProcess test[]){
405             Arrays.sort(test);
406
407             count = test[0].getArrive();
408             temp = "";
409
410             int length = test.length;
411
412             int wait = 0;    //总等待时间
413             int cycle = 0;    //总周转时间
414
415             System.out.print("------------------------------------------------------------------");
416             System.out.println("------------------------------------------------------------------");
417             System.out.println("优先级调度算法的结果为:");
418             System.out.println("进程名字\t到达时间\t服务时间\t优先级\t开始时间\t结束时间\t等待时间\t"
419                     + "周转时间\t带权周转时间\t");
420
421             for(int i=0; i<length-1; ++i){
422                 System.out.println(test[i].getName()+"\t"
423                         +test[i].getArrive()+"\t"
424                         +test[i].getWork()+"\t"
425                         +test[i].getPriority()+"\t"
426                         +count+"\t"
427                         +(count+test[i].getWork())+"\t"
428                         +(count-test[i].getArrive())+"\t"
429                         +(count-test[i].getArrive()+test[i].getWork())+"\t"
430                         +(count-test[i].getArrive()+test[i].getWork())*1.0/test[i].getWork()+"\t"
431                         );
432
433                 wait += count-test[i].getArrive();
434                 cycle += count-test[i].getArrive()+test[i].getWork();
435
436                 count += test[i].getWork();
437
438                 if(count < test[i+1].getArrive())
439                     count = test[i+1].getArrive();
440                 temp += test[i].getName()+"   ";
441
442             }
443
444             System.out.println(test[length-1].getName()+"\t"
445                     +test[length-1].getArrive()+"\t"
446                     +test[length-1].getWork()+"\t"
447                     +test[length-1].getPriority()+"\t"
448                     +count+"\t"
449                     +(count+test[length-1].getWork())+"\t"
450                     +(count-test[length-1].getArrive())+"\t"
451                     +(count-test[length-1].getArrive()+test[length-1].getWork())+"\t"
452                     +(count-test[length-1].getArrive()+test[length-1].getWork())*1.0/test[length-1].getWork()+"\t"
453                     );
454
455             wait += count-test[length-1].getArrive();
456             cycle += count-test[length-1].getArrive()+test[length-1].getWork();
457
458             temp += test[test.length-1].getName()+"   ";
459
460             System.out.println("\n所以最后优先级调度算法执行的顺序为:" + temp);
461             System.out.println("平均等待时间为:" + wait*1.0/length + ",平均周转时间为:" + cycle*1.0/length);
462         }
463
464     }
465
466
467     //HRR类...............................................................
468     public static class HRR{
469
470         private int count;
471         private String temp;
472
473         public HRR(MyProcess test[], MyProcess tests[]){
474
475             DecimalFormat df = new DecimalFormat("#.###");     //小数保留三位小数
476
477             Arrays.sort(tests);
478
479             count = tests[0].getBegin();
480             temp = "";
481
482             int length = test.length;
483
484             int wait = 0;    //总等待时间
485             int cycle = 0;    //总周转时间
486
487             System.out.print("------------------------------------------------------------------");
488             System.out.println("------------------------------------------------------------------");
489             System.out.println("最高响应比调度算法的结果为:");
490
491             for(int tur = 1; tur<=length; ++tur){
492                 System.out.println("\n正在执行第"+tur+"个进程:"+tests[0].getName());
493                 System.out.println("进程名字\t到达时间\t服务时间\t响应比\t开始时间\t结束时间\t等待时间\t"
494                         + "周转时间\t带权周转时间\t");
495
496                 for(int i=0; i<length; ++i) {
497
498                     if(test[i].getFlag()){    //已执行
499                         System.out.println(test[i].getName()+"\t"
500                                 +test[i].getArrive()+"\t"
501                                 +test[i].getWork()+"\t"
502                                 +"已执行完\t"
503                                 +test[i].getBegin()+"\t"
504                                 +(test[i].getBegin()+test[i].getWork())+"\t"
505                                 +(test[i].getBegin()-test[i].getArrive())+"\t"
506                                 +(test[i].getBegin()-test[i].getArrive()+test[i].getWork())+"\t"
507                                 +df.format((test[i].getBegin()-test[i].getArrive()+test[i].getWork())*1.0/test[i].getWork())+"\t"
508                                 );
509                         continue;
510                     }
511
512                     else if(test[i].getArrive()>count){    //未到达
513                         System.out.println(test[i].getName()+"\t"
514                                 +test[i].getArrive()+"\t"
515                                 +test[i].getWork()+"\t"
516                                 +"未到达\t"
517                                 +"未到达\t"
518                                 +"未到达\t"
519                                 +"未到达\t"
520                                 +"未到达\t"
521                                 +"未到达\t"
522                                 );
523                         continue;
524                     }
525
526                     else{
527                         //执行该进程
528                         if(test[i].getName().equals(tests[0].getName())){
529                             System.out.println(test[i].getName()+"\t"
530                                     +test[i].getArrive()+"\t"
531                                     +test[i].getWork()+"\t"
532                                     +df.format(test[i].getHrr())+"\t"
533                                     +test[i].getBegin()+"\t"
534                                     +(test[i].getBegin()+test[i].getWork())+"\t"
535                                     +(test[i].getBegin()-test[i].getArrive())+"\t"
536                                     +(test[i].getBegin()-test[i].getArrive()+test[i].getWork())+"\t"
537                                     +df.format((test[i].getBegin()-test[i].getArrive()+test[i].getWork())*1.0/test[i].getWork())+"\t"
538                                     );
539
540                             wait += test[i].getBegin()-test[i].getArrive();
541                             cycle += test[i].getBegin()-test[i].getArrive()+test[i].getWork();
542                             test[i].setFlag();
543                             tests[0].setFlag();
544                         }
545
546                         else{
547                             System.out.println(test[i].getName()+"\t"
548                                     +test[i].getArrive()+"\t"
549                                     +test[i].getWork()+"\t"
550                                     +df.format(test[i].getHrr())+"\t"
551                                     +"未开始\t"
552                                     +"未开始\t"
553                                     +"未开始\t"
554                                     +"未开始\t"
555                                     +"未开始\t"
556                                     );
557                         }
558
559                     }
560                 }
561
562                 int count1=count+tests[0].getWork();
563
564                 for(int j=tests.length-1; j>=1; --j){
565                     if(tests[j].getFlag()){
566                         ;
567                     }
568                     else{
569                         if(count1 >= tests[j].getArrive()){    //进程已到
570                             tests[j].setBegin(count1);
571                             int x;
572                             for(x=0; x<length; ++x){
573                                 if(tests[j].getName().equals(test[x].getName()))
574                                     break;
575                             }
576                             test[x].setBegin(count1);
577                             tests[j].setHrr();
578                             test[x].setHrr();
579                             count = count1;
580                         }
581                         else{
582                             count = tests[j].getBegin();
583                         }
584                     }
585                 }
586
587                 temp += tests[0].getName()+"   ";
588
589                 //改变执行过的进程数据,使再次排序时排在未执行数据的后面
590                 tests[0].setArrive(999999999);
591                 tests[0].setBegin(999999999);
592                 tests[0].setHrr(-1.0);
593
594                 Arrays.sort(tests);    //重新排序
595
596             }
597
598             System.out.println("\n所以最后最高响应比调度算法执行的顺序为:" + temp);
599             System.out.println("平均等待时间为:" + wait*1.0/length + ",平均周转时间为:" + cycle*1.0/length);
600         }
601
602     }
603
604
605     //RR类...............................................................
606     public static class RR{
607
608         private int count;
609         private String temp;
610
611         public RR(MyProcess test[]){
612
613             count = 0;
614             temp = "";
615
616             int length = test.length;
617
618             int wait = 0;    //总等待时间
619             int cycle = 0;    //总周转时间
620
621             int tur = 1;    //第几趟
622
623             System.out.print("------------------------------------------------------------------");
624             System.out.println("------------------------------------------------------------------");
625             System.out.println("轮转法调度算法的结果为:");
626             System.out.println("第"+tur+"趟结果\n进程名字\t到达时间\t服务时间\t开始时间\t结束时间\t剩余所需服务时间\t"
627                     + "等待时间\t周转时间\t带权周转时间\t");
628
629             int tempCount=0;    //记录是否还有进程未执行完
630
631             int i=0;
632
633             while(true){
634
635                 if(test[i].getRwork()>timeSlice){
636
637                     test[i].setRwork(test[i].getRwork()-timeSlice);
638
639                     System.out.println(test[i].getName()+"\t"
640                             +test[i].getArrive()+"\t"
641                             +test[i].getWork()+"\t"
642                             +count+"\t"
643                             +(count+timeSlice)+"\t"
644                             +test[i].getRwork()+"\t\t"
645                             +"未执行完\t"
646                             +"未执行完\t"
647                             +"未执行完\t"
648                             );
649
650                     count += timeSlice;
651                     temp += test[i].getName()+"  ";
652
653                     ++i;
654                     if(i==length){
655                         i=0;
656                         ++tur;
657                         System.out.println("第"+tur+"趟结果\n进程名字\t到达时间\t服务时间\t开始时间\t结束时间\t"
658                                 + "剩余所需服务时间\t等待时间\t周转时间\t带权周转时间\t");
659                     }
660                 }
661
662                 else if(test[i].getRwork()>0){
663
664                     System.out.println(test[i].getName()+"\t"
665                             +test[i].getArrive()+"\t"
666                             +test[i].getWork()+"\t"
667                             +count+"\t"
668                             +(count+test[i].getRwork())+"\t"
669                             +"0\t\t"
670                             +(count+test[i].getRwork()-test[i].getWork()-test[i].getArrive())+"\t"
671                             +(count+test[i].getRwork()-test[i].getArrive())+"\t"
672                             +(count+test[i].getRwork()-test[i].getArrive())*1.0/test[i].getWork()+"\t"
673                             );
674
675                     wait += count+test[i].getRwork()-test[i].getWork()-test[i].getArrive();
676                     cycle += count+test[i].getRwork()-test[i].getArrive();
677
678                     count += test[i].getRwork();
679                     temp += test[i].getName()+"  ";
680
681                     test[i].setRwork(0);
682
683                     ++i;
684                     if(i==length){
685                         i=0;
686                         ++tur;
687                         System.out.println("第"+tur+"趟结果\n进程名字\t到达时间\t服务时间\t开始时间\t结束时间\t"
688                                 + "剩余所需服务时间\t等待时间\t周转时间\t带权周转时间\t");
689                     }
690
691                     ++tempCount;
692                     if(tempCount == length)
693                         break;
694                 }
695                 else{
696                     ++i;
697                     if(i==length){
698                         i=0;
699                         ++tur;
700                         System.out.println("第"+tur+"趟结果\n进程名字\t到达时间\t服务时间\t开始时间\t结束时间\t"
701                                 + "剩余所需服务时间\t等待时间\t周转时间\t带权周转时间\t");
702                     }
703                     continue;
704                 }
705             }
706
707             System.out.println("\n所以最后轮转法调度算法执行的顺序为:" + temp);
708             System.out.println("平均等待时间为:" + wait*1.0/length + ",平均周转时间为:" + cycle*1.0/length);
709         }
710
711     }
712
713
714     //主函数................................................................
715     public static void main(String[] args) {
716         Scanner input = new Scanner(System.in);
717
718         while(true){
719             int n;    //进程数
720             while(true){
721                 try{
722                     System.out.print("输入进程个数:");
723                     n = input.nextInt();
724                     break;
725                 } catch(Exception e){
726                     System.out.println("输入不合法,请重新输入!");
727                     input.nextLine();
728                 }
729             }
730             MyProcess test[] = new MyProcess[n];    //进程数组
731             MyProcess tests[] = new MyProcess[n];    //临时进程数组(HRR用)
732
733             System.out.println("您想执行何种操作:");
734             System.out.println("1.FCFS(先到先服务调度算法)");
735             System.out.println("2.SJF(最短作业优先调度算法,非抢占式)");
736             System.out.println("3.PSA(优先级调度算法)");
737             System.out.println("4.RR(轮转法调度算法)");
738             System.out.println("5.HRR(最高响应比调度算法)");
739             System.out.println("6.SJF(最短作业优先调度算法,抢占式)");
740             System.out.println("7.退出");
741             int which;
742
743             try{
744                 which = input.nextInt();
745             } catch(Exception e){
746                 System.out.println("输入不合法,请重新输入!");
747                 input.nextLine();
748                 continue;
749             }
750
751             //FCFS
752             if(which == 1){
753                 for(int i=0; i<n; ++i){
754                     test[i] = new MyProcess("P"+(i+1));
755                     System.out.print("请输入P" + (i+1) + "的到达时间和服务时间:");
756                     test[i].setArrive(input.nextInt());
757                     test[i].setWork(input.nextInt());
758                 }
759                 whichComp = "FCFS";
760                 new FCFS(test);
761             }
762             //SJF,非抢占式
763             else if(which == 2){
764                 for(int i=0; i<n; ++i){
765                     test[i] = new MyProcess("P"+(i+1));
766                     System.out.print("请输入P" + (i+1) + "的到达时间和服务时间:");
767                     test[i].setArrive(input.nextInt());
768                     test[i].setWork(input.nextInt());
769                 }
770                 whichComp = "SJF";
771                 new SJF(test);
772             }
773             //PSA
774             else if(which == 3){
775                 for(int i=0; i<n; ++i){
776                     test[i] = new MyProcess("P"+(i+1));
777                     System.out.print("请输入P" + (i+1) + "的到达时间和服务时间和优先级:");
778                     test[i].setArrive(input.nextInt());
779                     test[i].setWork(input.nextInt());
780                     test[i].setPriority(input.nextInt());
781                 }
782                 whichComp = "PSA";
783                 new PSA(test);
784             }
785             //RR
786             else if(which == 4){
787                 System.out.print("请输入时间片的大小:");
788                 timeSlice = input.nextInt();
789
790                 for(int i=0; i<n; ++i){
791                     test[i] = new MyProcess("P"+(i+1));
792                     System.out.print("请输入P" + (i+1) + "的服务时间(剩余时间):");
793                     test[i].setWork(input.nextInt());
794                     test[i].setRwork(test[i].getWork());
795                 }
796                 whichComp = "RR";
797                 new RR(test);
798             }
799             //HRR
800             else if(which == 5){
801                 for(int i=0; i<n; ++i){
802                     test[i] = new MyProcess("P"+(i+1));
803                     tests[i] = new MyProcess("P"+(i+1));
804                     System.out.print("请输入P" + (i+1) + "的到达时间和服务时间:");
805                     int a = input.nextInt();
806                     test[i].setArrive(a);
807                     tests[i].setArrive(a);
808                     int b = input.nextInt();
809                     test[i].setWork(b);
810                     tests[i].setWork(b);
811                     //设置开始时间和响应比
812                     test[i].setBegin(a);
813                     test[i].setHrr();
814                     tests[i].setBegin(a);
815                     tests[i].setHrr();
816                 }
817                 whichComp = "HRR";
818                 new HRR(test,tests);
819             }
820             //SJF,抢占式
821             else if(which == 6){
822                 for(int i=0; i<n; ++i){
823                     test[i] = new MyProcess("P"+(i+1));
824                     System.out.print("请输入P" + (i+1) + "的到达时间和服务时间:");
825                     test[i].setArrive(input.nextInt());
826                     test[i].setWork(input.nextInt());
827                     test[i].setRwork(test[i].getWork());    //设置剩余时间
828                 }
829                 whichComp = "SJFS";
830                 new SJFS(test);
831             }
832             else if(which == 7){
833                 System.out.println("程序结束!");
834                 break;
835             }
836             else {
837                 System.out.println("输入不合法,请重新输入!");
838             }
839
840             System.out.print("------------------------------------------------------------------");
841             System.out.println("------------------------------------------------------------------");
842             System.out.print("------------------------------------------------------------------");
843             System.out.println("------------------------------------------------------------------\n\n");
844         }
845
846         input.close();
847
848     }
849
850 }

部分运行结果:

相同数据的最高响应比结果为

时间: 2024-09-30 13:15:41

操作系统中的几种调度算法(JAVA版)的相关文章

操作系统中常用的进程调度算法

操作系统中对进程的调度算法大体上可以分为三类: 1.先来先服务算法 2.优先级法 3.时间片轮法 接下来简要介绍一下这三类算法. 一.先来先服务算法 (FCFS:    First Come First Service) 原理: 这是最简单的一种调度算法,用到了队列的思想.每次调度都从进程就绪队列中选择队首的进程(也就是最先进入队列的进程)进行调度. 直到进程的执行被阻塞,或进程结束,再调用下一个进程,依然是从队列中选择队首的进程的. 这里要注意,上文我说的队列中的进程实际上是进程的PCB,因为

操作系统中常见的进程调度算法

1.      先来先服务(FCFS)调度算法 FCFS调度算法是一种最简单的调度算法,该调度算法既可以用于作业调度也可以用于进程调度.在作业调度中,算法每次从后备作业队列中选择最先进入该队列的一个或几个作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列. 在进程调度中,FCFS调度算法每次从就绪队列中选择最先进入该队列的进程,将处理机分配给它,使之投入运行,直到完成或因某种原因而阻塞时才释放处理机. FCFS调度算法属于不可剥夺算法.从表面上看,它对所有作业都是公平的,但若一个长作业

删除单链表中重复的值(Java版)

题目:删除带头结点的单链表中重复值的元素(即让每种值的元素只有一个) 解题思路: 用一个动态辅助存储数组,每次要向辅助数组中放入元素时,让辅助数组的长度加1,最长时与单链表一样长,设一个指针p,让它指向头结点,从单链表中第一个元素开始,将它的值放入辅助数组中,然后依次访问单链表后面的元素,用该元素的值与数组中所有已经被赋值的元素的值进行比较,如果不等于数组中任何元素的值,那么让p的next指向该结点的next指针,删除该结点元素,否则令p指向p的next指针,并将当前访问的节点元素的值依次放入辅

AKKA文档(java版)

目前我正在翻译AKKA官网文档.翻译:吴京润 译者注:本人正在翻译AKKA官网文档,本篇是文档第一章,欢迎有兴趣的同学加入一起翻译.更多内容请读这里:https://tower.im/projects/ac49db18a6a24ae4b340a5fa22d930dc/lists/ded96c34f7ce4a6bb8b5473f596e1008/show/https://tower.im/projects/ac49db18a6a24ae4b340a5fa22d930dc/todos/640e53d

c#中的23种设计模式

C# 23种设计模式汇总 创建型模式 工厂方法(Factory Method) 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节.工厂方法模式的核心是一个抽象工厂类,各种具体工厂类通过抽象工厂类将工厂方法继承下来.如此使得客户可以只关心抽象产品和抽象工厂,完全不用理会返回的是哪一种具体产品,也不用关系它是如何被具体工厂创建的. 抽象工厂模式(Abstract Factory) 抽象工厂模式的主要优点是隔离了具体类的生成,使得客户不需要知道什么

JAVA中十四种常见开发工具及其特点

1.JDK (Java Development Kit)Java开发工具集 SUN的Java不仅提了一个丰富的语言和运行环境,而且还提了一个免费的Java开发工具集(JDK).开发人员和最终用户可以利用这个工具来开发java程序. JDK简单易学,可以通过任何文本编辑器(如:Windows 记事本.UltrEdit.Editplus.FrontPage以及dreamweaver等)编写Java源文件,然后在DOS状况下利通过javac命令将Java源程序编译成字节码,通过Java命令来执行编译后

操作系统中常见的调度算法

一.先来先服务调度算法 先来先服务的调度算法(FCFS)是一种最简单的调度算法,该算法既可以用于作业调度,也可以用于进程调度.当在作业调度中采用该算法时,每次都是从后备作业队列选择一个或多个最先进入该队列的作业,将他们调入内存,为他们分配内存,为他们分配资源,创建进程,然后放入就绪队列中.在进程中采用FCFS算法时,则每次调度室从就绪队列中选择一个最先进入该队列的进程,位置分配处理机,使之投入运行.该进程一直运行到完成或发生某事件而阻塞后才放弃处理机. FCFS调度算法有利于cpu繁忙型的作业,

剑指Offer面试题15(Java版):链表中倒数第K个结点

题目: 输入一个链表,输出该链表中倒数第k哥结点. 为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点. 例如一个链表有6个结点,从头结点开始它们的值依次是1,2,3,4,5,6.这个链表的倒数第3个结点是值为4的结点 为了得到第K个结点,很自然的想法是先走到链表的尾端,再从尾端回溯K步.可是我们从链表结点的定义可疑看出本题中的链表 是单向链表,单向链表的结点只有从前往后的指针而没有从后往前的指针,因此这种思路行不通. 既然不能从尾节点开始遍历这个链表,我们还是把思路回到头

Java开发中的23种设计模式详解(转)

设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周