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 }

 

转载于:https://www.cnblogs.com/daheww/p/10154576.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现了如下四种调度算法的模拟: (1)时间轮转调度 (2)优先数调度 (3)最短进程优先 (4)最短剩余时间优先 模拟过程使用了JProgressBar作为进程状态条,更为直观地观察到每个进程的执行状态。 程序用户说明: 1、在上图标号1处输入要创建随机进程的个数,仅可输入正数,非正数会有相关提示。然后点击标号2处的“创建进程”按钮,随进创建的进程显示在程序界面的中央窗口,如标号3所示。 2、创建好随机进程后,在标号4的单选框选择将要模拟执行的调度算法,然后点击标号5处的“开始模拟”,程序开始执行。标号3的列表会显示相应的调度变化。 3、模拟过程中,可以继续添加新的进程,操作同上。 4、 一个算法模拟执行完毕之后,可以点击标号6的“复位”按钮,可以重置列表的内容为程序模拟运行前的内容。复位成功后,可以继续选择其他调度算法进行模拟。 5、标号7显示为程序模拟过程中的时间,从1秒开始累计。 6、点击标号8的“清空”按钮,可以清空类别的进程,以便程序的下次执行。 题目要求: 题目四 单处理器系统的进程调度 一 、 课 程 设 计 目 的 1. 加深对进程概念的理解, 明确进程和程序的区别。 2. 深入了解系统如何组织进程、 创建进程。 3. 进一步认识如何实现处理器调度。 二 、 课 程 设 计 内 容 编写程序完成单处理器系统中的进程调度, 要求实现时间轮转、 优先数、 最短进程优 先和最短剩余时间优先四种调度算法。 实验具体包括: 首先确定进程控制块的内容, 进程控 制块的组成方式; 然后完成进程创建原语和进程调度原语; 最后编写主函数对所作工作进行 测试。 模拟程序只对你所设置的“ 虚拟 PCB” 进行相应的调度模拟操作, 即每发生“ 调度” 时, 显示出当前运行进程的“ 进程标识符”、“ 优先数”、“ 剩余运行时间” 等, 而不需要对系 统中真正的 PCB 等数据进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值