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

一、概述

  因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示。

  也因为我这次要实现多个类似算法,所以将一些共性单独提取出来作为一个类。  

  如果只想要和算法有关的核心代码,看FCFS类的calc()即可。 

  实现思路:按照顺序将进程添加到列表中,然后再按照添加顺序运行。模拟进程的运行,即为按顺序改变每个进程的到达时间、服务时间、开始时间、等待时间、周转时间和带权周转时间。在所有进程都结束后再计算平均周转时间和平均带权周转时间。

 

三、测试

  1. 测试数据:

  2. 运行结果:

 

三、流程图

 

 

四、实现代码

  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 {
16     private int processNumber;
17     private ArrayList<Process> processList;
18 
19     public FCFS() {
20         init();
21         calc();
22         Tools.printResult(processList);
23     }
24 
25     private void init() {
26         Scanner sc = new Scanner(System.in);
27 
28         System.out.print("<FCFS> 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("<FCFS> 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("<FCFS> Please enter each process service time:");
43         for (int i = 0; i < processNumber; i++) {
44             System.out.print("    Process" + (i + 1) + ":");
45             processList.get(i).setServicesTime(sc.nextInt());
46         }
47     }
48 
49     private void calc() {
50         int timeNow = 0;
51         Process opProcess;
52         
53         for (int i = 0; i < processNumber; i++) {
54             opProcess = processList.get(i);
55             
56             int waitTime = timeNow - opProcess.getArrivalTime();
57             int completionTime = timeNow + opProcess.getServicesTime();
58             int turnAroundTime = completionTime
59                     - opProcess.getArrivalTime();
60             double turnAroundTimeWithWeight = (double) turnAroundTime
61                     / opProcess.getServicesTime();
62 
63             opProcess.setStartTime(timeNow);
64             opProcess.setWaitTime(waitTime);
65             opProcess.setCompletionTime(completionTime);
66             opProcess.setTurnAroundTime(turnAroundTime);
67             opProcess.setTurnAroundTimeWithWeight(
68                     turnAroundTimeWithWeight);
69 
70             timeNow += opProcess.getServicesTime();
71         }
72     }
73     
74     public static void main(String [] args) {
75         new FCFS();
76     }
77 }

  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 }

 

posted @ 2018-12-21 10:47  daheww  阅读(13349)  评论(0编辑  收藏  举报