-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRoundRobin.cpp
168 lines (137 loc) · 6.45 KB
/
RoundRobin.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include <iostream>
#include <vector>
#include <algorithm>
class Process {
public:
int processId;
int burstTime;
int arrivalTime;
int waitTime;
int completionTime;
int turnAroundTime;
Process(int processId, int burstTime, int arrivalTime) : processId(processId),
burstTime(burstTime),
arrivalTime(arrivalTime),
waitTime(0),
completionTime(0),
turnAroundTime(0) {}
int calcWaitTime() {
return waitTime = turnAroundTime - burstTime;
}
int calcTurnAroundTime() {
return completionTime - arrivalTime;
}
void completeProcess() {
turnAroundTime = calcTurnAroundTime();
waitTime = calcWaitTime();
}
};
class RoundRobin {
public:
std::vector<Process> vecProcesses;
int timeSlice;
void schedule() {
sortBasedOnArrival();
std::vector<std::pair<int, int>> procList = createProcessList();
bool isDone = false;
bool isArrived = false;
int timeCounter = 0;
int n = vecProcesses.size();
// Iterate through all process and execute them till all are processed.
while(!isDone) {
// Reset flags at the start of iteration over the list of processes.
isDone = true;
isArrived = false;
// Go over all the processes
for(int i = 0; i < n; i++) {
// If a process is not complete.
if(procList[i].second > 0) {
isDone = false;
// if the process has arrived, execute it.
if(vecProcesses[i].arrivalTime <= timeCounter) {
isArrived = true;
// Decrease burst time.
procList[i].second -= timeSlice;
// Increment the processor time.
timeCounter += timeSlice;
// If process is complete, mark the completion time.
if(procList[i].second <= 0 ) {
vecProcesses[i].completionTime = timeCounter;
std::cout << "Process: " << vecProcesses[i].processId << " with arrival time: " << vecProcesses[i].arrivalTime << " completed at t = " <<vecProcesses[i].completionTime << std::endl;
}
}
}
} // end for.
// If no process has arrived yet and executions pending, increase timeCounter.
if(!isArrived && !isDone) {
timeCounter += timeSlice;
}
} // end while
int totalExecutionTime = timeCounter;
float avgWaitingTime = 0;
float avgTurnAroundTime = 0;
for(auto proc : vecProcesses) {
proc.completeProcess();
avgWaitingTime += proc.waitTime;
avgTurnAroundTime += proc.turnAroundTime;
}
avgWaitingTime /= static_cast<float>(n);
avgTurnAroundTime /= static_cast<float>(n);
std::cout << ":Summary:" << std::endl;
std::cout << "Completion Time: " << totalExecutionTime << std::endl;
std::cout << "Avg Waiting Time: " << avgWaitingTime << std::endl;
std::cout << "Avg Turn Around time: " << avgTurnAroundTime << std::endl;
}
private:
static bool compare(Process &lhs, Process &rhs) {
return lhs.arrivalTime < rhs.arrivalTime;
}
// Sort the vector of processes based on their arrival time.
void sortBasedOnArrival() {
sort(vecProcesses.begin(), vecProcesses.end(), compare);
}
// Create a copy of list having process ID and burst time for performing scheduling.
std::vector<std::pair<int, int>> createProcessList() {
std::vector<std::pair<int, int>> procList;
for(auto el : vecProcesses) {
procList.emplace_back(std::pair<int, int>(el.processId, el.burstTime));
}
return procList;
}
};
using namespace std;
int main() {
// TestCase 1:
std::cout << std::endl << "********************** Testcase 1 ****************** " << std::endl;
RoundRobin scheduleObj;
scheduleObj.timeSlice = 2;
scheduleObj.vecProcesses.emplace_back(Process(2, 10, 10));
scheduleObj.vecProcesses.emplace_back(Process(1, 12, 0));
scheduleObj.vecProcesses.emplace_back(Process(3, 1, 7));
scheduleObj.schedule();
// TestCase 2:
std::cout << std::endl << "********************** Testcase 2 ****************** " << std::endl;
RoundRobin scheduleObj2;
scheduleObj2.timeSlice = 2;
scheduleObj2.vecProcesses.emplace_back(Process(2, 10, 5));
scheduleObj2.vecProcesses.emplace_back(Process(1, 10, 6));
scheduleObj2.vecProcesses.emplace_back(Process(3, 10, 1));
scheduleObj2.schedule();
// TestCase 3:
std::cout << std::endl << "********************** Testcase 3 ****************** " << std::endl;
RoundRobin scheduleObj3;
scheduleObj3.timeSlice = 2;
scheduleObj3.vecProcesses.emplace_back(Process(2, 4, 3));
scheduleObj3.vecProcesses.emplace_back(Process(1, 10, 5));
scheduleObj3.vecProcesses.emplace_back(Process(3, 1, 6));
scheduleObj3.schedule();
// TestCase 4:
std::cout << std::endl << "********************** Testcase 4 ****************** " << std::endl;
RoundRobin scheduleObj4;
scheduleObj4.timeSlice = 2;
scheduleObj4.vecProcesses.emplace_back(Process(2, 1, 3));
scheduleObj4.vecProcesses.emplace_back(Process(1, 5, 7));
scheduleObj4.vecProcesses.emplace_back(Process(3, 2, 12));
scheduleObj4.schedule();
return 0;
}