Java实现进程调度算法(一)|Java实现进程调度算法(一) FCFS(先来先服务)

一、概述 因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示。
也因为我这次要实现多个类似算法,所以将一些共性单独提取出来作为一个类。
如果只想要和算法有关的核心代码,看FCFS类的calc()即可。
实现思路:按照顺序将进程添加到列表中,然后再按照添加顺序运行。模拟进程的运行,即为按顺序改变每个进程的到达时间、服务时间、开始时间、等待时间、周转时间和带权周转时间。在所有进程都结束后再计算平均周转时间和平均带权周转时间。

三、测试 1. 测试数据: Java实现进程调度算法(一)|Java实现进程调度算法(一) FCFS(先来先服务)
文章图片

2. 运行结果: Java实现进程调度算法(一)|Java实现进程调度算法(一) FCFS(先来先服务)
文章图片

三、流程图 Java实现进程调度算法(一)|Java实现进程调度算法(一) FCFS(先来先服务)
文章图片


四、实现代码 1. FCFS类(主类) 只有calc()中涉及了算法,init()和printResult()只有简单的输入输出操作。

1 package xqy.algorithm; 2 3 import java.util.ArrayList; 4 import java.util.Scanner; 5 6 import xqy.Util.Tools; 7 import xqy.been.Process; 8 9 /** 10* @author xqy 11* @date 2018年12月19日19:15:01 12* @description 对先到的任务先处理,后到的任务后处理。 13*/ 14 15 public class FCFS { 16private int processNumber; 17private ArrayList processList; 18 19public FCFS() { 20init(); 21calc(); 22Tools.printResult(processList); 23} 24 25private void init() { 26Scanner sc = new Scanner(System.in); 27 28System.out.print(" Please enter the process num:"); 29processNumber = sc.nextInt(); 30 31processList = new ArrayList(); 32for (int i = 0; i < processNumber; i++) { 33processList.add(new Process()); 34} 35 36System.out.println(" Please enter each process arrival time:"); 37for (int i = 0; i < processNumber; i++) { 38System.out.print("Process" + (i + 1) + ":"); 39processList.get(i).setArrivalTime(sc.nextInt()); 40} 41 42System.out.println(" Please enter each process service time:"); 43for (int i = 0; i < processNumber; i++) { 44System.out.print("Process" + (i + 1) + ":"); 45processList.get(i).setServicesTime(sc.nextInt()); 46} 47} 48 49private void calc() { 50int timeNow = 0; 51Process opProcess; 52 53for (int i = 0; i < processNumber; i++) { 54opProcess = processList.get(i); 55 56int waitTime = timeNow - opProcess.getArrivalTime(); 57int completionTime = timeNow + opProcess.getServicesTime(); 58int turnAroundTime = completionTime 59- opProcess.getArrivalTime(); 60double turnAroundTimeWithWeight = (double) turnAroundTime 61/ opProcess.getServicesTime(); 62 63opProcess.setStartTime(timeNow); 64opProcess.setWaitTime(waitTime); 65opProcess.setCompletionTime(completionTime); 66opProcess.setTurnAroundTime(turnAroundTime); 67opProcess.setTurnAroundTimeWithWeight( 68turnAroundTimeWithWeight); 69 70timeNow += opProcess.getServicesTime(); 71} 72} 73 74public static void main(String [] args) { 75new FCFS(); 76} 77 }

