-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProcess scheduling algorithm.cpp
337 lines (278 loc) · 14.9 KB
/
Process scheduling algorithm.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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
#include <iomanip>
#include <sstream>
#include <queue>
using namespace std;
struct Process {
int id; // 进程编号
int arrivalTime; // 到达时间(分钟)
int burstTime; // 运行时间(分钟)`
int completionTime; // 完成时间(分钟)
double turnaroundTime; // 周转时间(完成时间 - 到达时间)
double weightedTurnaroundTime; // 带权周转时间(周转时间 / 运行时间)
double responseRatio; // 响应比
}PCB;
// 格式化时间输出(将分钟转换为小时和分钟表示)
string formatTime(int time) {
int hour = time / 60; //小时转换
int minute = time % 60; //分钟转换
return to_string(hour) + ":" + (minute < 10 ? "0" : "") + to_string(minute); //返回值=小时+:+分钟
}
// 创建就绪队列
vector<Process> createReadyQueueFCFS(vector<Process>& processes, int currentTime) {
vector<Process> readyQueue;
for (const Process& p : processes) {
if (p.arrivalTime <= currentTime) {
readyQueue.push_back(p);
}
}
return readyQueue;
}
// 先来先服务(FCFS)调度算法
void FCFS(vector<Process>& processes) {
// 根据到达时间对进程进行排序
sort(processes.begin(), processes.end(), [](const Process& a, const Process& b) {
return a.arrivalTime < b.arrivalTime;
});
int numProcesses = processes.size(); // 声明并初始化进程数量
int currentTime = 0; // 当前时间(分钟)
double totalTurnaroundTime = 0; // 总周转时间
double totalWeightedTurnaroundTime = 0; // 总带权周转时间
vector<Process> completedProcesses; // 存储已完成的进程
while (!processes.empty()) {
if (processes.front().arrivalTime > currentTime) {
currentTime = processes.front().arrivalTime;
}
Process& p = processes.front();
int waitingTime = currentTime - p.arrivalTime; // 等待时间=当前时间-到达时间
int completionTime = currentTime + p.burstTime; // 完成时间=当前时间+运行时间
int turnaroundTime = completionTime - p.arrivalTime; // 周转时间=完成时间-到达时间
double weightedTurnaroundTime = static_cast<double>(turnaroundTime) / p.burstTime; // 带权周转时间=周转时间/运行时间
totalTurnaroundTime += turnaroundTime; // 全部周转时间=等于各进程周转时间相加
totalWeightedTurnaroundTime += weightedTurnaroundTime; // 全部带权周转时间=等于各进程带权周转时间相加
// 打印当前调度进程的ID
cout << "当前调度进程ID:" << p.id << endl;
cout << "---------------------------------------------------------------------------------------" << endl;
cout << left << setw(8) << "进程ID" << setw(14) << "到达时间" << setw(14) << "运行时间(分钟)\t"
<< setw(14) << "完成时间" << setw(14) << "周转时间(分钟)\t" << "带权周转时间" << endl;
cout << "---------------------------------------------------------------------------------------" << endl;
// 打印进程信息
cout << left << setw(8) << p.id << setw(14) << formatTime(p.arrivalTime) << setw(14) << p.burstTime<<"\t"
<< setw(14) << formatTime(completionTime) << setw(14) << turnaroundTime
<< fixed << setprecision(2)<<"\t"<< weightedTurnaroundTime << endl;
cout << "---------------------------------------------------------------------------------------" << "\n\n" << endl;
// 更新进程的周转时间和带权周转时间
p.completionTime = completionTime;
p.turnaroundTime = turnaroundTime;
p.weightedTurnaroundTime = weightedTurnaroundTime;
// 将已完成的进程添加到completedProcesses
completedProcesses.push_back(p);
// 移除已完成的进程
processes.erase(processes.begin());
// 更新当前时间
currentTime = completionTime;
// 创建新的就绪队列
vector<Process> readyQueue = createReadyQueueFCFS(processes, currentTime);
// 如果就绪队列不为空,选择下一个进程
if (!readyQueue.empty()) {
// 打印表头信息
cout << "先来先服务(FCFS)调度过程:" << endl;
cout << "就绪队列:" << endl;
cout << left << setw(8) << "进程ID" << setw(14) << "到达时间" << setw(14) << "运行时间(分钟)" << endl;
for (const Process& readyProcess : readyQueue) {
cout << left << setw(8) << readyProcess.id << setw(14) << formatTime(readyProcess.arrivalTime) << setw(14) << readyProcess.burstTime << endl;
}
cout << "---------------------------------------------------------------------------------------" << endl;
Process& nextProcess = readyQueue.front();
currentTime = max(currentTime, nextProcess.arrivalTime);
}
else {
// 就绪队列为空,找到下一个到达时间最早的进程
int nextArrivalTime = numeric_limits<int>::max();
for (const Process& p : processes) {
if (p.arrivalTime > currentTime) {
nextArrivalTime = min(nextArrivalTime, p.arrivalTime);
}
}
currentTime = nextArrivalTime;
}
}
// 打印平均周转时间和平均带权周转时间
double avgTurnaroundTime = totalTurnaroundTime / numProcesses;
double avgWeightedTurnaroundTime = totalWeightedTurnaroundTime / numProcesses;
// 打印表头信息
cout << "先来先服务(FCFS)调度结果:" << endl;
cout << "---------------------------------------------------------------------------------------" << endl;
cout << left << setw(8) << "进程ID" << setw(14) << "到达时间" << setw(14) << "运行时间(分钟)\t"
<< setw(14) << "完成时间" << setw(14) << "周转时间(分钟)\t" << "带权周转时间" << endl;
cout << "---------------------------------------------------------------------------------------" << endl;
for (const Process& p : completedProcesses) {
int completionTime = p.completionTime;
int turnaroundTime = p.turnaroundTime;
double weightedTurnaroundTime = p.weightedTurnaroundTime;
// 打印进程信息
cout << left << setw(8) << p.id << setw(14) << formatTime(p.arrivalTime) << setw(14) << p.burstTime << "\t"
<< setw(14) << formatTime(completionTime) << setw(14) << turnaroundTime
<< fixed << setprecision(2) << "\t" << weightedTurnaroundTime << endl;
}
cout << "---------------------------------------------------------------------------------------" << "\n" << endl;
cout << "平均周转时间(分钟): " << avgTurnaroundTime << endl;
cout << "平均带权周转时间: " << avgWeightedTurnaroundTime << endl;
}
// 创建就绪队列
vector<Process> createReadyQueueHRRN(vector<Process>& processes, int currentTime) {
vector<Process> readyQueue;
for (const Process& p : processes) {
if (p.arrivalTime <= currentTime) {
double responseRatio = (currentTime - p.arrivalTime + p.burstTime) / static_cast<double>(p.burstTime);
readyQueue.push_back({ p.id, p.arrivalTime, p.burstTime, p.completionTime, p.turnaroundTime, p.weightedTurnaroundTime, responseRatio });
}
}
return readyQueue;
}
void HRRN(vector<Process>& processes) {
sort(processes.begin(), processes.end(), [](const Process& a, const Process& b) {
return a.arrivalTime < b.arrivalTime;
});
int currentTime = 0;
double totalTurnaroundTime = 0;
double totalWeightedTurnaroundTime = 0;
int numValidProcesses = 0;
vector<Process> completedProcesses;
while (!processes.empty()) {
if (processes.front().arrivalTime > currentTime) {
currentTime = processes.front().arrivalTime;
}
vector<Process> readyQueue = createReadyQueueHRRN(processes, currentTime);
if (readyQueue.empty()) {
currentTime++;
continue;
}
double maxResponseRatio = numeric_limits<double>::min();
int selectedProcessIndex = -1;
for (int i = 0; i < readyQueue.size(); i++) {
Process& process = readyQueue[i];
double responseRatio = (currentTime - process.arrivalTime + process.burstTime) / static_cast<double>(process.burstTime);
process.responseRatio = responseRatio;
if (responseRatio > maxResponseRatio) {
maxResponseRatio = responseRatio;
selectedProcessIndex = i;
}
}
Process& selectedProcess = readyQueue[selectedProcessIndex];
int completionTime = currentTime + selectedProcess.burstTime;
int turnaroundTime = completionTime - selectedProcess.arrivalTime;
double weightedTurnaroundTime = static_cast<double>(turnaroundTime) / selectedProcess.burstTime;
totalTurnaroundTime += turnaroundTime;
totalWeightedTurnaroundTime += weightedTurnaroundTime;
numValidProcesses++;
// 打印表头信息
cout << "高响应比优先(HRRN)调度过程:" << endl;
// 打印就绪队列信息
cout << "就绪队列:" << endl;
cout << left << setw(8) << "进程ID" << setw(14) << "到达时间" << setw(14) << "运行时间(分钟)\t" << "响应比" << endl;
for (const Process& process : readyQueue) {
cout << left << setw(8) << process.id << setw(14) << formatTime(process.arrivalTime) << setw(14) << process.burstTime<<"\t" << process.responseRatio << endl;
}
cout << "-----------------------------------------------------------------------------------------------" << endl;
// 打印当前调度进程的ID
cout << "当前调度进程ID:" << selectedProcess.id << endl;
cout << "-----------------------------------------------------------------------------------------------" << endl;
cout << left << setw(8) << "进程ID" << setw(14) << "到达时间" << setw(14) << "运行时间(分钟)\t"
<< setw(14) << "完成时间" << setw(14) << "周转时间(分钟)\t" << setw(14) << "带权周转时间" << "响应比" << endl;
cout << "-----------------------------------------------------------------------------------------------" << endl;
// 打印当前进程信息
cout << left << setw(8) << selectedProcess.id << setw(14) << formatTime(selectedProcess.arrivalTime)
<< setw(14) << selectedProcess.burstTime <<"\t" << setw(14) << formatTime(completionTime)
<< setw(14) << turnaroundTime <<"\t" << setw(14) << fixed << setprecision(2) << weightedTurnaroundTime
<< selectedProcess.responseRatio << endl;
cout << "-----------------------------------------------------------------------------------------------" << "\n\n" << endl;
// 更新选中进程的属性
selectedProcess.completionTime = completionTime;
selectedProcess.turnaroundTime = turnaroundTime;
selectedProcess.weightedTurnaroundTime = weightedTurnaroundTime;
// 移除已完成的进程
processes.erase(processes.begin() + selectedProcessIndex);
// 将选中的进程添加到已完成进程的向量
completedProcesses.push_back(selectedProcess);
currentTime = completionTime;
}
cout << "\n\n\nHRRN调度进程的整体输出结果:" << endl;
cout << "-----------------------------------------------------------------------------------------------" << endl;
cout << left << setw(8) << "进程ID" << setw(14) << "到达时间" << setw(14) << "运行时间(分钟)\t"
<< setw(14) << "完成时间" << setw(14) << "周转时间(分钟)\t" << setw(14) << "带权周转时间" << "响应比" << endl;
cout << "-----------------------------------------------------------------------------------------------" << endl;
for (const Process& p : completedProcesses) {
int completionTime = p.completionTime;
int turnaroundTime = p.turnaroundTime;
double weightedTurnaroundTime = p.weightedTurnaroundTime;
// 打印进程信息,并使用正确的格式化函数和格式
cout << left << setw(8) << p.id << setw(14) << formatTime(p.arrivalTime) << setw(14) << p.burstTime<<"\t"
<< setw(14) << formatTime(completionTime) << setw(14) << turnaroundTime<<"\t"
<< fixed << setprecision(2) << setw(14) << weightedTurnaroundTime << p.responseRatio << endl;
}
cout << "-----------------------------------------------------------------------------------------------" << endl;
// 计算并打印平均周转时间和平均带权周转时间
double avgTurnaroundTime = totalTurnaroundTime / numValidProcesses;
double avgWeightedTurnaroundTime = totalWeightedTurnaroundTime / numValidProcesses;
cout << "\n平均周转时间(分钟):" << avgTurnaroundTime << endl;
cout << "平均带权周转时间:" << avgWeightedTurnaroundTime << endl;
}
int main() {
int choice;
vector<Process> processes;
cout << "\t\t\t\t\t*************************************************" << endl;
cout << "\t\t\t\t\t* *" << endl;
cout << "\t\t\t\t\t*㊣ 处理机调度算法模拟程序 ㊣*" << endl;
cout << "\t\t\t\t\t* 第十八组 *" << endl;
cout << "\t\t\t\t\t* 学 号:202196124059 202196124060 *" << endl;
cout << "\t\t\t\t\t* 姓 名: 李 阳 李智英 *" << endl;
cout << "\t\t\t\t\t* *" << endl;
cout << "\t\t\t\t\t* *" << endl;
cout << "\t\t\t\t\t*************************************************" << endl;
while (true) {
cout << "\n\t\t\t\t\t选择调度算法:" << endl;
cout << "\t\t\t\t\t1. 先来先服务(FCFS)" << endl;
cout << "\t\t\t\t\t2. 高响应比优先(HRRN)" << endl;
cout << "\t\t\t\t\t3. 退出" << endl;
cout << "\t\t\t\t\t请输入选项号:";
cin >> choice;
if (choice == 3) {
break;
}
int numProcesses;
cout << "\n\t\t\t\t\t输入进程数量:";
cin >> numProcesses;
cout << "\t\t\t\t\t输入每个进程的到达时间和运行时间:" << endl;
//for循环输入进程数量,输入规则到达时间(小时+空格+分钟),输入完回车开始输入运行时间(分钟)
for (int i = 0; i < numProcesses; i++) {
Process p;
p.id = i + 1;
cout << "\n\t\t\t\t\t进程 " << p.id << ":" << endl;
cout << "\t\t\t\t\t到达时间(小时:分钟):";
int hours, minutes;
char colon;
cin >> hours >> colon >> minutes;
p.arrivalTime = hours * 60 + minutes;
cout << "\t\t\t\t\t运行时间(分钟):";
cin >> p.burstTime;
processes.push_back(p);
}
switch (choice) {
case 1:
FCFS(processes);
break;
case 2:
HRRN(processes);
break;
default:
cout << "\t\t\t\t\t无效的选项!" << endl;
}
// 清空进程列表
processes.clear();
}
return 0;
}