编写C或C++程序,模拟“最短作业优先(SJF)” 调度算法,编写以下函数,计算平均带权周转时间并返回。double sjf weighted time(int* arrival time, int* run time, int num)int ij,k,a,time; double total time=0, total wt=0, avg time, avg _wt;typedef struct int arrive; int run;int finish; int total; line;
时间: 2023-12-11 21:06:11 浏览: 60
C++实现CPU调度算法先来先服务(FCFS),非抢占最短作业优先调度(SJF),优先级调度,时间片轮转调度(RR)并输出相应的平均等待时间和平均周转时间。
5星 · 资源好评率100%
好的,我会为您编写这个函数。根据您提供的参数,我理解您希望模拟最短作业优先调度算法,计算出平均带权周转时间。下面是我为您编写的代码:
```
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct {
int arrive; // 到达时间
int run; // 运行时间
int finish; // 完成时间
int total; // 带权周转时间
} process;
bool cmp(process a, process b) {
return a.arrive < b.arrive;
}
double sjf_weighted_time(int* arrival_time, int* run_time, int num) {
process p[num];
int finish_time[num] = {0}; // 记录每个进程的完成时间
double total_time = 0, total_wt = 0;
for (int i = 0; i < num; i++) {
p[i].arrive = arrival_time[i];
p[i].run = run_time[i];
}
sort(p, p + num, cmp);
for (int i = 0; i < num; i++) {
int j = 0, min_run_time = INT_MAX;
for (int k = 0; k < num; k++) {
if (finish_time[k] == 0 && p[k].arrive <= p[j].finish && p[k].run < min_run_time) {
j = k;
min_run_time = p[k].run;
}
}
finish_time[j] = p[j].finish = p[j].arrive + p[j].run;
p[j].total = p[j].finish - p[j].arrive;
total_wt += p[j].total / (double)p[j].run;
total_time += p[j].total;
}
double avg_time = total_time / num;
double avg_wt = total_wt / num;
return avg_wt;
}
int main() {
int arrival_time[] = {0, 1, 2, 3};
int run_time[] = {8, 4, 9, 5};
int num = sizeof(arrival_time) / sizeof(arrival_time[0]);
double avg_wt = sjf_weighted_time(arrival_time, run_time, num);
cout << "Average weighted turnaround time: " << avg_wt << endl;
return 0;
}
```
这个函数中,我们首先定义了一个 `process` 结构体,用于存储每个进程的到达时间、运行时间、完成时间和带权周转时间。然后,我们使用 `sort` 函数对进程按照到达时间进行排序,以便之后按照顺序进行调度。接下来,我们使用一个循环,依次调度每个进程,计算出它的完成时间、带权周转时间,并累加到总的完成时间和带权周转时间中。最后,我们计算出平均带权周转时间并返回。
为了验证代码的正确性,我在 `main` 函数中提供了一组测试数据,您可以根据需要进行修改。运行程序后,它将输出平均带权周转时间。
阅读全文