用C语言编写并调试一个模拟的进程调度程序,采用 “先 来先服务”调度算法对多个进程进行调度。 计算平均周转时间和平均带权周转时间。
时间: 2024-01-22 21:17:27 浏览: 161
好的,下面是一个简单的模拟进程调度程序,采用先来先服务(FCFS)调度算法。程序会要求用户输入一组进程的到达时间和服务时间,然后计算出这些进程的平均周转时间和平均带权周转时间。
```c
#include <stdio.h>
// 进程结构体
typedef struct {
int pid; // 进程ID
int arriveTime; // 到达时间
int serveTime; // 服务时间
int startTime; // 开始时间
int finishTime; // 完成时间
float turnaround; // 周转时间
float wTurnaround; // 带权周转时间
} Process;
int main() {
int n; // 进程数量
int i, j; // 循环变量
float avgTAT; // 平均周转时间
float avgWTAT; // 平均带权周转时间
float sumTAT; // 总周转时间
float sumWTAT; // 总带权周转时间
Process p[20]; // 进程数组,最多支持20个进程
// 输入进程数量和每个进程的到达时间和服务时间
printf("请输入进程数量: ");
scanf("%d", &n);
printf("请输入每个进程的到达时间和服务时间:\n");
for (i = 0; i < n; i++) {
printf("进程 %d: ", i + 1);
scanf("%d %d", &p[i].arriveTime, &p[i].serveTime);
p[i].pid = i + 1;
}
// 按到达时间排序
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (p[i].arriveTime > p[j].arriveTime) {
Process temp = p[i];
p[i] = p[j];
p[j] = temp;
}
}
}
// 计算进程的开始时间、完成时间、周转时间和带权周转时间
for (i = 0; i < n; i++) {
if (i == 0) {
p[i].startTime = p[i].arriveTime;
} else {
p[i].startTime = p[i - 1].finishTime;
}
p[i].finishTime = p[i].startTime + p[i].serveTime;
p[i].turnaround = p[i].finishTime - p[i].arriveTime;
p[i].wTurnaround = p[i].turnaround / p[i].serveTime;
sumTAT += p[i].turnaround;
sumWTAT += p[i].wTurnaround;
}
// 输出每个进程的信息
printf("\n进程信息:\n");
printf("进程ID 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间\n");
for (i = 0; i < n; i++) {
printf("%-8d%-9d%-9d%-9d%-10d%-9.2f%-9.2f\n", p[i].pid, p[i].arriveTime, p[i].serveTime,
p[i].startTime, p[i].finishTime, p[i].turnaround, p[i].wTurnaround);
}
// 计算平均周转时间和平均带权周转时间
avgTAT = sumTAT / n;
avgWTAT = sumWTAT / n;
printf("\n平均周转时间: %.2f\n", avgTAT);
printf("平均带权周转时间: %.2f\n", avgWTAT);
return 0;
}
```
上面的代码中,我们定义了一个 `Process` 结构体,用来存储每个进程的信息。程序首先要求用户输入进程的数量和每个进程的到达时间和服务时间,然后按到达时间排序,并计算出进程的开始时间、完成时间、周转时间和带权周转时间。最后输出每个进程的信息,以及平均周转时间和平均带权周转时间。
你可以按照上面的代码,自己编写并调试一个模拟的进程调度程序。如果遇到问题,可以在评论区留言。
阅读全文