用2010年版的C语言编写并调试一个单道处理系统的进程等待模拟程序,实现先来先服务(FCFS)与最短作业优先(SJF),求计算并输出每个进程开始运行时刻、完成时刻、周转时间
时间: 2024-02-06 21:10:45 浏览: 81
这是一个比较复杂的问题,需要分几个步骤来完成。首先,我们需要定义进程的数据结构,包括进程ID、到达时间、服务时间、开始时间、完成时间、周转时间等信息。代码如下:
```
#include <stdio.h>
struct process {
int pid; // 进程ID
int arrival; // 到达时间
int service; // 服务时间
int start; // 开始时间
int finish; // 完成时间
int turnaround; // 周转时间
};
```
接下来,我们需要编写两个函数,分别实现 FCFS 和 SJF 调度算法。这里我们采用数组来存储进程,按照到达时间从小到大排序。FCFS 算法很简单,只需要按照到达时间依次执行即可。代码如下:
```
void fcfs(struct process p[], int n)
{
int time = 0;
for (int i = 0; i < n; i++) {
if (p[i].arrival > time) {
time = p[i].arrival;
}
p[i].start = time;
p[i].finish = time + p[i].service;
p[i].turnaround = p[i].finish - p[i].arrival;
time = p[i].finish;
}
}
```
SJF 算法需要实现一个比较函数,按照服务时间从小到大排序。然后每次选择服务时间最小的进程执行。代码如下:
```
int cmp(const void *a, const void *b)
{
struct process *p1 = (struct process *)a;
struct process *p2 = (struct process *)b;
return p1->service - p2->service;
}
void sjf(struct process p[], int n)
{
int time = 0;
qsort(p, n, sizeof(struct process), cmp);
for (int i = 0; i < n; i++) {
if (p[i].arrival > time) {
time = p[i].arrival;
}
p[i].start = time;
p[i].finish = time + p[i].service;
p[i].turnaround = p[i].finish - p[i].arrival;
time = p[i].finish;
}
}
```
最后,我们可以编写一个主函数来读入进程信息,调用两个调度函数,并输出每个进程的开始时间、完成时间和周转时间。代码如下:
```
int main()
{
int n;
struct process p[100];
printf("Enter the number of processes: ");
scanf("%d", &n);
printf("Enter the arrival time and service time of each process:\n");
for (int i = 0; i < n; i++) {
scanf("%d %d", &p[i].arrival, &p[i].service);
p[i].pid = i + 1;
}
fcfs(p, n);
printf("FCFS:\n");
printf("PID\tStart\tFinish\tTurnaround\n");
for (int i = 0; i < n; i++) {
printf("%d\t%d\t%d\t%d\n", p[i].pid, p[i].start, p[i].finish, p[i].turnaround);
}
sjf(p, n);
printf("SJF:\n");
printf("PID\tStart\tFinish\tTurnaround\n");
for (int i = 0; i < n; i++) {
printf("%d\t%d\t%d\t%d\n", p[i].pid, p[i].start, p[i].finish, p[i].turnaround);
}
return 0;
}
```
这样就完成了一个简单的单道处理系统的进程等待模拟程序,实现了先来先服务和最短作业优先两种调度算法,并输出了每个进程的开始时间、完成时间和周转时间。
阅读全文