运用c语言编程实现进程调度算法的基本过程,设计要求: (1)能够选择进程调度算法(先来先服务、短进程优先算法和高响应比优先算法)。 (2)可以输入进程数目(至少3个进程),以及各进程的提交时间和运行时间。 (3)能够显示调度过程及相应时间。
时间: 2023-12-29 15:05:37 浏览: 32
以下是一个简单的用C语言编写的进程调度算法实现,可以实现先来先服务、短进程优先算法和高响应比优先算法:
```c
#include <stdio.h>
typedef struct {
int process_id;
int arrival_time;
int burst_time;
int waiting_time;
int turnaround_time;
int response_time;
} Process;
void first_come_first_served(Process processes[], int n);
void shortest_job_first(Process processes[], int n);
void highest_response_ratio_next(Process processes[], int n);
int main() {
int n, i;
printf("Enter the number of processes: ");
scanf("%d", &n);
Process processes[n];
for (i = 0; i < n; i++) {
printf("\nEnter the arrival time for process %d: ", i + 1);
scanf("%d", &processes[i].arrival_time);
printf("Enter the burst time for process %d: ", i + 1);
scanf("%d", &processes[i].burst_time);
processes[i].process_id = i + 1;
}
first_come_first_served(processes, n);
shortest_job_first(processes, n);
highest_response_ratio_next(processes, n);
return 0;
}
void first_come_first_served(Process processes[], int n) {
int i, j;
int current_time = 0;
float average_waiting_time = 0;
float average_turnaround_time = 0;
printf("\nFirst come first served scheduling:\n");
for (i = 0; i < n; i++) {
processes[i].waiting_time = current_time - processes[i].arrival_time;
if (processes[i].waiting_time < 0) {
processes[i].waiting_time = 0;
}
processes[i].turnaround_time = processes[i].waiting_time + processes[i].burst_time;
current_time += processes[i].burst_time;
average_waiting_time += processes[i].waiting_time;
average_turnaround_time += processes[i].turnaround_time;
printf("Process %d:\n", processes[i].process_id);
printf("Waiting time: %d\n", processes[i].waiting_time);
printf("Turnaround time: %d\n", processes[i].turnaround_time);
}
average_waiting_time /= n;
average_turnaround_time /= n;
printf("Average waiting time: %.2f\n", average_waiting_time);
printf("Average turnaround time: %.2f\n", average_turnaround_time);
}
void shortest_job_first(Process processes[], int n) {
int i, j, min_index;
int current_time = 0;
float average_waiting_time = 0;
float average_turnaround_time = 0;
printf("\nShortest job first scheduling:\n");
for (i = 0; i < n; i++) {
min_index = i;
for (j = i + 1; j < n; j++) {
if (processes[j].burst_time < processes[min_index].burst_time) {
min_index = j;
}
}
Process temp = processes[i];
processes[i] = processes[min_index];
processes[min_index] = temp;
}
for (i = 0; i < n; i++) {
processes[i].waiting_time = current_time - processes[i].arrival_time;
if (processes[i].waiting_time < 0) {
processes[i].waiting_time = 0;
}
processes[i].turnaround_time = processes[i].waiting_time + processes[i].burst_time;
current_time += processes[i].burst_time;
average_waiting_time += processes[i].waiting_time;
average_turnaround_time += processes[i].turnaround_time;
printf("Process %d:\n", processes[i].process_id);
printf("Waiting time: %d\n", processes[i].waiting_time);
printf("Turnaround time: %d\n", processes[i].turnaround_time);
}
average_waiting_time /= n;
average_turnaround_time /= n;
printf("Average waiting time: %.2f\n", average_waiting_time);
printf("Average turnaround time: %.2f\n", average_turnaround_time);
}
void highest_response_ratio_next(Process processes[], int n) {
int i, j, max_index;
int current_time = 0;
float average_waiting_time = 0;
float average_turnaround_time = 0;
printf("\nHighest response ratio next scheduling:\n");
for (i = 0; i < n; i++) {
processes[i].waiting_time = -1 * processes[i].arrival_time;
processes[i].response_time = processes[i].burst_time;
}
for (i = 0; i < n; i++) {
max_index = i;
for (j = i + 1; j < n; j++) {
float ratio1 = (current_time - processes[j].arrival_time + processes[j].burst_time) / processes[j].burst_time;
float ratio2 = (current_time - processes[max_index].arrival_time + processes[max_index].burst_time) / processes[max_index].burst_time;
if (ratio1 > ratio2) {
max_index = j;
}
}
Process temp = processes[i];
processes[i] = processes[max_index];
processes[max_index] = temp;
processes[i].waiting_time = current_time - processes[i].arrival_time;
if (processes[i].waiting_time < 0) {
processes[i].waiting_time = 0;
}
processes[i].turnaround_time = processes[i].waiting_time + processes[i].burst_time;
current_time += processes[i].burst_time;
average_waiting_time += processes[i].waiting_time;
average_turnaround_time += processes[i].turnaround_time;
printf("Process %d:\n", processes[i].process_id);
printf("Waiting time: %d\n", processes[i].waiting_time);
printf("Turnaround time: %d\n", processes[i].turnaround_time);
}
average_waiting_time /= n;
average_turnaround_time /= n;
printf("Average waiting time: %.2f\n", average_waiting_time);
printf("Average turnaround time: %.2f\n", average_turnaround_time);
}
```
该程序中定义了一个Process结构体,包含进程的各种属性,包括进程ID、到达时间、执行时间、等待时间、周转时间和响应时间。程序中定义了三个进程调度算法的函数,分别是先来先服务算法(first_come_first_served)、短进程优先算法(shortest_job_first)和高响应比优先算法(highest_response_ratio_next)。在main函数中,程序会提示用户输入进程数目,以及各进程的提交时间和运行时间,然后顺序调用这三个进程调度算法函数,并输出每个进程的等待时间和周转时间,以及平均等待时间和平均周转时间。
其中,先来先服务算法的实现比较简单,只需要按照进程到达时间的顺序依次执行即可。短进程优先算法需要对所有进程按照执行时间进行排序,然后依次执行。高响应比优先算法需要计算每个进程的响应比(相应时间/执行时间),然后选择响应比最高的进程执行,然后再重新计算响应比,直到所有进程都执行完毕。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.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)