-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPriority Scheduling(preemtive).cpp
146 lines (138 loc) · 4.78 KB
/
Priority Scheduling(preemtive).cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include<bits/stdc++.h>
using namespace std;
struct Process
{
int processName;
int arrivalTime;
int cpuTime;
int waitingTime;
int priority;
int turnAroundTime;
int remainingTime;
};
vector<Process> process;
queue<int> readyQueue;
vector<int> timer,ganttProcess;
int noOfProcess;
bool SortArrivalTime(Process p1,Process p2){
return (p1.arrivalTime == p2.arrivalTime)? p1.priority<p2.priority : p1.arrivalTime < p2.arrivalTime;
}
bool SortPriority(Process p1,Process p2)
{
return p1.priority < p2.priority;
}
void GanttChart_Preemtive()
{
readyQueue.push(0);
timer.push_back(process[0].arrivalTime);
cout << "Process in ready queue: ";
while(!readyQueue.empty()){
int processIndex = readyQueue.front();
cout << "P" << process[processIndex].processName+1 << " ";
readyQueue.pop();
if(timer.back() < process[processIndex+1].arrivalTime && process[processIndex].priority > process[processIndex+1].priority){
process[processIndex].remainingTime -= process[processIndex+1].arrivalTime - timer.back();
timer.push_back(process[processIndex+1].arrivalTime);
readyQueue.push(processIndex+1);
ganttProcess.push_back(process[processIndex].processName);
}else{
timer.push_back(timer.back()+process[processIndex].remainingTime);
process[processIndex].remainingTime = 0;
ganttProcess.push_back(process[processIndex].processName);
}
}
sort(process.begin(),process.end(),SortPriority);
for(int i=0; i<noOfProcess; i++){
if(process[i].remainingTime !=0){
timer.push_back(timer.back()+process[i].remainingTime);
ganttProcess.push_back(process[i].processName);
process[i].remainingTime = 0;
}
}
cout << endl << endl << "Gantt Chart : " << endl;
for(int i=0; i<ganttProcess.size(); i++){
cout << "---" << ganttProcess[i]+1 << "---|";
}
cout << endl;
for(int i=0; i<timer.size(); i++){
cout << timer[i] << "\t";
}
/// calculate waiting time
/// waiting time = start time - last completion time,arrival time
for(int i=0; i<noOfProcess; i++){
int lastCompletionTime = process[i].arrivalTime;
process[i].waitingTime = 0;
for(int j=0; j<ganttProcess.size(); j++){
if(process[i].processName == ganttProcess[j]){
process[i].waitingTime += timer[j] - lastCompletionTime;
lastCompletionTime = timer[j+1];
}
}
}
///calculate turn around time, avg waiting time,avg turn around time
/// turn around time = waiting time + cpu time
double avgWT = 0.0,avgTAT = 0.0;
cout << endl << "\nName\tA.T.\tCPUTime\tpriority W.T\tT.A.T" <<endl;
for(int i=0; i<noOfProcess; i++){
process[i].turnAroundTime = process[i].waitingTime + process[i].cpuTime;
avgWT +=(double) process[i].waitingTime;
avgTAT +=(double)process[i].turnAroundTime;
cout << "P" <<process[i].processName+1 << "\t" << process[i].arrivalTime
<< "\t" << process[i].cpuTime <<"\t" << process[i].priority << "\t " << process[i].waitingTime <<
"\t" << process[i].turnAroundTime << endl;
}
cout << endl << "Average waiting Time : " << avgWT/noOfProcess << endl;
cout << "Average turn around Time : " << avgTAT/noOfProcess << endl;
}
int main()
{
cout << "Enter no of process : ";
cin >> noOfProcess;
cout << "Enter CPU Time " << endl;
for(int i=0; i<noOfProcess; i++){
Process p;
cin >> p.cpuTime;
p.processName = i;
p.remainingTime = p.cpuTime;
process.push_back(p);
}
cout << "Have Arrival Time? press Y/N: ";
char c;
cin >> c;
if(c == 'Y' || c == 'y'){
cout << "Enter Arrival Time : " << endl;
for(int i=0; i<noOfProcess; i++){
cin >> process[i].arrivalTime;
}
}else if(c == 'N' || c == 'n'){
for(int i=0; i<noOfProcess; i++){
process[i].arrivalTime = 0;
}
}
cout << "Enter the priority :" << endl;
for(int i=0; i<noOfProcess; i++){
cin >> process[i].priority;
}
sort(process.begin(),process.end(),SortArrivalTime);
GanttChart_Preemtive();
return 0;
}
/**
Sample Input 0:
3
5 7 9
y
4 0 2
0 2 1
Sample Output 1:
Process in ready queue: P2 P3 P1
Gantt Chart :
---P2---|---P3---|---P1---|---P3---|---P2---|
0 2 4 9 16 21
Name A.T. CPUTime W.T T.A.T
P1 4 5 0 5
P3 2 9 5 14
P2 0 7 14 21
Average waiting Time : 6.33333
Average turn around Time : 13.3333
*/