Java实现进程调度算法(二) RR(时间片轮转)
一、概述
因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示。
也因为我这次要实现多个类似算法,所以将一些共性单独提取出来作为一个类。
如果只想要和算法有关的核心代码,看RR类的calc()即可。
实现思路:每运行一个进程,则将所有进程的remainServiceTime减去一个时间片的长度。
二、运行结果
1. 测试数据:
2. 运行结果:


三、流程图

四、实现代码
1. RR类(主类)
只有calc()中涉及了算法,init()和printResult()只有简单的输入输出操作。
1 package xqy.algorithm; 2 3 import java.util.*; 4 5 import xqy.Util.Tools; 6 import xqy.been.Process; 7 8 /** 9 * @author xqy 10 * @date 2018年12月19日19:14:49 11 */ 12 public class RR { 13 private int processNumber; 14 private ArrayList<Process> processList; 15 private int timeSlice; 16 17 public RR() { 18 init(); 19 calc(); 20 Tools.printResult(processList); 21 } 22 23 private void init() { 24 Scanner sc = new Scanner(System.in); 25 26 System.out.print("<RR> Please enter the slice time:"); 27 timeSlice = sc.nextInt(); 28 System.out.print("<RR> please enter the process num:"); 29 processNumber = sc.nextInt(); 30 31 processList = new ArrayList<Process>(); 32 for (int i = 0; i < processNumber; i++) { 33 processList.add(new Process()); 34 } 35 36 System.out.println("<RR> Please enter each process arrival time:"); 37 for (int i = 0; i < processNumber; i++) { 38 System.out.print(" Process" + (i + 1) + ":"); 39 processList.get(i).setArrivalTime(sc.nextInt()); 40 } 41 42 System.out.println("<RR> Please enter each process service time:"); 43 for (int i = 0; i < processNumber; i++) { 44 System.out.print(" Process" + (i + 1) + ":"); 45 int servicesTime = sc.nextInt(); 46 47 processList.get(i).setServicesTime(servicesTime); 48 processList.get(i).setRemainServiceTime(servicesTime); 49 } 50 } 51 52 private void calc() { 53 int timeNow = 0; 54 int processRemain = processNumber; 55 boolean noProcessRunInThisTurn; 56 Process opProcess; 57 58 while (processRemain != 0) { 59 noProcessRunInThisTurn = true; 60 61 for (int i = 0; i < processNumber; i++) { 62 opProcess = processList.get(i); 63 64 if ((opProcess.getRemainServiceTime() > 0) 65 && (timeNow >= opProcess.getArrivalTime())) { 66 // First time 67 if (opProcess.getServicesTime() == opProcess 68 .getRemainServiceTime()) { 69 int waitTime = timeNow - opProcess.getArrivalTime(); 70 71 opProcess.setStartTime(timeNow); 72 opProcess.setWaitTime(waitTime); 73 } 74 75 // Calculating remain service time 76 int remainServiceTime = opProcess.getRemainServiceTime() 77 - timeSlice; 78 opProcess.setRemainServiceTime(remainServiceTime); 79 80 // Last time 81 if (remainServiceTime <= 0) { 82 int completionTime = timeNow + timeSlice; // The process ends when the current slice is completed. 83 int turnAroundTime = completionTime 84 - opProcess.getArrivalTime(); 85 double turnAroundTimeWithWeight = 1.0 * turnAroundTime 86 / opProcess.getServicesTime(); 87 88 opProcess.setCompletionTime(completionTime); 89 opProcess.setTurnAroundTime(turnAroundTime); 90 opProcess 91 .setTurnAroundTimeWithWeight(turnAroundTimeWithWeight); 92 processRemain--; 93 } 94 95 timeNow += timeSlice; 96 noProcessRunInThisTurn = false; 97 98 System.out.println(" #STEP# Process" + (i + 1) 99 + " remain service time:" 100 + opProcess.getRemainServiceTime() 101 + " , timeBefore:" + (timeNow - 1) + ", timeNow:" 102 + timeNow 103 + ((remainServiceTime <= 0) ? " Finish" : "")); 104 } else { 105 // do noting, because this process has been completed or hasn`t arrived. 106 } 107 } 108 109 // Means no process could run, because they have arrived. 110 if ((processRemain > 0) && noProcessRunInThisTurn) { 111 timeNow += timeSlice; 112 } 113 } 114 } 115 }
2. Process类
模拟了进程,对属性进行了封装。
1 package xqy.been;
2
3 public class Process {
4 private int arrivalTime;
5 private int servicesTime;
6 private int remainServiceTime;
7 private int startTime;
8 private int waitTime;
9 private int completionTime;
10
11 /**
12 * turnAroundTime = completionTime - arrivalTime
13 */
14 private int turnAroundTime;
15
16 /**
17 * turnAroundTimeWithWeight = turnAroundTime / servicesTime
18 */
19 private double turnAroundTimeWithWeight;
20
21 public Process() {
22 ;
23 }
24
25 public int getArrivalTime() {
26 return arrivalTime;
27 }
28
29 public void setArrivalTime(int arrivalTime) {
30 this.arrivalTime = arrivalTime;
31 }
32
33 public int getServicesTime() {
34 return servicesTime;
35 }
36
37 public void setServicesTime(int servicesTime) {
38 this.servicesTime = servicesTime;
39 }
40
41 public int getRemainServiceTime() {
42 return remainServiceTime;
43 }
44
45 public void setRemainServiceTime(int remainServiceTime) {
46 this.remainServiceTime = remainServiceTime;
47 }
48
49 public int getStartTime() {
50 return startTime;
51 }
52
53 public void setStartTime(int startTime) {
54 this.startTime = startTime;
55 }
56
57 public int getWaitTime() {
58 return waitTime;
59 }
60
61 public void setWaitTime(int waitTime) {
62 this.waitTime = waitTime;
63 }
64
65 public int getCompletionTime() {
66 return completionTime;
67 }
68
69 public void setCompletionTime(int completionTime) {
70 this.completionTime = completionTime;
71 }
72
73 public int getTurnAroundTime() {
74 return turnAroundTime;
75 }
76
77 public void setTurnAroundTime(int turnAroundTime) {
78 this.turnAroundTime = turnAroundTime;
79 }
80
81 public double getTurnAroundTimeWithWeight() {
82 return turnAroundTimeWithWeight;
83 }
84
85 public void setTurnAroundTimeWithWeight(double turnAroundTimeWithWeight) {
86 this.turnAroundTimeWithWeight = turnAroundTimeWithWeight;
87 }
88
89 @Override
90 public String toString() {
91 return "Process [arrivalTime=" + arrivalTime + ", servicesTime="
92 + servicesTime + ", remainServiceTime=" + remainServiceTime
93 + ", startTime=" + startTime + ", waitTime=" + waitTime
94 + ", completionTime=" + completionTime + ", turnAroundTime="
95 + turnAroundTime + ", turnAroundTimeWithWeight="
96 + turnAroundTimeWithWeight + "]";
97 }
98 }
3. Tools类
因为这次要实现几个类似的算法,所以我把每个算法中都要用到的方法都提取出来作为单独的工具类。
也可以将这些工具方法都放入FCFS类中。
1 package xqy.Util;
2
3 import java.util.ArrayList;
4
5 import xqy.been.Process;
6
7 public class Tools {
8
9 public static double calcAverageTurnAroundTime(
10 ArrayList<Process> processList) {
11 double sum = 0;
12 for (int i = 0; i < processList.size(); i++) {
13 sum += processList.get(i).getTurnAroundTime();
14 }
15 return Math.round(sum / processList.size() * 100) / 100.0;
16 }
17
18 public static double calcAverageTurnAroundTimeWithWeight(
19 ArrayList<Process> processList) {
20 double sum = 0;
21 for (int i = 0; i < processList.size(); i++) {
22 sum += processList.get(i).getTurnAroundTimeWithWeight();
23 }
24 return Math.round(sum / processList.size() * 100) / 100.0;
25 }
26
27 public static void printResult(ArrayList<Process> processList) {
28 System.out.println("\n #RESULT#");
29
30 System.out.print("\tArrive:\t\t");
31 for (int i = 0; i < processList.size(); i++) {
32 System.out.print(processList.get(i).getArrivalTime() + "\t");
33 }
34 System.out.println();
35
36 System.out.print("\tService:\t");
37 for (int i = 0; i < processList.size(); i++) {
38 System.out.print(processList.get(i).getServicesTime() + "\t");
39 }
40 System.out.println();
41
42 System.out.print("\tStart:\t\t");
43 for (int i = 0; i < processList.size(); i++) {
44 System.out.print(processList.get(i).getStartTime() + "\t");
45 }
46 System.out.println();
47
48 System.out.print("\tWait:\t\t");
49 for (int i = 0; i < processList.size(); i++) {
50 System.out.print(processList.get(i).getWaitTime() + "\t");
51 }
52 System.out.println();
53
54 System.out.print("\tFinish:\t\t");
55 for (int i = 0; i < processList.size(); i++) {
56 System.out.print(processList.get(i).getCompletionTime() + "\t");
57 }
58 System.out.println();
59
60 System.out.print("\tTurn around:\t");
61 for (int i = 0; i < processList.size(); i++) {
62 System.out.print(processList.get(i).getTurnAroundTime() + "\t");
63 }
64 System.out.println();
65
66 System.out.print("\tTA wight:\t");
67 for (int i = 0; i < processList.size(); i++) {
68 System.out.print(Math.round(processList.get(i)
69 .getTurnAroundTimeWithWeight() * 100) / 100.0 + "\t");
70 }
71 System.out.println();
72
73 System.out.println("\tAverage turn around time:"
74 + Tools.calcAverageTurnAroundTime(processList) + "\t");
75 System.out.println("\tAverage turn around time with wight:"
76 + Tools.calcAverageTurnAroundTimeWithWeight(processList));
77
78 System.out.println();
79 }
80 }


浙公网安备 33010602011771号