用c语言完成以下功能:实现先来先服务调度算法,实现最短作业优先调度算法,实现最高响应比优先调度算法。 基本要求: (1)手动创建几个进程,或者随机创建几个进程,都在界面上完成;要求包括进程的名称(不能重复)、创建时间、执行时间等。 (2)输出各进程不同调度算法的调度过程,输出周转时间、平均周转时间和平均带权周转时间。对比各算法的优劣,输出对比结果。
时间: 2023-05-21 14:01:54 浏览: 119
C知道:非常感谢您的提问。以下是用C语言实现先来先服务调度算法、最短作业优先调度算法和最高响应比优先调度算法的基本要求:
(1)手动创建几个进程,或者随机创建几个进程,都在界面上完成;要求包括进程的名称(不能重复)、创建时间、执行时间等。
以下是一个简单的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_PROCESS_NUM 10
typedef struct {
char name[20];
int arrival_time;
int burst_time;
int start_time;
int finish_time;
int turnaround_time;
float weighted_turnaround_time;
} Process;
void create_processes(Process processes[], int num_processes) {
int i;
for (i = 0; i < num_processes; i++) {
printf("Enter name of process %d: ", i + 1);
scanf("%s", processes[i].name);
printf("Enter arrival time of process %d: ", i + 1);
scanf("%d", &processes[i].arrival_time);
printf("Enter burst time of process %d: ", i + 1);
scanf("%d", &processes[i].burst_time);
}
}
(2)输出各进程不同调度算法的调度过程,输出周转时间、平均周转时间和平均带权周转时间。对比各算法的优劣,输出对比结果。
以下是一个简单的示例代码:
void fcfs(Process processes[], int num_processes) {
int i;
float total_turnaround_time = 0;
float total_weighted_turnaround_time = 0;
int current_time = 0;
for (i = 0; i < num_processes; i++) {
if (current_time < processes[i].arrival_time) {
current_time = processes[i].arrival_time;
}
processes[i].start_time = current_time;
processes[i].finish_time = current_time + processes[i].burst_time;
processes[i].turnaround_time = processes[i].finish_time - processes[i].arrival_time;
processes[i].weighted_turnaround_time = (float) processes[i].turnaround_time / processes[i].burst_time;
total_turnaround_time += processes[i].turnaround_time;
total_weighted_turnaround_time += processes[i].weighted_turnaround_time;
current_time = processes[i].finish_time;
}
printf("FCFS scheduling:\n");
printf("Process\tStart time\tFinish time\tTurnaround time\tWeighted turnaround time\n");
for (i = 0; i < num_processes; i++) {
printf("%s\t%d\t\t%d\t\t%d\t\t%.2f\n", processes[i].name, processes[i].start_time, processes[i].finish_time, processes[i].turnaround_time, processes[i].weighted_turnaround_time);
}
printf("Average turnaround time: %.2f\n", total_turnaround_time / num_processes);
printf("Average weighted turnaround time: %.2f\n", total_weighted_turnaround_time / num_processes);
}
void sjf(Process processes[], int num_processes) {
int i, j;
float total_turnaround_time = 0;
float total_weighted_turnaround_time = 0;
int current_time = 0;
Process temp;
for (i = 0; i < num_processes - 1; i++) {
for (j = i + 1; j < num_processes; j++) {
if (processes[i].burst_time > processes[j].burst_time) {
temp = processes[i];
processes[i] = processes[j];
processes[j] = temp;
}
}
}
for (i = 0; i < num_processes; i++) {
if (current_time < processes[i].arrival_time) {
current_time = processes[i].arrival_time;
}
processes[i].start_time = current_time;
processes[i].finish_time = current_time + processes[i].burst_time;
processes[i].turnaround_time = processes[i].finish_time - processes[i].arrival_time;
processes[i].weighted_turnaround_time = (float) processes[i].turnaround_time / processes[i].burst_time;
total_turnaround_time += processes[i].turnaround_time;
total_weighted_turnaround_time += processes[i].weighted_turnaround_time;
current_time = processes[i].finish_time;
}
printf("SJF scheduling:\n");
printf("Process\tStart time\tFinish time\tTurnaround time\tWeighted turnaround time\n");
for (i = 0; i < num_processes; i++) {
printf("%s\t%d\t\t%d\t\t%d\t\t%.2f\n", processes[i].name, processes[i].start_time, processes[i].finish_time, processes[i].turnaround_time, processes[i].weighted_turnaround_time);
}
printf("Average turnaround time: %.2f\n", total_turnaround_time / num_processes);
printf("Average weighted turnaround time: %.2f\n", total_weighted_turnaround_time / num_processes);
}
void hrrn(Process processes[], int num_processes) {
int i, j;
float total_turnaround_time = 0;
float total_weighted_turnaround_time = 0;
int current_time = 0;
float response_ratio[MAX_PROCESS_NUM];
Process temp;
for (i = 0; i < num_processes; i++) {
response_ratio[i] = (float) (current_time - processes[i].arrival_time + processes[i].burst_time) / processes[i].burst_time;
}
for (i = 0; i < num_processes - 1; i++) {
for (j = i + 1; j < num_processes; j++) {
if (response_ratio[i] < response_ratio[j]) {
temp = processes[i];
processes[i] = processes[j];
processes[j] = temp;
response_ratio[i] = (float) (current_time - processes[i].arrival_time + processes[i].burst_time) / processes[i].burst_time;
response_ratio[j] = (float) (current_time - processes[j].arrival_time + processes[j].burst_time) / processes[j].burst_time;
}
}
}
for (i = 0; i < num_processes; i++) {
if (current_time < processes[i].arrival_time) {
current_time = processes[i].arrival_time;
}
processes[i].start_time = current_time;
processes[i].finish_time = current_time + processes[i].burst_time;
processes[i].turnaround_time = processes[i].finish_time - processes[i].arrival_time;
processes[i].weighted_turnaround_time = (float) processes[i].turnaround_time / processes[i].burst_time;
total_turnaround_time += processes[i].turnaround_time;
total_weighted_turnaround_time += processes[i].weighted_turnaround_time;
current_time = processes[i].finish_time;
}
printf("HRRN scheduling:\n");
printf("Process\tStart time\tFinish time\tTurnaround time\tWeighted turnaround time\n");
for (i = 0; i < num_processes; i++) {
printf("%s\t%d\t\t%d\t\t%d\t\t%.2f\n", processes[i].name, processes[i].start_time, processes[i].finish_time, processes[i].turnaround_time, processes[i].weighted_turnaround_time);
}
printf("Average turnaround time: %.2f\n", total_turnaround_time / num_processes);
printf("Average weighted turnaround time: %.2f\n", total_weighted_turnaround_time / num_processes);
}
int main() {
int num_processes;
Process processes[MAX_PROCESS_NUM];
printf("Enter number of processes: ");
scanf("%d", &num_processes);
create_processes(processes, num_processes);
fcfs(processes, num_processes);
sjf(processes, num_processes);
hrrn(processes, num_processes);
return 0;
}
对于这三种调度算法,我们可以根据周转时间、平均周转时间和平均带权周转时间来比较它们的优劣。一般来说,平均带权周转时间越小,说明算法越优秀。