zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    sed 命令
    find命令详解
    texlive、
    linux source命令与export命令的区别
    vscode浏览器打开html vscode修改默认浏览器
    npm install说明
    有关必须组件化的需求
    日志文件上传的时机
    TypeScript vs. C#: LINQ
    JavaScript 运行机制详解:再谈Event Loop
  • 原文地址:https://www.cnblogs.com/daheww/p/10154576.html
Copyright © 2011-2022 走看看