c语言实现fcfs,rr_1,spn,srt4种调度算法(无数据结构)

本文介绍了一种简单的进程调度算法实现,包括FCFS、RR_1、SPN和SRT四种算法,并提供了C语言代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在网上找的代码都很复杂,所以我写了一个简单的程序,不涉及任何数据结构,纯算法实现

先科普一下四种算法的含义(个人理解):

FCFS:非剥夺式,意思很明显,先到达就先执行

RR_1:轮转调度算法,时间片为1,在当前时间点或之前到达的,按照顺序一个程序执行一次

SPN:最短进程优先,非剥夺式,当前到达的进程中服务时间最短的优先执行

SRT:剥夺式,最短剩余服务时间优先,当前时间点,选择最短剩余服务时间的进程执行

这里以5个进程为例:

(进程名:到达时间:服务时间:结束时间)

A:0:3:0

B:2:6:0

C:4:4:0

D:6:5:0

E:8:2:0

代码如下:


#include <stdio.h>
#include <stdlib.h>
#define  max 5
void menu();
void FCFS();
void RR_1();
void SPN();
void SRT();
struct pro
{
    char process_name;
    int arrived_time;
    int service_time;
    int end_time;
};
char f[20];//轨迹序列
int t;//时间
struct pro prodess[5]= {{'A',0,3,0},{'B',2,6,0},{'C',4,4,0},{'D',6,5,0},{'E',8,2,0}};
int main()
{
    FCFS();RR_1();SPN();SRT();
    return 0;
}
void FCFS()
{
    int i,j,k,p;
    t=0;
    for(i=0; i<max; i++)
    {
        for(j=0; j<prodess[i].service_time; j++)
        {
            f[t]=prodess[i].process_name;
            t++;
        }
        prodess[i].end_time=t;
    }
    printf("\n\nFCFS调度轨迹:");
    for(k=0; k<t; k++)
    {
        printf("%c",f[k]);
    }
    printf("\n");
    for(p=0; p<max; p++)
    {
        printf("进程%c: 周转时间:%3d,归一化周转时间:%1.2f\n",prodess[p].process_name,prodess[p].end_time-prodess[p].arrived_time,1.0*(prodess[p].end_time-prodess[p].arrived_time)/prodess[p].service_time);
    }
}
void RR_1()
{
    int i,n,k,p,flag=0;
    t=0;
    int buff[max],servicetime[5];
    for(i=0; i<5; i++)
    {
        servicetime[i]=prodess[i].service_time;
    }
    while(1)
    {
        for(n=0; n<max; n++)
        {
            if(prodess[n].arrived_time==t)
            {
                flag++;
                buff[flag-1]=n;
                break;
            }
        }
        if(servicetime[buff[0]]==0)
        {
            prodess[buff[0]].end_time=t;
            flag--;
            if(flag==0) break;
            for(i=0; i<flag; i++) buff[i]=buff[i+1];
        }
        else
        {
            buff[flag]=buff[0];
            for(i=0; i<flag; i++)
            {
                buff[i]=buff[i+1];
            }
        }
        f[t]=prodess[buff[0]].process_name;
        servicetime[buff[0]]--;
        t++;
    }
    printf("\n\nRR_1调度轨迹:");
    for(k=0; k<t; k++)
    {
        printf("%c",f[k]);
    }
    printf("\n");
    for(p=0; p<max; p++)
    {
        printf("进程%c: 周转时间:%3d,归一化周转时间:%1.2f\n",prodess[p].process_name,prodess[p].end_time-prodess[p].arrived_time,1.0*(prodess[p].end_time-prodess[p].arrived_time)/prodess[p].service_time);
    }
}

