fcfs调度算法代码c语言
以下是一个简单的FCFS调度算法的C语言代码示例:
#include <stdio.h>
struct Process {
int pid; // 进程ID
int arrival_time; // 到达时间
int burst_time; // 执行时间
int waiting_time; // 等待时间
int turnaround_time; // 周转时间
};
void calculateWaitingTime(struct Process processes[], int n) {
int total_waiting_time = 0;
int i;
// 第一个进程的等待时间为0
processes[0].waiting_time = 0;
// 计算每个进程的等待时间
for (i = 1; i < n; i++) {
processes[i].waiting_time = processes[i - 1].waiting_time + processes[i - 1].burst_time;
total_waiting_time += processes[i].waiting_time;
}
}
void calculateTurnaroundTime(struct Process processes[], int n) {
int i;
// 计算每个进程的周转时间
for (i = 0; i < n; i++) {
processes[i].turnaround_time = processes[i].waiting_time + processes[i].burst_time;
}
}
void calculateAverageTime(struct Process processes[], int n) {
int total_waiting_time = 0;
int total_turnaround_time = 0;
int i;
// 计算等待时间和周转时间
calculateWaitingTime(processes, n);
calculateTurnaroundTime(processes, n);
// 计算总等待时间和总周转时间
for (i = 0; i < n; i++) {
total_waiting_time += processes[i].waiting_time;
total_turnaround_time += processes[i].turnaround_time;
}
// 计算平均等待时间和平均周转时间
float average_waiting_time = (float)total_waiting_time / n;
float average_turnaround_time = (float)total_turnaround_time / n;
// 输出结果
printf("Average Waiting Time: %.2f\n", average_waiting_time);
printf("Average Turnaround Time: %.2f\n", average_turnaround_time);
}
void displayProcessDetails(struct Process processes[], int n) {
int i;
// 输出每个进程的详细信息
printf("Process\tArrival Time\tBurst Time\tWaiting Time\tTurnaround Time\n");
for (i = 0; i < n; i++) {
printf("%d\t%d\t\t%d\t\t%d\t\t%d\n", processes[i].pid, processes[i].arrival_time, processes[i].burst_time, processes[i].waiting_time, processes[i].turnaround_time);
}
}
int main() {
int n, i;
printf("Enter the number of processes: ");
scanf("%d", &n);
struct Process processes[n];
// 输入每个进程的到达时间和执行时间
for (i = 0; i < n; i++) {
printf("Enter arrival time and burst time for process %d: ", i + 1);
scanf("%d %d", &processes[i].arrival_time, &processes[i].burst_time);
processes[i].pid = i + 1;
}
// 按到达时间对进程进行排序
for (i = 0; i < n - 1; i++) {
int j;
for (j = 0; j < n - i - 1; j++) {
if (processes[j].arrival_time > processes[j + 1].arrival_time) {
struct Process temp = processes[j];
processes[j] = processes[j + 1];
processes[j + 1] = temp;
}
}
}
// 计算平均等待时间和平均周转时间
calculateAverageTime(processes, n);
// 输出每个进程的详细信息
displayProcessDetails(processes, n);
return 0;
}
这个代码示例首先要求用户输入进程的数量,然后依次输入每个进程的到达时间和执行时间。接下来,它按照到达时间对进程进行排序,并计算平均等待时间和平均周转时间。最后,它输出每个进程的详细信息,包括到达时间、执行时间、等待时间和周转时间。
FCFS(First-Come, First-Served)调度算法是一种简单的调度算法,按照进程到达的顺序进行调度,即先到达的进程先执行。下面是一个使用FCFS调度算法的C语言代码示例:
#include <stdio.h>
struct Process {
int pid; // 进程ID
int arrival_time; // 到达时间
int burst_time; // 执行时间
int waiting_time; // 等待时间
int turnaround_time; // 周转时间
};
void calculateWaitingTime(struct Process processes[], int n) {
int total_waiting_time = 0;
int i;
// 第一个进程的等待时间为0
processes[0].waiting_time = 0;
// 计算每个进程的等待时间
for (i = 1; i < n; i++) {
processes[i].waiting_time = processes[i - 1].waiting_time + processes[i - 1].burst_time;
total_waiting_time += processes[i].waiting_time;
}
}
void calculateTurnaroundTime(struct Process processes[], int n) {
int i;
// 计算每个进程的周转时间
for (i = 0; i < n; i++) {
processes[i].turnaround_time = processes[i].waiting_time + processes[i].burst_time;
}
}
void calculateAverageTime(struct Process processes[], int n) {
int total_waiting_time = 0;
int total_turnaround_time = 0;
int i;
// 计算等待时间和周转时间
calculateWaitingTime(processes, n);
calculateTurnaroundTime(processes, n);
// 计算总等待时间和总周转时间
for (i = 0; i < n; i++) {
total_waiting_time += processes[i].waiting_time;
total_turnaround_time += processes[i].turnaround_time;
}
// 计算平均等待时间和平均周转时间
float average_waiting_time = (float)total_waiting_time / n;
float average_turnaround_time = (float)total_turnaround_time / n;
// 输出结果
printf("Average Waiting Time: %.2f\n", average_waiting_time);
printf("Average Turnaround Time: %.2f\n", average_turnaround_time);
}
void displayProcessDetails(struct Process processes[], int n) {
int i;
// 输出每个进程的详细信息
printf("Process\tArrival Time\tBurst Time\tWaiting Time\tTurnaround Time\n");
for (i = 0; i < n; i++) {
printf("%d\t%d\t\t%d\t\t%d\t\t%d\n", processes[i].pid, processes[i].arrival_time, processes[i].burst_time, processes[i].waiting_time, processes[i].turnaround_time);
}
}
int main() {
int n, i;
printf("Enter the number of processes: ");
scanf("%d", &n);
struct Process processes[n];
// 输入每个进程的到达时间和执行时间
for (i = 0; i < n; i++) {
printf("Enter arrival time and burst time for process %d: ", i + 1);
scanf("%d %d", &processes[i].arrival_time, &processes[i].burst_time);
processes[i].pid = i + 1;
}
// 按到达时间对进程进行排序
for (i = 0; i < n - 1; i++) {
int j;
for (j = 0; j < n - i - 1; j++) {
if (processes[j].arrival_time > processes[j + 1].arrival_time) {
struct Process temp = processes[j];
processes[j] = processes[j + 1];
processes[j + 1] = temp;
}
}
}
// 计算平均等待时间和平均周转时间
calculateAverageTime(processes, n);
// 输出每个进程的详细信息
displayProcessDetails(processes, n);
return 0;
}
这个代码示例首先要求用户输入进程的数量,然后依次输入每个进程的到达时间和执行时间。接下来,它按照到达时间对进程进行排序,并计算平均等待时间和平均周转时间。最后,它输出每个进程的详细信息,包括到达时间、执行时间、等待时间和周转时间。
在这个示例中,我们使用了一个结构体Process
来表示每个进程,其中包含进程的ID、到达时间、执行时间、等待时间和周转时间。calculateWaitingTime
函数用于计算每个进程的等待时间,calculateTurnaroundTime
函数用于计算每个进程的周转时间,calculateAverageTime
函数用于计算平均等待时间和平均周转时间,displayProcessDetails
函数用于输出每个进程的详细信息。
在main
函数中,我们首先获取用户输入的进程数量,并创建一个包含相应数量的Process
结构体数组。然后,我们依次输入每个进程的到达时间和执行时间,并为每个进程分配一个唯一的ID。接下来,我们按照到达时间对进程进行排序,以确保先到达的进程先执行。最后,我们调用calculateAverageTime
函数计算平均等待时间和平均周转时间,并调用displayProcessDetails
函数输出每个进程的详细信息。
请注意,这只是一个简单的示例,可能不适用于所有情况。在实际应用中,可能需要考虑更多的因素,如优先级、时间片轮转等。