用C语言实现FCFS,SPN和RR算法,每个进程由一个进程控制块(PCB)表示,进程控制块包含进程名、到达时间、完成时间、需要运行时间、已用CPU时间、周转时间、带权周转时间、进程状态
时间: 2023-10-20 12:06:06 浏览: 140
以下是C语言实现FCFS、SPN和RR算法的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_PROCESSES 10
typedef struct {
char name[10];
int arrival_time;
int burst_time;
int completion_time;
int turnaround_time;
float waiting_time;
int remaining_time;
} Process;
void FCFS(Process processes[], int n);
void SPN(Process processes[], int n);
void RR(Process processes[], int n, int time_quantum);
int main() {
Process processes[MAX_PROCESSES];
int n, i, time_quantum;
printf("Enter the number of processes: ");
scanf("%d", &n);
for (i = 0; i < n; i++) {
printf("Enter the process name: ");
scanf("%s", processes[i].name);
printf("Enter the arrival time: ");
scanf("%d", &processes[i].arrival_time);
printf("Enter the burst time: ");
scanf("%d", &processes[i].burst_time);
processes[i].remaining_time = processes[i].burst_time;
}
printf("\nChoose a scheduling algorithm:\n");
printf("1. FCFS\n");
printf("2. SPN\n");
printf("3. RR\n");
printf("Enter your choice: ");
scanf("%d", &i);
switch (i) {
case 1:
FCFS(processes, n);
break;
case 2:
SPN(processes, n);
break;
case 3:
printf("Enter the time quantum: ");
scanf("%d", &time_quantum);
RR(processes, n, time_quantum);
break;
default:
printf("Invalid choice\n");
break;
}
return 0;
}
void FCFS(Process processes[], int n) {
int i, current_time = 0;
for (i = 0; i < n; i++) {
if (current_time < processes[i].arrival_time) {
current_time = processes[i].arrival_time;
}
processes[i].completion_time = current_time + processes[i].burst_time;
processes[i].turnaround_time = processes[i].completion_time - processes[i].arrival_time;
processes[i].waiting_time = processes[i].turnaround_time - processes[i].burst_time;
current_time = processes[i].completion_time;
}
printf("\nProcess\tArrival Time\tBurst Time\tCompletion Time\tTurnaround Time\tWaiting Time\n");
for (i = 0; i < n; i++) {
printf("%s\t%d\t\t%d\t\t%d\t\t%d\t\t\t%.2f\n", processes[i].name, processes[i].arrival_time,
processes[i].burst_time, processes[i].completion_time, processes[i].turnaround_time,
processes[i].waiting_time);
}
}
void SPN(Process processes[], int n) {
int i, j, current_time = 0, shortest;
Process temp;
for (i = 0; i < n; i++) {
shortest = i;
for (j = i; j < n; j++) {
if (processes[j].arrival_time <= current_time && processes[j].burst_time < processes[shortest].burst_time) {
shortest = j;
}
}
temp = processes[i];
processes[i] = processes[shortest];
processes[shortest] = temp;
processes[i].completion_time = current_time + processes[i].burst_time;
processes[i].turnaround_time = processes[i].completion_time - processes[i].arrival_time;
processes[i].waiting_time = processes[i].turnaround_time - processes[i].burst_time;
current_time = processes[i].completion_time;
}
printf("\nProcess\tArrival Time\tBurst Time\tCompletion Time\tTurnaround Time\tWaiting Time\n");
for (i = 0; i < n; i++) {
printf("%s\t%d\t\t%d\t\t%d\t\t%d\t\t\t%.2f\n", processes[i].name, processes[i].arrival_time,
processes[i].burst_time, processes[i].completion_time, processes[i].turnaround_time,
processes[i].waiting_time);
}
}
void RR(Process processes[], int n, int time_quantum) {
int i, j, current_time = 0, remaining = n, time_passed = 0;
Process temp;
while (remaining > 0) {
for (i = 0; i < n; i++) {
if (processes[i].arrival_time <= current_time && processes[i].remaining_time > 0) {
if (processes[i].remaining_time > time_quantum) {
processes[i].remaining_time -= time_quantum;
time_passed += time_quantum;
} else {
time_passed += processes[i].remaining_time;
processes[i].remaining_time = 0;
processes[i].completion_time = current_time + time_passed;
processes[i].turnaround_time = processes[i].completion_time - processes[i].arrival_time;
processes[i].waiting_time = processes[i].turnaround_time - processes[i].burst_time;
remaining--;
}
}
}
current_time += time_passed;
time_passed = 0;
}
printf("\nProcess\tArrival Time\tBurst Time\tCompletion Time\tTurnaround Time\tWaiting Time\n");
for (i = 0; i < n; i++) {
printf("%s\t%d\t\t%d\t\t%d\t\t%d\t\t\t%.2f\n", processes[i].name, processes[i].arrival_time,
processes[i].burst_time, processes[i].completion_time, processes[i].turnaround_time,
processes[i].waiting_time);
}
}
```
其中,FCFS函数实现先来先服务算法,SPN函数实现短作业优先算法,RR函数实现时间片轮转算法。每个进程由一个Process结构体表示,包含进程名、到达时间、需要运行时间、已用CPU时间、完成时间、周转时间、带权周转时间和进程状态。
阅读全文
相关推荐
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.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)