void SPN()
{
    int i,n,m,p,k,flag;
    int buff[max],servicetime[5];
    t=0;
    flag=0;
    m=0;
    for(i=0; i<5; i++)
    {
        servicetime[i]=prodess[i].service_time;
    }
    while(1)
    {
        for(n=0; n<max; n++)
        {
            if(prodess[n].arrived_time==t)
            {
                buff[flag++]=n;
               // printf("n=%d,t=%d,flag=%d,buff[%d]=%d\n",n,t,flag,flag-1,n);
                break;
            }
        }
        if(servicetime[buff[m]]==0)
        {
            prodess[buff[m]].end_time=t;
            flag--;
            if(flag==0)break;
            for(n=m; n<flag; n++)buff[n]=buff[n+1];m=0;
            //printf("buff[n]=%d\n",buff[n]);
            for(n=0; n<flag; n++)if(servicetime[buff[n]]<servicetime[buff[m]])m=n;
        }
        f[t]=prodess[buff[m]].process_name;
        servicetime[buff[m]]--;
       // printf("%d:%c:%d\n",t,f[t],prodess[buff[m]].service_time);
        t++;
    }
    printf("\n\nSPN调度轨迹:");
    for(k=0; k<t; k++)
    {
        printf("%c",f[k]);
    }
    printf("\n");
    for(p=0; p<max; p++)
    {
        printf("进程%c: 周转时间:%3d,归一化周转时间:%1.2f\n",prodess[p].process_name,
               prodess[p].end_time-prodess[p].arrived_time,
               1.0*(prodess[p].end_time-prodess[p].arrived_time)/prodess[p].service_time);
    }
}
void SRT()
{
    int i,n,m,p,k,flag;
    int buff[max],servicetime[5];
    t=0;
    flag=0;
    m=0;
    for(i=0; i<5; i++)
    {
        servicetime[i]=prodess[i].service_time;
    }
    while(1)
    {
        for(n=0; n<max; n++)
        {
            if(prodess[n].arrived_time==t)
            {
                buff[flag++]=n;
                break;
            }
        }
        if(servicetime[buff[m]]==0)
        {
            prodess[buff[m]].end_time=t;
            flag--;
            if(flag==0)break;
            for(n=m; n<flag; n++)buff[n]=buff[n+1];
        }
        m=0;
        for(n=0; n<flag; n++)if(servicetime[buff[n]]<servicetime[buff[m]])m=n;
        f[t]=prodess[buff[m]].process_name;
        servicetime[buff[m]]--;
        t++;
    }
    printf("\n\nSRT调度轨迹:");
    for(k=0; k<t; k++)
    {
        printf("%c",f[k]);
    }
    printf("\n");
    for(p=0; p<max; p++)
    {
        printf("进程%c: 周转时间:%3d,归一化周转时间:%1.2f\n",prodess[p].process_name,
               prodess[p].end_time-prodess[p].arrived_time,
               1.0*(prodess[p].end_time-prodess[p].arrived_time)/prodess[p].service_time);
    }
}




<think>好的,我需要帮助用户找到用C语言实现FCFS进程调度算法的代码和运行方法。首先回顾用户之前的对话,用户之前已经讨论了Java实现的示例,但现在需要C语言版本。用户提供的引用中提到了C语言实现FCFS,所以需要结合这些信息。 用户的需求很明确:展示C语言FCFS核心代码和运行结果。我需要确保代码符合用户提到的实验要求,比如输入进程的到达时间和服务时间,输出完成时间、周转时间等,并计算平均值。 首先,我需要回忆FCFS的基本原理。FCFS是按照到达顺序处理进程,先到先执行。在代码中,需要先按到达时间排序进程队列,然后依次处理每个进程,计算各个时间指标。 接下来,考虑数据结构。每个进程需要一个结构体,包含名称、到达时间、服务时间、完成时间、周转时间和带权周转时间。然后,需要读取输入数据,可能是硬编码或从文件/用户输入获取。用户提供的示例数据有5个进程,可以硬编码在代码中方便测试。 然后,排序进程。使用C语言的标准库函数qsort,按到达时间升序排列。处理进程时,维护当前时间,如果当前时间小于进程的到达时间,则当前时间跳到到达时间。完成时间等于当前时间加服务时间,周转时间是完成时间减到达时间,带权周转时间则是周转时间除以服务时间。 编写代码时,注意输出格式,要清晰展示每个进程的信息和平均值。测试时,使用用户提供的示例数据,确保结果正确,比如FCFS的平均周转时间应为8.6,带权周转为2.56。 需要检查是否有遗漏的步骤,比如输入处理是否正确,排序是否准确,时间计算是否考虑到了当前时间的更新。另外,代码的可读性也很重要,添加必要的注释,帮助用户理解各部分功能。 最后,确保运行方法说明清楚,比如编译命令(gcc)、运行步骤,以及预期输出。用户可能需要验证代码的正确性,所以提供准确的运行结果示例是关键。 可能遇到的问题:如何处理进程的输入?是否需要动态数组?用户示例中的进程数量固定,所以可以先用静态数组。如果用户需要更灵活的处理,可能需要动态内存分配,但根据用户的问题,静态数组应该足够。 总结步骤:定义结构体,硬编码数据,排序,计算时间,输出结果。编写代码,测试,确保结果正确。然后整理运行方法,给出编译和执行命令,并附上运行结果示例。</think>### 一、C语言实现FCFS调度算法 #### 1. **核心代码实现** ```c #include <stdio.h> #include <stdlib.h> #define MAX_PROCESS 5 typedef struct { char name; int arrive_time; int service_time; int finish_time; int turnaround_time; double weighted_turnaround; } Process; // 按到达时间排序(FCFS核心逻辑) void fcfs_schedule(Process processes[], int n) { // 按到达时间升序排序 for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (processes[j].arrive_time > processes[j + 1].arrive_time) { Process temp = processes[j]; processes[j] = processes[j + 1]; processes[j + 1] = temp; } } } int current_time = 0; for (int i = 0; i < n; i++) { if (current_time < processes[i].arrive_time) { current_time = processes[i].arrive_time; } processes[i].finish_time = current_time + processes[i].service_time; processes[i].turnaround_time = processes[i].finish_time - processes[i].arrive_time; processes[i].weighted_turnaround = (double)processes[i].turnaround_time / processes[i].service_time; current_time = processes[i].finish_time; } } int main() { // 输入进程数据(用户可修改) Process processes[MAX_PROCESS] = { {'A', 0, 3, 0, 0, 0}, {'B', 2, 6, 0, 0, 0}, {'C', 4, 4, 0, 0, 0}, {'D', 6, 5, 0, 0, 0}, {'E', 8, 2, 0, 0, 0} }; // 调用FCFS调度算法 fcfs_schedule(processes, MAX_PROCESS); // 输出结果 printf("进程 | 完成时间 | 周转时间 | 带权周转时间\n"); printf("----------------------------------------\n"); double total_turnaround = 0, total_weighted = 0; for (int i = 0; i < MAX_PROCESS; i++) { printf("%c | %-9d | %-9d | %.2f\n", processes[i].name, processes[i].finish_time, processes[i].turnaround_time, processes[i].weighted_turnaround); total_turnaround += processes[i].turnaround_time; total_weighted += processes[i].weighted_turnaround; } printf("\n平均周转时间=%.1f,平均带权周转时间=%.2f\n", total_turnaround / MAX_PROCESS, total_weighted / MAX_PROCESS); return 0; } ``` --- ### 二、运行方法 1. **编译代码**(需安装GCC编译器): ```bash gcc fcfs_scheduler.c -o fcfs ``` 2. **执行程序**: ```bash ./fcfs ``` --- ### 三、运行结果示例 ``` 进程 | 完成时间 | 周转时间 | 带权周转时间 ---------------------------------------- A | 3 | 3 | 1.00 B | 9 | 7 | 1.17 C | 13 | 9 | 2.25 D | 18 | 12 | 2.40 E | 20 | 12 | 6.00 平均周转时间=8.6,平均带权周转时间=2.56 ``` --- ### 四、关键逻辑说明 1. **数据结构**:使用结构体`Process`存储进程的到达时间$T_i$、服务时间$S_i$及计算结果[^1]。 2. **排序逻辑**:通过冒泡排序按到达时间升序排列进程队列(FCFS核心)。 3. **时间计算**: - 完成时间$F_i = \max(\text{当前时间}, T_i) + S_i$ - 周转时间$R_i = F_i - T_i$ - 带权周转时间$W_i = R_i / S_i$ --- ### 五、扩展说明 若需动态输入进程数据,可通过文件读取或命令行输入(需扩展代码)[^3]。例如: ```c // 动态输入示例(需添加循环和scanf) for (int i = 0; i < n; i++) { printf("输入进程%c的到达时间和服务时间: ", 'A' + i); scanf("%d %d", &processes[i].arrive_time, &processes[i].service_time); } ``` --- ### 相关问题 1. **如何验证FCFS结果的正确性?** 通过手动计算进程的执行顺序和完成时间(如示例中进程B的完成时间应为$3+6=9$)[^2]。 2. **FCFS算法是否存在优先级反转问题?** 不存在,因其严格按照到达顺序处理,无优先级机制[^1]。 3. **如何改进代码支持更多调度算法?** 可添加函数指针或条件分支(如`if (algorithm == SJF) { ... }`)[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值