用C语言编写“最短作业优先(SJF)” 调度算法,编写以 下函数,计算平均带权周转时间并返回。 注意: 1)不要修改函数名、函数返回类型、参数个数、参数名和参数类型。 2)函数输入参数说明: arrival_time:作业达到时间数组 run_time: 作业运行时间数组 num:作业数 3)函数返回值:作业平均带权周转时间
时间: 2024-02-23 13:02:12 浏览: 71
以下是用 C 语言编写的计算 SJF 调度算法平均带权周转时间的函数:
```c
float sjf(float arrival_time[], float run_time[], int num) {
float wait_time[num]; // 等待时间数组
float tat[num]; // 周转时间数组
float total_wt = 0, total_tat = 0; // 总等待时间和总周转时间
int i, j;
// 计算等待时间和周转时间
for (i = 0; i < num; i++) {
wait_time[i] = 0;
tat[i] = 0;
for (j = 0; j < i; j++) {
wait_time[i] += run_time[j];
}
tat[i] = wait_time[i] + run_time[i];
total_wt += wait_time[i];
total_tat += tat[i];
}
// 计算平均带权周转时间并返回
return total_tat / total_wt;
}
```
此函数实现了 SJF 调度算法,并计算了平均带权周转时间,输入参数为作业达到时间数组、作业运行时间数组和作业数,返回值为作业平均带权周转时间。
相关问题
编写C语言程序,模拟“最短作业优先(SJF)” 调度算法,编写以下函数,计算平均带权周转时间并返回。 注意:1)不要修改函数名、函数返回类型、参数个数、参数名和参数类型。2)函数输入参数说明:arrival_time:作业达到时间数组run_time: 作业运行时间数组num:作业数3)函数返回值:作业平均带权周转时间
以下是实现最短作业优先(SJF)算法计算平均带权周转时间的 C 语言代码:
```c
float sjf(float arrival_time[], float run_time[], int num) {
float completion_time[num], turn_around_time[num], waiting_time[num], total_waiting_time = 0, total_turn_around_time = 0;
// 完成时间初始化为0
for (int i = 0; i < num; i++) {
completion_time[i] = 0;
}
// 按到达时间排序作业
for (int i = 0; i < num; i++) {
for (int j = i + 1; j < num; j++) {
if (arrival_time[i] > arrival_time[j]) {
float temp = arrival_time[i];
arrival_time[i] = arrival_time[j];
arrival_time[j] = temp;
temp = run_time[i];
run_time[i] = run_time[j];
run_time[j] = temp;
}
}
}
// 计算完成时间和周转时间
for (int i = 0; i < num; i++) {
if (i == 0) {
completion_time[i] = arrival_time[i] + run_time[i];
} else {
if (arrival_time[i] > completion_time[i - 1]) {
completion_time[i] = arrival_time[i] + run_time[i];
} else {
completion_time[i] = completion_time[i - 1] + run_time[i];
}
}
turn_around_time[i] = completion_time[i] - arrival_time[i];
}
// 计算带权周转时间和平均带权周转时间
for (int i = 0; i < num; i++) {
waiting_time[i] = turn_around_time[i] - run_time[i];
total_waiting_time += waiting_time[i];
total_turn_around_time += turn_around_time[i];
}
return total_turn_around_time / num / run_time[0];
}
```
该函数的参数为到达时间数组 `arrival_time`、运行时间数组 `run_time` 和作业数 `num`。函数返回值为计算得到的平均带权周转时间。
函数首先初始化完成时间数组为0,然后按到达时间对作业进行排序。接着,计算完成时间和周转时间,并计算带权周转时间和平均带权周转时间,最后返回平均带权周转时间。
用c语言实现最短作业优先算法的作业调度
最短作业优先算法(Shortest Job First,简称为SJF)是一种基于作业长度的调度算法,它的核心思想是优先调度执行时间最短的作业,以最大化系统资源的利用率和作业的平均周转时间。
以下是用C语言实现SJF算法的代码:
```c
#include<stdio.h>
struct process {
int pid; // 进程ID
int bt; // 进程执行时间
int at; // 进程到达时间
};
// 按到达时间对进程进行排序
void sortByArrival(struct process proc[], int n) {
struct process temp;
int i, j;
for(i = 0; i < n-1; i++) {
for(j = i+1; j < n; j++) {
if(proc[i].at > proc[j].at) {
temp = proc[i];
proc[i] = proc[j];
proc[j] = temp;
}
}
}
}
// 执行SJF算法
void sjf(struct process proc[], int n) {
int wt[n], tat[n], ct[n];
int i, j, t, sum = 0;
float avgwt = 0, avgtat = 0;
sortByArrival(proc, n);
// 计算完成时间
for(i = 0; i < n; i++) {
t = 0;
for(j = 0; j < i; j++) {
t += proc[j].bt;
}
ct[i] = t + proc[i].bt;
sum += ct[i];
}
// 计算周转时间和等待时间
for(i = 0; i < n; i++) {
tat[i] = ct[i] - proc[i].at;
wt[i] = tat[i] - proc[i].bt;
avgwt += wt[i];
avgtat += tat[i];
}
// 输出结果
printf("\nProcess\tBurst Time\tArrival Time\tCompletion Time\tWaiting Time\tTurnaround Time\n");
for(i = 0; i < n; i++) {
printf("%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n", proc[i].pid, proc[i].bt, proc[i].at, ct[i], wt[i], tat[i]);
}
printf("Average Waiting Time: %f\n", avgwt/n);
printf("Average Turnaround Time: %f\n", avgtat/n);
}
int main() {
struct process proc[] = {{1, 6, 1}, {2, 8, 1}, {3, 7, 2}, {4, 3, 3}};
int n = sizeof(proc)/sizeof(proc[0]);
sjf(proc, n);
return 0;
}
```
这个程序实现了SJF算法,其中包括了排序函数sortByArrival和算法函数sjf。sortByArrival函数按到达时间对进程进行排序,sjf函数计算完成时间、周转时间、等待时间,并输出结果。程序中的四个进程的信息是预先定义的,你可以根据需要修改。
阅读全文