代码解析// 短作业优先 void SJF() { // 按到到达顺序排序 for (int i = 1; i < num; i++) { for (int j = 1; j < num; j++) { if (p[j].arrival_time > p[j+1].arrival_time) { p[0] = p[j]; p[j] = p[j+1]; p[j+1] = p[0]; } // 到达顺序相同 按服务时间排序 else if (p[j].arrival_time == p[j+1].arrival_time) { if (p[j].burst_time > p[j+1].burst_time) { p[0] = p[j]; p[j] = p[j+1]; p[j+1] = p[0]; } } } } p[1].start_time = p[1].arrival_time; p[1].finished_time = p[1].arrival_time + p[1].burst_time; p[1].T = p[1].finished_time - p[1].arrival_time; p[1].W = p[1].T / p[1].burst_time; int time = p[1].finished_time; // 过程 for (int i = 2; i <= num; i++) { for (int j = i+1; j <= num; j++) { if (time > p[j].arrival_time) { if (p[i].burst_time > p[j].burst_time) { p[0] = p[j]; p[j] = p[i]; p[i] = p[0]; } } else { continue; } } p[i].start_time = p[i-1].start_time + p[i-1].burst_time; p[i].finished_time = p[i-1].finished_time + p[i].burst_time; p[i].T = p[i].finished_time - p[i].arrival_time; p[i].W = (double)p[i].T / p[i].burst_time; time = p[i].finished_time; } double sum_T = 0; double sum_W = 0; for (int i = 1; i <= num; i++) { sum_T += p[i].T; sum_W += p[i].W; } double o_T = sum_T / num; double o_W = sum_W / num; printf("\nSJF "); display(); printf("\n平均周转时间:%.2lf", o_T); printf("\n平均带权周转时间:%.2lf", o_W); }
时间: 2023-07-15 11:12:17 浏览: 62
这是一个实现短作业优先算法的函数,主要实现以下几个步骤:
1. 按到达时间进行排序,如果到达时间相同,再按服务时间排序,以确定作业的执行顺序;
2. 对第一个作业进行特殊处理,记录其开始时间、完成时间、周转时间和带权周转时间;
3. 对于后续作业,每次选择剩余未执行的作业中服务时间最短的作业执行,记录其开始时间、完成时间、周转时间和带权周转时间;
4. 计算所有作业的平均周转时间和平均带权周转时间。
具体代码实现如下:
```C++
void SJF() {
// 按到达顺序排序
for (int i = 1; i < num; i++) {
for (int j = 1; j < num; j++) {
if (p[j].arrival_time > p[j+1].arrival_time) {
p[0] = p[j];
p[j] = p[j+1];
p[j+1] = p[0];
}
// 到达顺序相同 按服务时间排序
else if (p[j].arrival_time == p[j+1].arrival_time) {
if (p[j].burst_time > p[j+1].burst_time) {
p[0] = p[j];
p[j] = p[j+1];
p[j+1] = p[0];
}
}
}
}
// 处理第一个作业
p[1].start_time = p[1].arrival_time;
p[1].finished_time = p[1].arrival_time + p[1].burst_time;
p[1].T = p[1].finished_time - p[1].arrival_time;
p[1].W = p[1].T / p[1].burst_time;
int time = p[1].finished_time;
// 处理后续作业
for (int i = 2; i <= num; i++) {
for (int j = i+1; j <= num; j++) {
if (time > p[j].arrival_time) {
if (p[i].burst_time > p[j].burst_time) {
p[0] = p[j];
p[j] = p[i];
p[i] = p[0];
}
} else {
continue;
}
}
p[i].start_time = p[i-1].start_time + p[i-1].burst_time;
p[i].finished_time = p[i-1].finished_time + p[i].burst_time;
p[i].T = p[i].finished_time - p[i].arrival_time;
p[i].W = (double)p[i].T / p[i].burst_time;
time = p[i].finished_time;
}
// 计算平均周转时间和平均带权周转时间
double sum_T = 0;
double sum_W = 0;
for (int i = 1; i <= num; i++) {
sum_T += p[i].T;
sum_W += p[i].W;
}
double o_T = sum_T / num;
double o_W = sum_W / num;
printf("\nSJF ");
display();
printf("\n平均周转时间:%.2lf", o_T);
printf("\n平均带权周转时间:%.2lf", o_W);
}
```
阅读全文