Java实现进程调度算法(二) RR(时间片轮转)
2018-12-24 09:08:39来源:博客园 阅读 ()
一、概述
因为这次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 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- DES/3DES/AES 三种对称加密算法实现 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash