Skip to content

Commit 803d707

Browse files
committed
feat: create round-robin CPU scheduling algorithm
1 parent 97c7d91 commit 803d707

File tree

1 file changed

+126
-0
lines changed

1 file changed

+126
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
#include <iomanip>
2+
#include <string>
3+
#include <iostream>
4+
#include <queue>
5+
#include <set>
6+
#include <utility>
7+
#include <vector>
8+
9+
struct Process {
10+
uint32_t id;
11+
uint32_t arrival_time;
12+
uint32_t burst_time;
13+
};
14+
15+
struct ProcessResult : public Process {
16+
uint32_t completion_time;
17+
uint32_t turn_around_time;
18+
uint32_t waiting_time;
19+
20+
ProcessResult(const Process& process, uint32_t time_elapsed) : Process(process) {
21+
completion_time = time_elapsed;
22+
turn_around_time = completion_time - arrival_time;
23+
waiting_time = turn_around_time - burst_time;
24+
}
25+
};
26+
27+
std::vector<ProcessResult> RRExecute(const std::vector<Process>& processes,
28+
uint32_t time_slice);
29+
30+
std::ostream& operator<<(std::ostream& ostream,
31+
const std::vector<ProcessResult>& results);
32+
33+
int main() {
34+
std::vector<Process> processes{{0, 3, 3}, {1, 8, 5}, {2, 5, 4}};
35+
const uint32_t kTimeSlice{2};
36+
std::vector<ProcessResult> results = RRExecute(processes, kTimeSlice);
37+
std::cout << results;
38+
std::getchar();
39+
return 0;
40+
}
41+
42+
bool CompareAT(const Process& p1, const Process& p2) {
43+
return p1.arrival_time < p2.arrival_time;
44+
}
45+
46+
void CheckArriveProcess(const std::vector<Process>& processes,
47+
std::set<uint32_t>& arrived_process,
48+
std::queue<std::pair<Process, uint32_t>>& schedule,
49+
uint32_t time_elapsed);
50+
51+
std::vector<ProcessResult> RRExecute(const std::vector<Process>& processes,
52+
uint32_t time_slice) {
53+
std::vector<Process> sorted_processes = processes;
54+
std::sort(sorted_processes.begin(), sorted_processes.end(), CompareAT);
55+
56+
std::queue<std::pair<Process, uint32_t>> schedule;
57+
std::set<uint32_t> arrived_processes;
58+
std::vector<ProcessResult> results;
59+
results.reserve(processes.size());
60+
uint32_t time_elapsed = sorted_processes[0].arrival_time;
61+
62+
CheckArriveProcess(sorted_processes, arrived_processes, schedule,
63+
time_elapsed);
64+
65+
while (!schedule.empty()) {
66+
std::pair<Process, uint32_t> current = schedule.front();
67+
schedule.pop();
68+
69+
uint32_t elapsed =
70+
(current.second > time_slice) ? time_slice : current.second;
71+
current.second -= elapsed;
72+
time_elapsed += elapsed;
73+
74+
CheckArriveProcess(sorted_processes, arrived_processes, schedule,
75+
time_elapsed);
76+
77+
if (current.second > 0) {
78+
schedule.push(current);
79+
continue;
80+
}
81+
results.emplace_back(current.first, time_elapsed);
82+
}
83+
84+
return results;
85+
}
86+
87+
std::ostream& operator<<(std::ostream& ostream,
88+
const std::vector<ProcessResult>& results) {
89+
auto PrintCell = [&](const std::string &str) {
90+
ostream << std::setw(17) << std::left << str;
91+
};
92+
93+
PrintCell("Process ID");
94+
PrintCell("Arrival Time");
95+
PrintCell("Burst Time");
96+
PrintCell("Completion Time");
97+
PrintCell("Turnaround Time");
98+
PrintCell("Waiting Time");
99+
ostream << std::endl;
100+
101+
for (auto& p : results) {
102+
PrintCell(std::to_string(p.id));
103+
PrintCell(std::to_string(p.arrival_time));
104+
PrintCell(std::to_string(p.burst_time));
105+
PrintCell(std::to_string(p.completion_time));
106+
PrintCell(std::to_string(p.turn_around_time));
107+
PrintCell(std::to_string(p.waiting_time));
108+
ostream << "\n";
109+
}
110+
111+
return ostream;
112+
}
113+
114+
void CheckArriveProcess(const std::vector<Process> &processes,
115+
std::set<uint32_t>& arrived_process,
116+
std::queue<std::pair<Process, uint32_t>>& schedule,
117+
uint32_t time_elapsed) {
118+
for (auto& p : processes) {
119+
if (p.arrival_time > time_elapsed ||
120+
arrived_process.find(p.id) != arrived_process.end()) {
121+
continue;
122+
}
123+
schedule.emplace(p, p.burst_time);
124+
arrived_process.insert(p.id);
125+
}
126+
}

0 commit comments

Comments
 (0)