|
| 1 | +#include "scheduler.h" |
| 2 | + |
| 3 | +int calculateTickets(process p) |
| 4 | +{ |
| 5 | + int time = 0; |
| 6 | + int execution_requests = 0; |
| 7 | + int io_requests = 0; |
| 8 | + for (int j = 0; j < p.n_phases; ++j) |
| 9 | + { |
| 10 | + time += p.phases[j].first; |
| 11 | + if (p.phases[j].second == 1) |
| 12 | + { |
| 13 | + execution_requests++; |
| 14 | + } |
| 15 | + else |
| 16 | + { |
| 17 | + io_requests++; |
| 18 | + } |
| 19 | + } |
| 20 | + return time + execution_requests * 20 + io_requests * 30; |
| 21 | +} |
| 22 | + |
| 23 | +void strideScheduler(int size, process processes[]) |
| 24 | +{ |
| 25 | + int finished_processes = 0, processor[4], WillGoToTheQ[4], i = 0, pr; |
| 26 | + memset(processor, -1, sizeof processor); |
| 27 | + memset(WillGoToTheQ, -1, sizeof WillGoToTheQ); |
| 28 | + CompareProcessstride cmp(processes); |
| 29 | + priority_queue<int, vector<int>, CompareProcessstride> waiting(cmp); |
| 30 | + for (int t = 0;; t++) |
| 31 | + { |
| 32 | + int idx_p = 0; |
| 33 | + for (idx_p = 0; idx_p < 4 && i < size && processes[i].arrive_time <= t; ++idx_p) // if processor is ideal and processes |
| 34 | + { |
| 35 | + if (processor[idx_p] == -1) |
| 36 | + { |
| 37 | + processor[idx_p] = i; |
| 38 | + processes[i].current_brust_time = processes[i].phases[processes[i].phase_idx].first; |
| 39 | + processes[i].state = processes[i].phases[processes[i].phase_idx].second; |
| 40 | + processes[i].last_processor = idx_p; |
| 41 | + i++; |
| 42 | + } |
| 43 | + } |
| 44 | + while (i < size && processes[i].arrive_time <= t) // processes arrived but there is no place at cpu so it will go in waiting queue |
| 45 | + { |
| 46 | + processes[i].state = processes[i].phases[processes[i].phase_idx].second; |
| 47 | + processes[i].current_brust_time = processes[i].phases[processes[i].phase_idx].first; |
| 48 | + waiting.push(i); |
| 49 | + i++; |
| 50 | + } |
| 51 | + for (idx_p = 0; idx_p < 4; idx_p++) |
| 52 | + { |
| 53 | + if (processor[idx_p] == -1) // means that , that processor is ideal |
| 54 | + { |
| 55 | + output[t][idx_p] = "i"; |
| 56 | + if (!waiting.empty()) |
| 57 | + { |
| 58 | + WillGoToTheQ[idx_p] = waiting.top(); |
| 59 | + waiting.pop(); |
| 60 | + } |
| 61 | + continue; |
| 62 | + } |
| 63 | + pr = processor[idx_p]; // index of the process in the processor |
| 64 | + output[t][idx_p] = processes[pr].process_name; |
| 65 | + processes[pr].time_consumed++; |
| 66 | + processes[pr].pass_value += processes[pr].stride; |
| 67 | + if (processes[pr].time_consumed == processes[pr].current_brust_time) // proceses finished exec |
| 68 | + { |
| 69 | + processes[pr].phase_idx++; |
| 70 | + processes[pr].time_consumed = 0; |
| 71 | + if (processes[pr].phase_idx < processes[pr].n_phases) // still want more ? |
| 72 | + { |
| 73 | + processes[pr].state = processes[pr].phases[processes[pr].phase_idx].second; |
| 74 | + processes[pr].current_brust_time = processes[pr].phases[processes[pr].phase_idx].first; |
| 75 | + } |
| 76 | + else // process finished |
| 77 | + { |
| 78 | + finished_processes++; |
| 79 | + processes[pr].state = 2; |
| 80 | + processes[pr].complete_time = t; |
| 81 | + processes[pr].turn_around_time = t - processes[pr].arrive_time; |
| 82 | + } |
| 83 | + if (!waiting.empty()) |
| 84 | + { |
| 85 | + WillGoToTheQ[idx_p] = waiting.top(); |
| 86 | + waiting.pop(); |
| 87 | + } |
| 88 | + processor[idx_p] = -1; |
| 89 | + } |
| 90 | + } |
| 91 | + match_prefrences(processor, WillGoToTheQ, processes); |
| 92 | + IO_handler_bypq_stride(size, processes, waiting, finished_processes, t); |
| 93 | + |
| 94 | + if (finished_processes == size) |
| 95 | + { |
| 96 | + print(t, processes, size); |
| 97 | + return; |
| 98 | + } |
| 99 | + } |
| 100 | +} |
0 commit comments