@@ -64,6 +64,11 @@ struct ProcessResult : public Process {
64
64
}
65
65
};
66
66
67
+ /* *
68
+ * Represent remaining burst time of a process.
69
+ */
70
+ using BTLeft = uint32_t ;
71
+
67
72
/* *
68
73
* @brief Execute processes based on Round-robin algorithm.
69
74
*
@@ -115,7 +120,7 @@ bool CompareAT(const Process& p1, const Process& p2) {
115
120
*/
116
121
void CheckArriveProcess (const std::vector<Process>& processes,
117
122
std::set<uint32_t >& arrived_process,
118
- std::queue<std::pair<Process, uint32_t >>& schedule,
123
+ std::queue<std::pair<Process, BTLeft >>& schedule,
119
124
uint32_t time_elapsed);
120
125
121
126
/* *
@@ -134,12 +139,14 @@ void Test() {
134
139
const uint32_t kTimeSlice {3 };
135
140
std::vector<ProcessResult> results = RRExecute (processes, kTimeSlice );
136
141
137
- std::vector<uint32_t > completion_times ({80 , 14 , 100 , 82 , 166 });
142
+ std::vector<uint32_t > correct_completion_times ({80 , 14 , 100 , 82 , 166 });
138
143
std::vector<ProcessResult> correct_results;
144
+ // Generate correct process results based on correct completion times
139
145
for (size_t i = 0 ; i < processes.size (); i++) {
140
- correct_results.emplace_back (processes[i], completion_times [i]);
146
+ correct_results.emplace_back (processes[i], correct_completion_times [i]);
141
147
}
142
148
149
+ // Sort the results and correct results so they're exactly the same
143
150
std::sort (results.begin (), results.end (), CompareAT);
144
151
std::sort (correct_results.begin (), correct_results.end (), CompareAT);
145
152
@@ -150,22 +157,26 @@ void Test() {
150
157
151
158
std::vector<ProcessResult> RRExecute (const std::vector<Process>& processes,
152
159
uint32_t time_slice) {
153
- std::queue<std::pair<Process, uint32_t >> schedule;
160
+ std::queue<std::pair<Process, BTLeft >> schedule;
154
161
std::set<uint32_t > arrived_processes;
155
162
156
163
std::vector<ProcessResult> results;
157
164
results.reserve (processes.size ());
158
165
166
+ // The time of the first process execution will be the lowest process AT
159
167
uint32_t time_elapsed =
160
168
std::min_element (processes.begin (), processes.end (), CompareAT)->arrival_time ;
161
169
162
170
CheckArriveProcess (processes, arrived_processes, schedule,
163
171
time_elapsed);
164
172
165
173
while (!schedule.empty ()) {
166
- std::pair<Process, uint32_t > current = schedule.front ();
174
+ std::pair<Process, BTLeft > current = schedule.front ();
167
175
schedule.pop ();
168
176
177
+ // If process burst time < time slice, then the process will be
178
+ // executed for the burst time amount of time, not the time
179
+ // quantum/slice
169
180
uint32_t elapsed =
170
181
(current.second > time_slice) ? time_slice : current.second ;
171
182
current.second -= elapsed;
@@ -178,6 +189,8 @@ std::vector<ProcessResult> RRExecute(const std::vector<Process>& processes,
178
189
schedule.push (current);
179
190
continue ;
180
191
}
192
+ // Generate process result based on the completion time (time
193
+ // that has elapsed)
181
194
results.emplace_back (current.first , time_elapsed);
182
195
}
183
196
@@ -216,7 +229,7 @@ std::ostream& operator<<(std::ostream& ostream,
216
229
217
230
void CheckArriveProcess (const std::vector<Process> &processes,
218
231
std::set<uint32_t >& arrived_process,
219
- std::queue<std::pair<Process, uint32_t >>& schedule,
232
+ std::queue<std::pair<Process, BTLeft >>& schedule,
220
233
uint32_t time_elapsed) {
221
234
for (auto & p : processes) {
222
235
if (p.arrival_time > time_elapsed ||
0 commit comments