采用短作业优先SJF调度进程运行,计算每个进程的周转时间,带权周转时间,并且计算所有进程的平均周转时间,带权平均周转时间; 要求模拟整个调度过程,输出每个时刻的进程运行状态,如“时刻3:进程B开始运行”; 要求输出计算出来的每个进程的周转时间,带权周转时间,所有进程的平均周转时间,带权平均周转时间,C语言代码
时间: 2024-03-07 14:48:29 浏览: 27
为了方便模拟整个调度过程,可以使用结构体来表示每个进程的信息,包括进程名、到达时间、运行时间、开始运行时间、结束运行时间、周转时间、带权周转时间等。
下面是使用短作业优先SJF调度算法的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char name[10]; // 进程名
int arrive_time; // 到达时间
int run_time; // 运行时间
int start_time; // 开始运行时间
int end_time; // 结束运行时间
int turnover_time; // 周转时间
float weight_turnover_time; // 带权周转时间
} Process;
void SJF(Process *processes, int n) {
int i, j, time = 0;
Process tmp;
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (processes[i].run_time > processes[j].run_time) {
tmp = processes[i];
processes[i] = processes[j];
processes[j] = tmp;
}
}
}
for (i = 0; i < n; i++) {
if (time < processes[i].arrive_time) {
printf("时刻%d:CPU空闲\n", time);
time = processes[i].arrive_time;
}
processes[i].start_time = time;
processes[i].end_time = time + processes[i].run_time;
printf("时刻%d:进程%s开始运行\n", time, processes[i].name);
time = processes[i].end_time;
processes[i].turnover_time = processes[i].end_time - processes[i].arrive_time;
processes[i].weight_turnover_time = (float) processes[i].turnover_time / processes[i].run_time;
}
}
int main() {
int n, i;
printf("请输入进程数量:");
scanf("%d", &n);
Process *processes = (Process*) malloc(n * sizeof(Process));
for (i = 0; i < n; i++) {
printf("请输入进程%d的名称、到达时间、运行时间:", i + 1);
scanf("%s%d%d", processes[i].name, &processes[i].arrive_time, &processes[i].run_time);
}
SJF(processes, n);
printf("进程\t到达时间\t运行时间\t开始时间\t结束时间\t周转时间\t带权周转时间\n");
for (i = 0; i < n; i++) {
printf("%s\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%.2f\n", processes[i].name, processes[i].arrive_time,
processes[i].run_time, processes[i].start_time, processes[i].end_time, processes[i].turnover_time,
processes[i].weight_turnover_time);
}
int total_turnover_time = 0;
float total_weight_turnover_time = 0;
for (i = 0; i < n; i++) {
total_turnover_time += processes[i].turnover_time;
total_weight_turnover_time += processes[i].weight_turnover_time;
}
printf("平均周转时间=%.2f,平均带权周转时间=%.2f\n", (float) total_turnover_time / n,
total_weight_turnover_time / n);
free(processes);
return 0;
}
```
使用方法:
1. 编译运行程序;
2. 输入进程数量;
3. 依次输入每个进程的名称、到达时间、运行时间;
4. 程序输出每个时刻的进程运行状态,以及每个进程的周转时间、带权周转时间;
5. 程序输出所有进程的平均周转时间、带权平均周转时间。
注意:本程序中的输入没有做任何错误处理,如果输入不合法可能导致程序崩溃。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)