先来先服务(FCFS)算法的C语言实现
先来先服务(First-Come,First-Served,FCFS)是一种最简单的进程调度算法,它按照进程到达的先后顺序进行调度,即先到达的进程先获得CPU执行。
算法特点
- 非抢占式调度
- 公平简单,但可能导致短进程等待长进程
- 平均等待时间可能较长
C语言实现代码
#include <stdio.h>
#include <stdlib.h>
// 定义进程结构体
typedef struct {
int process_id; // 进程ID
int arrival_time; // 到达时间
int burst_time; // 执行时间
int waiting_time; // 等待时间
int turnaround_time; // 周转时间
} Process;
// 按到达时间排序的比较函数
int compare_arrival(const void *a, const void *b) {
Process *p1 = (Process *)a;
Process *p2 = (Process *)b;
return p1->arrival_time - p2->arrival_time;
}
// 计算FCFS调度
void calculate_fcfs(Process processes[], int n) {
// 按到达时间排序
qsort(processes, n, sizeof(Process), compare_arrival);
int current_time = 0;
float total_waiting_time = 0, total_turnaround_time = 0;
printf("\n进程\t到达时间\t执行时间\t等待时间\t周转时间\n");
for (int i = 0; i < n; i++) {
// 如果当前时间小于进程到达时间,则跳到进程到达时间
if (current_time < processes[i].arrival_time) {
current_time = processes[i].arrival_time;
}
// 计算等待时间
processes[i].waiting_time = current_time - processes[i].arrival_time;
// 计算周转时间
processes[i].turnaround_time = processes[i].waiting_time + processes[i].burst_time;
// 更新当前时间
current_time += processes[i].burst_time;
// 累加总等待时间和总周转时间
total_waiting_time += processes[i].waiting_time;
total_turnaround_time += processes[i].turnaround_time;
// 打印进程信息
printf("%d\t%d\t\t%d\t\t%d\t\t%d\n",
processes[i].process_id,
processes[i].arrival_time,
processes[i].burst_time,
processes[i].waiting_time,
processes[i].turnaround_time);
}
// 计算平均等待时间和平均周转时间
printf("\n平均等待时间: %.2f\n", total_waiting_time / n);
printf("平均周转时间: %.2f\n", total_turnaround_time / n);
}
int main() {
int n;
printf("请输入进程数量: ");
scanf("%d", &n);
Process processes[n];
// 输入每个进程的信息
for (int i = 0; i < n; i++) {
processes[i].process_id = i + 1;
printf("请输入进程%d的到达时间和执行时间: ", i + 1);
scanf("%d %d", &processes[i].arrival_time, &processes[i].burst_time);
}
// 计算并显示FCFS调度结果
calculate_fcfs(processes, n);
return 0;
}
代码说明
-
Process结构体:存储每个进程的ID、到达时间、执行时间、等待时间和周转时间。
-
compare_arrival函数:用于qsort排序,按进程到达时间升序排列。
-
calculate_fcfs函数:
- 首先按到达时间对进程进行排序
- 遍历进程,计算每个进程的等待时间和周转时间
- 更新当前时间
- 计算并打印平均等待时间和平均周转时间
-
main函数:
- 获取用户输入的进程数量
- 输入每个进程的到达时间和执行时间
- 调用calculate_fcfs函数进行计算和输出
示例运行
假设输入以下进程:
进程1: 到达时间0, 执行时间5
进程2: 到达时间1, 执行时间3
进程3: 到达时间2, 执行_time8
进程4: 到达时间3, 执行_time6
程序输出可能为:
进程 到达时间 执行时间 等待时间 周转时间
1 0 5 0 5
2 1 3 4 7
3 2 8 6 14
4 3 6 9 15
平均等待时间: 4.75
平均周转时间: 10.25
这个实现展示了FCFS算法的基本原理,可以根据需要进一步扩展功能,如可视化甘特图或添加更多统计信息。
