非搶占式,短作業優先調度算法 | Java語言實現


  1 package com.company.osExperiment.algorithm;
  2 
  3 import com.company.osExperiment.entity.PCB;
  4 
  5 import java.util.ArrayList;
  6 import java.util.List;
  7 import java.util.Scanner;
  8 
  9 import static com.company.osExperiment.entity.PCB.R;
 10 import static com.company.osExperiment.util.ResultUtil.addResult;
 11 
 12 /**
 13  * 非搶占式,短作業優先調度算法
 14  * @Author swsbty
 15  * @Date 2020/6/9 4:31
 16  */
 17 
 18 public class SJF {
 19 
 20     private int current = 0;     // 記錄系統當前時間的變量
 21     private List<PCB> processList;
 22 
 23     /*
 24     啟動方法
 25      */
 26     public void start() {
 27         processList = new ArrayList<>();
 28         System.out.println("time 1=1000 time slice");
 29         addResult("time 1=1000 time slice");
 30         inputProcess();
 31         sort();
 32         run();
 33     }
 34 
 35     /*
 36     執行調度算法
 37      */
 38     private void run() {
 39         while (true) {
 40             if (processList.size() == 0) {  // 如果所有進程都執行完畢,就終止循環
 41                 return;
 42             }
 43             runProcess();
 44         }
 45     }
 46 
 47     /*
 48     運行進程
 49      */
 50     private void runProcess() {
 51         for (PCB pcb : processList) {
 52             if (pcb.state == R && pcb.arriveTime <= current) {  // 如果進程沒有執行完畢,同時到達時間小於等於當前時間
 53                 System.out.println("當前時間:" + (current * 1000) + ",進程" + pcb.name + " 開始運行");
 54                 addResult("當前時間:" + (current * 1000) + ",進程" + pcb.name + " 開始運行");
 55                 current += pcb.runtime; // 當前時間加上運行時間
 56                 System.out.println("當前時間:" + (current * 1000) + ",進程" + pcb.name + " 運行結束");
 57                 addResult("當前時間:" + (current * 1000) + ",進程" + pcb.name + " 運行結束");
 58                 processList.remove(pcb);    // 刪除該進程
 59                 break;
 60             }
 61         }
 62     }
 63 
 64     /*
 65     錄入進程
 66      */
 67     private void inputProcess() {
 68         int num;        // 要建立的進程數
 69         System.out.print("你想運行多少個進程:");
 70         addResult("你想運行多少個進程:");
 71 
 72         Scanner input = new Scanner(System.in);
 73         num = input.nextInt();
 74         addResult("" + num);
 75         for (int i = 0;i < num;i++) {
 76             PCB p = new PCB();
 77             System.out.print(String.format("請輸入第 %3d 個進程的名字:", i + 1));
 78             addResult(String.format("請輸入第 %3d 個進程的名字:", i + 1));
 79             p.name = input.next();
 80             addResult(p.name);
 81 
 82             System.out.print("                     運行時間:");
 83             addResult("                     運行時間:");
 84             p.runtime = input.nextInt();
 85             addResult("" + p.runtime);
 86 
 87             System.out.print("                        到達時間:");
 88             addResult("                        到達時間:");
 89             p.arriveTime = input.nextInt();
 90             addResult("" + p.arriveTime);
 91 
 92 
 93             p.state = R;
 94             processList.add(p);
 95         }
 96     }
 97 
 98     /*
 99     ☆選擇排序
100     該算法把錄入的進程,按照運行時間,由小到大排序
101      */
102     private void sort() {
103         for (int i = 0;i < processList.size() - 1;i++) {
104             for (int j = i + 1;j < processList.size();j++) {
105                 if (processList.get(i).runtime > processList.get(j).runtime) {
106                     PCB pi = processList.get(i);
107                     PCB pj = processList.get(j);
108                     processList.set(i, pj);
109                     processList.set(j, pi);
110                 }
111             }
112         }
113     }
114 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM