先来先服务算法C语言如何实现?

99ANYc3cd6
预计阅读时长 12 分钟
位置: 首页 C语言 正文

先来先服务(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;
}

代码说明

  1. Process结构体:存储每个进程的ID、到达时间、执行时间、等待时间和周转时间。

  2. compare_arrival函数:用于qsort排序,按进程到达时间升序排列。

  3. calculate_fcfs函数

    • 首先按到达时间对进程进行排序
    • 遍历进程,计算每个进程的等待时间和周转时间
    • 更新当前时间
    • 计算并打印平均等待时间和平均周转时间
  4. 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算法的基本原理,可以根据需要进一步扩展功能,如可视化甘特图或添加更多统计信息。

-- 展开阅读全文 --
头像
STM32 C语言编程如何快速上手?
« 上一篇 今天
dede关键词替换怎么用?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]