短作业优先算法c语言
时间: 2023-08-18 10:07:53 浏览: 130
短作业优先算法(Shortest Job First,简称 SJF)是一种常见的进程调度算法,它的核心思想是优先调度执行时间短的进程。在实现上,可以采用非抢占式或者抢占式的方式。下面是一个使用 C 语言实现的非抢占式 SJF 算法的伪代码:
```c
struct Process {
int id; // 进程 ID
int arrival_time; // 到达时间
int burst_time; // 执行时间
};
void SJF(struct Process processes[], int n) {
int waiting_time[n], turnaround_time[n], completion_time[n];
int total_waiting_time = 0, total_turnaround_time = 0;
// 按照到达时间升序排序
qsort(processes, n, sizeof(struct Process), cmp_arrival_time);
int current_time = 0;
for (int i = 0; i < n; i++) {
// 找到当前时间能执行的最短作业
int shortest_job = -1, shortest_time = INT_MAX;
for (int j = 0; j < n; j++) {
if (processes[j].arrival_time <= current_time && processes[j].burst_time < shortest_time) {
shortest_job = j;
shortest_time = processes[j].burst_time;
}
}
// 更新等待时间和周转时间
waiting_time[shortest_job] = current_time - processes[shortest_job].arrival_time;
turnaround_time[shortest_job] = waiting_time[shortest_job] + processes[shortest_job].burst_time;
total_waiting_time += waiting_time[shortest_job];
total_turnaround_time += turnaround_time[shortest_job];
// 更新当前时间和完成时间
current_time += processes[shortest_job].burst_time;
completion_time[shortest_job] = current_time;
}
// 输出结果
printf("Process\tArrival Time\tBurst Time\tWaiting Time\tTurnaround Time\tCompletion Time\n");
for (int i = 0; i < n; i++) {
printf("%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n", processes[i].id, processes[i].arrival_time, processes[i].burst_time, waiting_time[i], turnaround_time[i], completion_time[i]);
}
printf("Average waiting time: %.2f\n", (float)total_waiting_time / n);
printf("Average turnaround time: %.2f\n", (float)total_turnaround_time / n);
}
int cmp_arrival_time(const void *a, const void *b) {
return (((struct Process *)a)->arrival_time - ((struct Process *)b)->arrival_time);
}
```
其中,`Process` 结构体表示进程,`SJF` 函数实现了 SJF 算法,`cmp_arrival_time` 函数用于升序排序。在实现中,我们首先按照到达时间升序排序,然后依次找到当前时间能执行的最短作业,更新等待时间和周转时间,并更新当前时间和完成时间。最后,输出结果并计算平均等待时间和平均周转时间。
阅读全文