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