用c语言实现最短作业优先算法的作业调度
时间: 2023-09-23 18:11:16 浏览: 173
最短作业优先算法(Shortest Job First, SJF)是一种非抢占式的作业调度算法,它按照作业需要的 CPU 时间长短来排序,先调度执行需要时间最短的作业。以下是用 C 语言实现 SJF 算法的代码示例:
```c
#include<stdio.h>
#include<stdlib.h>
typedef struct {
int pid; // 进程编号
int arrival_time; // 到达时间
int burst_time; // 执行时间
int waiting_time; // 等待时间
int turnaround_time; // 周转时间
int completion_time; // 完成时间
} process;
// 按照到达时间排序
int cmp(const void *a, const void *b) {
process *p1 = (process*)a;
process *p2 = (process*)b;
return p1->arrival_time - p2->arrival_time;
}
int main() {
int n, i, j;
float avg_waiting_time = 0, avg_turnaround_time = 0;
printf("请输入进程数:");
scanf("%d", &n);
process p[n];
for(i=0; i<n; i++) {
printf("请输入第 %d 个进程的到达时间和执行时间:", i+1);
scanf("%d%d", &p[i].arrival_time, &p[i].burst_time);
p[i].pid = i+1;
}
qsort(p, n, sizeof(process), cmp);
p[0].completion_time = p[0].arrival_time + p[0].burst_time;
p[0].turnaround_time = p[0].completion_time - p[0].arrival_time;
p[0].waiting_time = p[0].turnaround_time - p[0].burst_time;
// 计算每个进程的等待时间,周转时间和完成时间
for(i=1; i<n; i++) {
int min_burst_time = p[i].burst_time;
int min_burst_index = i;
for(j=i+1; j<n; j++) {
if(p[j].arrival_time <= p[i-1].completion_time && p[j].burst_time < min_burst_time) {
min_burst_time = p[j].burst_time;
min_burst_index = j;
}
}
// 交换位置
process tmp = p[i];
p[i] = p[min_burst_index];
p[min_burst_index] = tmp;
p[i].completion_time = p[i-1].completion_time + p[i].burst_time;
p[i].turnaround_time = p[i].completion_time - p[i].arrival_time;
p[i].waiting_time = p[i].turnaround_time - p[i].burst_time;
}
// 输出每个进程的信息
printf("进程\t到达时间\t执行时间\t完成时间\t等待时间\t周转时间\n");
for(i=0; i<n; i++) {
printf("%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n", p[i].pid, p[i].arrival_time, p[i].burst_time, p[i].completion_time, p[i].waiting_time, p[i].turnaround_time);
avg_waiting_time += p[i].waiting_time;
avg_turnaround_time += p[i].turnaround_time;
}
avg_waiting_time /= n;
avg_turnaround_time /= n;
printf("平均等待时间:%.2f\n", avg_waiting_time);
printf("平均周转时间:%.2f\n", avg_turnaround_time);
return 0;
}
```
以上代码会先让用户输入进程数量以及每个进程的到达时间和执行时间,然后按照到达时间排序,最后计算每个进程的等待时间,周转时间和完成时间,并输出信息和平均等待时间及平均周转时间。
阅读全文