编写C程序,模拟“最短作业优先(SJF)” 调度算法,编写以下函数,计算平均带权周转时间并返回double sjf_weighted_time (int *arrival_time, int *run_time, int num){ }
时间: 2024-02-25 09:55:28 浏览: 83
好的,我了解了您的要求,下面是一个参考实现:
```c
#include <stdio.h>
double sjf_weighted_time(int *arrival_time, int *run_time, int num) {
int i, j, min_index, current_time;
double total_time = 0, total_weight = 0;
int *remaining_time = malloc(num * sizeof(int)); // 用于记录每个作业的剩余执行时间
int *finished = malloc(num * sizeof(int)); // 用于记录每个作业是否已经执行完毕
// 初始化剩余执行时间和已完成标记
for (i = 0; i < num; i++) {
remaining_time[i] = run_time[i];
finished[i] = 0;
}
current_time = 0;
for (i = 0; i < num; i++) {
// 选取剩余执行时间最短的作业
min_index = -1;
for (j = 0; j < num; j++) {
if (!finished[j] && (min_index == -1 || remaining_time[j] < remaining_time[min_index])) {
min_index = j;
}
}
// 更新当前时间和剩余执行时间
current_time += remaining_time[min_index];
remaining_time[min_index] = 0;
// 计算带权周转时间和带权重
total_time += current_time - arrival_time[min_index];
total_weight += (current_time - arrival_time[min_index]) / (double) run_time[min_index];
// 标记作业已完成
finished[min_index] = 1;
}
free(remaining_time);
free(finished);
return total_weight / num;
}
int main() {
int arrival_time[] = {0, 1, 2, 3};
int run_time[] = {6, 8, 7, 3};
int num = 4;
double weighted_time = sjf_weighted_time(arrival_time, run_time, num);
printf("平均带权周转时间为 %.2f\n", weighted_time);
return 0;
}
```
在上面的代码中,我们使用了两个数组来记录每个作业的剩余执行时间和是否已经完成。在每次循环中,我们选取剩余执行时间最短的作业进行执行,并更新当前时间和剩余执行时间。然后计算带权周转时间和带权重,并标记作业已完成。最后计算所有作业的平均带权周转时间并返回。
注意,在实际使用时,需要按照作业的到达时间进行排序,以保证算法的正确性。
阅读全文