用c语言完成以下功能:实现先来先服务调度算法,实现最短作业优先调度算法,实现最高响应比优先调度算法。 基本要求: (1)手动创建几个进程,或者随机创建几个进程,都在界面上完成;要求包括进程的名称(不能重复)、创建时间、执行时间等。 (2)输出各进程不同调度算法的调度过程,输出周转时间、平均周转时间和平均带权周转时间。对比各算法的优劣,输出对比结果。
时间: 2024-02-20 15:56:37 浏览: 22
好的,我会尽力回答你关于 C 语言实现进程调度算法的问题。
首先,需要了解进程调度算法的基本概念和实现原理,以及不同算法之间的优缺点。在此不再赘述,具体可参考操作系统相关课程或教材。
以下是一个简单的参考代码,实现了先来先服务、最短作业优先和最高响应比优先三种调度算法。代码中使用了结构体来表示进程,包括进程名称、创建时间、执行时间、完成时间、周转时间和带权周转时间等信息。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 进程结构体
typedef struct process {
char name[20]; // 进程名称
int arrive_time; // 到达时间
int execute_time; // 执行时间
int finish_time; // 完成时间
int turnaround_time;// 周转时间
float w_turnaround; // 带权周转时间
} Process;
// 先来先服务调度算法
void FCFS(Process *processes, int n) {
int i, t = 0;
float total_turnaround = 0, total_w_turnaround = 0;
printf("先来先服务调度算法:\n");
printf("进程\t到达时间\t执行时间\t完成时间\t周转时间\t带权周转时间\n");
for (i = 0; i < n; i++) {
t += processes[i].execute_time;
processes[i].finish_time = t;
processes[i].turnaround_time = processes[i].finish_time - processes[i].arrive_time;
processes[i].w_turnaround = (float)processes[i].turnaround_time / processes[i].execute_time;
total_turnaround += processes[i].turnaround_time;
total_w_turnaround += processes[i].w_turnaround;
printf("%s\t%d\t\t%d\t\t%d\t\t%d\t\t%.2f\n", processes[i].name, processes[i].arrive_time, processes[i].execute_time, processes[i].finish_time, processes[i].turnaround_time, processes[i].w_turnaround);
}
printf("平均周转时间:%.2f\n", total_turnaround / n);
printf("平均带权周转时间:%.2f\n", total_w_turnaround / n);
}
// 最短作业优先调度算法
void SJF(Process *processes, int n) {
int i, j, t = 0;
float total_turnaround = 0, total_w_turnaround = 0;
Process temp;
printf("最短作业优先调度算法:\n");
printf("进程\t到达时间\t执行时间\t完成时间\t周转时间\t带权周转时间\n");
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (processes[i].execute_time > processes[j].execute_time) {
temp = processes[i];
processes[i] = processes[j];
processes[j] = temp;
}
}
}
for (i = 0; i < n; i++) {
t += processes[i].execute_time;
processes[i].finish_time = t;
processes[i].turnaround_time = processes[i].finish_time - processes[i].arrive_time;
processes[i].w_turnaround = (float)processes[i].turnaround_time / processes[i].execute_time;
total_turnaround += processes[i].turnaround_time;
total_w_turnaround += processes[i].w_turnaround;
printf("%s\t%d\t\t%d\t\t%d\t\t%d\t\t%.2f\n", processes[i].name, processes[i].arrive_time, processes[i].execute_time, processes[i].finish_time, processes[i].turnaround_time, processes[i].w_turnaround);
}
printf("平均周转时间:%.2f\n", total_turnaround / n);
printf("平均带权周转时间:%.2f\n", total_w_turnaround / n);
}
// 最高响应比优先调度算法
void HRRN(Process *processes, int n) {
int i, j, t = 0;
float total_turnaround = 0, total_w_turnaround = 0, max_hrr = 0;
Process temp;
printf("最高响应比优先调度算法:\n");
printf("进程\t到达时间\t执行时间\t完成时间\t周转时间\t带权周转时间\n");
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (processes[i].arrive_time > processes[j].arrive_time) {
temp = processes[i];
processes[i] = processes[j];
processes[j] = temp;
}
}
}
for (i = 0; i < n; i++) {
t += processes[i].execute_time;
processes[i].finish_time = t;
processes[i].turnaround_time = processes[i].finish_time - processes[i].arrive_time;
processes[i].w_turnaround = (float)processes[i].turnaround_time / processes[i].execute_time;
total_turnaround += processes[i].turnaround_time;
total_w_turnaround += processes[i].w_turnaround;
max_hrr = 0;
for (j = i + 1; j < n; j++) {
if (t >= processes[j].arrive_time) {
float hrr = (t - processes[j].arrive_time + processes[j].execute_time) / (float)processes[j].execute_time;
if (hrr > max_hrr) {
max_hrr = hrr;
temp = processes[j];
processes[j] = processes[i + 1];
processes[i + 1] = temp;
}
}
}
printf("%s\t%d\t\t%d\t\t%d\t\t%d\t\t%.2f\n", processes[i].name, processes[i].arrive_time, processes[i].execute_time, processes[i].finish_time, processes[i].turnaround_time, processes[i].w_turnaround);
}
printf("平均周转时间:%.2f\n", total_turnaround / n);
printf("平均带权周转时间:%.2f\n", total_w_turnaround / n);
}
int main() {
int n, i;
Process *processes;
printf("请输入进程数量:");
scanf("%d", &n);
processes = (Process*)malloc(n * sizeof(Process));
printf("请输入各进程信息:\n");
for (i = 0; i < n; i++) {
printf("请输入第%d个进程的名称、到达时间和执行时间:", i + 1);
scanf("%s%d%d", processes[i].name, &processes[i].arrive_time, &processes[i].execute_time);
}
FCFS(processes, n);
SJF(processes, n);
HRRN(processes, n);
free(processes);
return 0;
}
```
以上代码仅供参考,具体实现方式可以根据实际情况进行调整和优化。同时,需要注意的是,在实际生产环境中,可能需要考虑更多因素,如并发性、死锁等问题。