2. Process类 模拟了进程,对属性进行了封装。
1 package xqy.been; 2 3 public class Process { 4private int arrivalTime; 5private int servicesTime; 6private int remainServiceTime; 7private int startTime; 8private int waitTime; 9private int completionTime; 10 11/** 12* turnAroundTime = completionTime - arrivalTime 13*/ 14private int turnAroundTime; 15 16/** 17* turnAroundTimeWithWeight = turnAroundTime / servicesTime 18*/ 19private double turnAroundTimeWithWeight; 20 21public Process() { 22; 23} 24 25public int getArrivalTime() { 26return arrivalTime; 27} 28 29public void setArrivalTime(int arrivalTime) { 30this.arrivalTime = arrivalTime; 31} 32 33public int getServicesTime() { 34return servicesTime; 35} 36 37public void setServicesTime(int servicesTime) { 38this.servicesTime = servicesTime; 39} 40 41public int getRemainServiceTime() { 42return remainServiceTime; 43} 44 45public void setRemainServiceTime(int remainServiceTime) { 46this.remainServiceTime = remainServiceTime; 47} 48 49public int getStartTime() { 50return startTime; 51} 52 53public void setStartTime(int startTime) { 54this.startTime = startTime; 55} 56 57public int getWaitTime() { 58return waitTime; 59} 60 61public void setWaitTime(int waitTime) { 62this.waitTime = waitTime; 63} 64 65public int getCompletionTime() { 66return completionTime; 67} 68 69public void setCompletionTime(int completionTime) { 70this.completionTime = completionTime; 71} 72 73public int getTurnAroundTime() { 74return turnAroundTime; 75} 76 77public void setTurnAroundTime(int turnAroundTime) { 78this.turnAroundTime = turnAroundTime; 79} 80 81public double getTurnAroundTimeWithWeight() { 82return turnAroundTimeWithWeight; 83} 84 85public void setTurnAroundTimeWithWeight(double turnAroundTimeWithWeight) { 86this.turnAroundTimeWithWeight = turnAroundTimeWithWeight; 87} 88 89@Override 90public String toString() { 91return "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 9public static double calcAverageTurnAroundTime( 10ArrayList processList) { 11double sum = 0; 12for (int i = 0; i < processList.size(); i++) { 13sum += processList.get(i).getTurnAroundTime(); 14} 15return Math.round(sum / processList.size() * 100) / 100.0; 16} 17 18public static double calcAverageTurnAroundTimeWithWeight( 19ArrayList processList) { 20double sum = 0; 21for (int i = 0; i < processList.size(); i++) { 22sum += processList.get(i).getTurnAroundTimeWithWeight(); 23} 24return Math.round(sum / processList.size() * 100) / 100.0; 25} 26 27public static void printResult(ArrayList processList) { 28System.out.println("\n#RESULT#"); 29 30System.out.print("\tArrive:\t\t"); 31for (int i = 0; i < processList.size(); i++) { 32System.out.print(processList.get(i).getArrivalTime() + "\t"); 33} 34System.out.println(); 35 36System.out.print("\tService:\t"); 37for (int i = 0; i < processList.size(); i++) { 38System.out.print(processList.get(i).getServicesTime() + "\t"); 39} 40System.out.println(); 41 42System.out.print("\tStart:\t\t"); 43for (int i = 0; i < processList.size(); i++) { 44System.out.print(processList.get(i).getStartTime() + "\t"); 45} 46System.out.println(); 47 48System.out.print("\tWait:\t\t"); 49for (int i = 0; i < processList.size(); i++) { 50System.out.print(processList.get(i).getWaitTime() + "\t"); 51} 52System.out.println(); 53 54System.out.print("\tFinish:\t\t"); 55for (int i = 0; i < processList.size(); i++) { 56System.out.print(processList.get(i).getCompletionTime() + "\t"); 57} 58System.out.println(); 59 60System.out.print("\tTurn around:\t"); 61for (int i = 0; i < processList.size(); i++) { 62System.out.print(processList.get(i).getTurnAroundTime() + "\t"); 63} 64System.out.println(); 65 66System.out.print("\tTA wight:\t"); 67for (int i = 0; i < processList.size(); i++) { 68System.out.print(Math.round(processList.get(i) 69.getTurnAroundTimeWithWeight() * 100) / 100.0 + "\t"); 70} 71System.out.println(); 72 73System.out.println("\tAverage turn around time:" 74+ Tools.calcAverageTurnAroundTime(processList) + "\t"); 75System.out.println("\tAverage turn around time with wight:" 76+ Tools.calcAverageTurnAroundTimeWithWeight(processList)); 77 78System.out.println(); 79} 80 }


【Java实现进程调度算法(一)|Java实现进程调度算法(一) FCFS(先来先服务)】转载于:https://www.cnblogs.com/daheww/p/10154455.html

    推荐阅读