Skip to content

Commit eababa8

Browse files
committed
feat: Create round-robin CPU scheduling algorithm
1 parent 97c7d91 commit eababa8

File tree

1 file changed

+132
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)