c语言编写并调试一个模拟的进程调度程序,采用 “先来先服务”调度算法对多个进程进行调度。计算平均周转时间和平均带权周转时间。
时间: 2023-07-31 19:06:17 浏览: 86
下面是一个基于 C 语言实现的先来先服务(FCFS)调度算法的进程调度程序,包括计算平均周转时间和平均带权周转时间。
```c
#include <stdio.h>
#include <stdlib.h>
struct process {
int pid; // 进程 ID
int arrival; // 到达时间
int burst; // 执行时间
};
int main() {
int n, i, j;
float avg_tat = 0, avg_wt = 0; // 平均周转时间和平均带权周转时间
printf("Enter the number of processes: ");
scanf("%d", &n);
struct process p[n];
for (i = 0; i < n; i++) {
printf("Enter arrival time and burst time for process %d: ", i + 1);
scanf("%d %d", &p[i].arrival, &p[i].burst);
p[i].pid = i + 1;
}
// 按照到达时间排序
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
if (p[j].arrival > p[j + 1].arrival) {
struct process temp = p[j];
p[j] = p[j + 1];
p[j + 1] = temp;
}
}
}
int completion[n], turnaround[n], waiting[n];
waiting[0] = 0;
completion[0] = p[0].burst + p[0].arrival;
turnaround[0] = completion[0] - p[0].arrival;
avg_tat = avg_wt = turnaround[0];
for (i = 1; i < n; i++) {
waiting[i] = completion[i - 1] - p[i].arrival;
completion[i] = completion[i - 1] + p[i].burst;
turnaround[i] = completion[i] - p[i].arrival;
avg_tat += turnaround[i];
avg_wt += waiting[i];
}
printf("\nProcess\tArrival\tBurst\tCompletion\tTurnaround\tWaiting\n");
for (i = 0; i < n; i++) {
printf("%d\t%d\t%d\t%d\t\t%d\t\t%d\n", p[i].pid, p[i].arrival, p[i].burst, completion[i], turnaround[i], waiting[i]);
}
printf("\nAverage Turnaround Time = %f\n", avg_tat / n);
printf("Average Waiting Time = %f\n", avg_wt / n);
return 0;
}
```
代码中使用了一个 `struct process` 结构体来存储进程的信息,包括进程 ID、到达时间和执行时间。首先输入进程的数量和每个进程的到达时间和执行时间,然后按照到达时间对进程进行排序。接着计算完成时间、周转时间和等待时间,并输出结果。最后计算平均周转时间和平均带权周转时间并输出。
这里使用的是简单的排序算法,如果需要更高效的排序算法可以使用快速排序、归并排序等。另外,这个程序没有考虑进程的优先级,如果需要实现优先级调度算法可以在结构体中添加一个优先级字段,并按照优先级进行排序。
阅读全文