用C语言编写并调试一个单道处理系统的进程等待模拟程序,实现先来先服务(FCFS)与最短作业优先(SJF)
时间: 2024-01-14 08:01:55 浏览: 34
以下是使用C语言编写并调试一个单道处理系统的进程等待模拟程序,实现先来先服务(FCFS)与最短作业优先(SJF)的代码。
```
#include <stdio.h>
struct process {
int pid;
int arrival_time;
int burst_time;
int remaining_time;
};
void fcfs(struct process p[], int n) {
int waiting_time = 0, turnaround_time = 0;
for (int i = 0; i < n; i++) {
waiting_time += i == 0 ? 0 : p[i - 1].burst_time;
turnaround_time += p[i].burst_time;
}
printf("FCFS\n");
printf("Average Waiting Time: %f\n", (float) waiting_time / n);
printf("Average Turnaround Time: %f\n", (float) turnaround_time / n);
}
void sjf(struct process p[], int n) {
int waiting_time[n], turnaround_time[n], complete_time[n], total_waiting_time = 0, total_turnaround_time = 0;
for (int i = 0; i < n; i++) {
waiting_time[i] = 0;
turnaround_time[i] = 0;
complete_time[i] = p[i].burst_time;
}
int t = 0, min_burst_time = 99999, shortest_job_index = 0, finish_count = 0;
while (finish_count != n) {
for (int i = 0; i < n; i++) {
if (p[i].arrival_time <= t && p[i].remaining_time < min_burst_time && p[i].remaining_time > 0) {
shortest_job_index = i;
min_burst_time = p[i].remaining_time;
}
}
p[shortest_job_index].remaining_time--;
min_burst_time = p[shortest_job_index].remaining_time;
if (min_burst_time == 0) {
min_burst_time = 99999;
}
if (p[shortest_job_index].remaining_time == 0) {
finish_count++;
finish_time = t + 1;
waiting_time[shortest_job_index] = finish_time - p[shortest_job_index].burst_time - p[shortest_job_index].arrival_time;
if (waiting_time[shortest_job_index] < 0) {
waiting_time[shortest_job_index] = 0;
}
}
t++;
}
for (int i = 0; i < n; i++) {
turnaround_time[i] = p[i].burst_time + waiting_time[i];
total_waiting_time += waiting_time[i];
total_turnaround_time += turnaround_time[i];
}
printf("SJF\n");
printf("Average Waiting Time: %f\n", (float) total_waiting_time / n);
printf("Average Turnaround Time: %f\n", (float) total_turnaround_time / n);
}
int main() {
int n;
printf("Enter the number of processes: ");
scanf("%d", &n);
struct process p[n];
printf("Enter the arrival time and burst time for each process:\n");
for (int i = 0; i < n; i++) {
printf("Process %d: ", i + 1);
scanf("%d%d", &p[i].arrival_time, &p[i].burst_time);
p[i].pid = i + 1;
p[i].remaining_time = p[i].burst_time;
}
fcfs(p, n);
sjf(p, n);
return 0;
}
```
上述代码使用了结构体来表示进程,包含进程号、到达时间、执行时间和剩余执行时间等信息。实现了两个函数 `fcfs` 和 `sjf` 分别用于模拟先来先服务和最短作业优先算法。在 `fcfs` 函数中,使用循环计算等待时间和周转时间,并输出平均等待时间和平均周转时间。在 `sjf` 函数中,使用循环模拟执行过程,计算等待时间和周转时间,并输出平均等待时间和平均周转时间。
以上代码实现了单道处理系统的进程等待模拟程序,可以通过输入进程的到达时间和执行时间来模拟进程的执行过程,并计算出平均等待时间和平均周转时间,实现了先来先服务和最短作业优先算法。