[英]calculate average waiting time for a preemptive shortest job first scheduling algorithm
[英]Waiting time in FCFS scheduling algorithm
我寫了FCFS
算法,但是當我想計算第二個進程的waiting time
時有一個錯誤。
我知道等待時間的計算方法是:
第一步等待時間: 0
為他人:
Waiting time[i] = FinishedTime[i] - arrivalTime[i] - BurstTime[i]
這是我的代碼:
public class FCFS2 {
static int[] burstTimes = new int[3];
static int[] arrivalTimes = new int[3];
static Scanner in = new Scanner(System.in);
static int[] processes = new int[3];
static int[] waitingTimes = new int[3];
static int[] finishedTimes = new int[3];
public static void main(String[] args) {
System.out.println("CPU Scheduling Algorithm - First Come First Serve");
//read Arrival times
for (int i = 0; i < 3; i++) {
System.out.print("Enter Arrival time for process " + (i + 1) + ": ");
arrivalTimes[i] = in.nextInt();
processes[i] = i;
}
System.out.println();
//read burst times
for (int i = 0; i < 3; i++) {
System.out.print("Enter Burst time for process " + (i + 1) + ": ");
burstTimes[i] = in.nextInt();
}
// Sort by arrival Times
for (int i = 0; i <= 3; i++) {
for (int j = i + 1; j < 3; j++)
if (arrivalTimes[i] > arrivalTimes[j]) {
// swap in arrival times
int tempAr = arrivalTimes[i];
arrivalTimes[i] = arrivalTimes[j];
arrivalTimes[j] = tempAr;
//swap in burst times too
int tempBr = burstTimes[i];
burstTimes[i] = burstTimes[j];
burstTimes[j] = tempBr;
}
}
// calculate finished times
finishedTimes[0] = arrivalTimes[0] + burstTimes[0];
for (int k = 1; k < 3; k++) {
finishedTimes[k] = finishedTimes[k - 1] + burstTimes[k];
}
System.out.println("\nArrival Times:");
for (int k = 0; k < 3; k++) {
System.out.print(arrivalTimes[k] + " | ");
}
System.out.println("\nBurst Times:");
for (int k = 0; k < 3; k++) {
System.out.print(burstTimes[k] + " | ");
}
System.out.println("\nFinished Times:");
for (int k = 0; k < 3; k++) {
System.out.print(finishedTimes[k] + " | ");
}
//calculate waiting times for each process
waitingTimes[0] = 0;
for (int i = 1; i < 3; i++) {
waitingTimes[i] = finishedTimes[i] - arrivalTimes[i] - burstTimes[i];
}
System.out.println("\nWaiting Times:");
for (int i = 0; i < 3; i++) {
System.out.print(waitingTimes[i] + " | ");
}
}
}
輸出:
Enter Arrival time for process 1: 3
Enter Arrival time for process 2: 1
Enter Arrival time for process 3: 5
Enter Burst time for process 1: 5
Enter Burst time for process 2: 6
Enter Burst time for process 3: 2
Arrival Times:
1 | 3 | 5 |
Burst Times:
6 | 5 | 2 |
Finished Times:
7 | 12 | 14 |
Waiting Times:
0 | 4 | 7 |
但是等待時間應該是: 0,5,7
由於我們使用的是Java,因此我將嘗試以面向對象的方式解決此問題。 我們可以將等待時間計算為
waitingTime[i] = serviceTime - arrivalTime[i];
where serviceTime is actually current time.
在這里,我創建了一個Job類來保存每個作業信息和方法,以按到達時間進行排序。
public class Job implements Comparable<Job>{
private String id;
private int arrivalTime;
private int burstTime;
//Getter and setters
@Override
public int compareTo(Job job) {
int compareArrivalTime = ((Job) job).getArrivalTime();
return this.arrivalTime - compareArrivalTime;
}
}
然后是主要方法和所有其他相關方法。
public static void main(String[] args) {
List<Job> jobList = generateDummyJobs();
Collections.sort(jobList);
printJobs(jobList);
calculateWaitTime(jobList);
}
private static List<Job> generateDummyJobs() {
List<Job> jobList = new ArrayList<Job>();
Job job1 = new Job("P1", 3, 5);
Job job2 = new Job("P2", 1, 6);
Job job3 = new Job("P3", 5, 2);
jobList.add(job1);
jobList.add(job2);
jobList.add(job3);
return jobList;
}
private static void printJobs(List<Job> jobList) {
for(Job job :jobList) {
System.out.println("[" + job.getId() + ", " + job.getArrivalTime() + ", " + job.getBurstTime() + "]" );
}
}
private static void calculateWaitTime(List<Job> jobList) {
int serviceTime = 1;
for(Job job :jobList) {
System.out.println(job.getId() + ": " + (serviceTime - job.getArrivalTime()));
serviceTime += job.getBurstTime();
}
}
您對等待時間進行錯誤計算的原因是因為for (int k = 1; k < 3; k++) {finishedTimes[k] = finishedTimes[k - 1] + burstTimes[k];}
已初始化為1但應為0。
static int[] burstTimes = new int[5];
static int[] arrivalTimes = new int[5];
static Scanner in = new Scanner(System.in);
static int[] processes = new int[5];
static int[] waitingTimes = new int[5];
static int[] finishedTimes = new int[5];
static int[] turnAroundTime = new int[5];
public static void main(String[] args) {
System.out.println("CPU Scheduling Algorithm - First Come First Serve");
//read Arrival times
for (int i = 0; i < 5; i++) {
System.out.print("Enter Arrival time for process " + (i + 1) + ": ");
arrivalTimes[i] = in.nextInt();
processes[i] = i;
}
System.out.println();
//read burst times
for (int i = 0; i < 5; i++) {
System.out.print("Enter Burst time for process " + (i + 1) + ": ");
burstTimes[i] = in.nextInt();
}
// Sort by arrival Times
for (int i = 0; i <= 5; i++) {
for (int j = i + 1; j < 5; j++)
if (arrivalTimes[i] > arrivalTimes[j]) {
// swap in arrival times
int tempAr = arrivalTimes[i];
arrivalTimes[i] = arrivalTimes[j];
arrivalTimes[j] = tempAr;
//swap in burst times too
int tempBr = burstTimes[i];
burstTimes[i] = burstTimes[j];
burstTimes[j] = tempBr;
}
}
// calculate finished times
finishedTimes[0] = arrivalTimes[0] + burstTimes[0];
for (int k = 1; k < 5; k++) {
finishedTimes[k] = finishedTimes[k - 1] + burstTimes[k];
}
System.out.println("\nArrival Times:");
for (int k = 0; k < 5; k++) {
System.out.print(arrivalTimes[k] + " | ");
}
System.out.println("\nBurst Times:");
for (int k = 0; k < 5; k++) {
System.out.print(burstTimes[k] + " | ");
}
System.out.println("\nFinished Times:");
for (int k = 0; k < 5; k++) {
System.out.print(finishedTimes[k] + " | ");
}
//calculate waiting times for each process
waitingTimes[0] = 0;
turnAroundTime[0] = 0;
for (int i = 0; i < 5; i++) {
turnAroundTime[i] = finishedTimes[i] - arrivalTimes[i];
waitingTimes[i] = turnAroundTime[i] - burstTimes[i];
}
System.out.println("\nTurnAround Times:");
for (int k = 0; k < 5; k++) {
System.out.print(turnAroundTime[k] + " | ");
}
System.out.println("\nWaiting Times:");
for (int i = 0; i < 5; i++) {
System.out.print(waitingTimes[i] + " | ");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.