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

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

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

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);
    }
}




  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C语言实现FCFS、SJF、RR、PSA调度算法的代码示例: ```c #include <stdio.h> #include <stdlib.h> #define MAX_PROCESSES 10 typedef struct { int pid; int arrival_time; int burst_time; int waiting_time; int turnaround_time; } Process; void fcfs(Process processes[], int n) { int current_time = 0; for (int i = 0; i < n; i++) { if (processes[i].arrival_time > current_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; } } void sjf(Process processes[], int n) { int current_time = 0; int remaining_processes = n; while (remaining_processes > 0) { int next_process_index = -1; int shortest_burst_time = 999999; for (int i = 0; i < n; i++) { if (processes[i].arrival_time <= current_time && processes[i].burst_time < shortest_burst_time) { next_process_index = i; shortest_burst_time = processes[i].burst_time; } } if (next_process_index == -1) { current_time++; } else { Process next_process = processes[next_process_index]; processes[next_process_index] = processes[remaining_processes-1]; processes[remaining_processes-1] = next_process; remaining_processes--; next_process.waiting_time = current_time - next_process.arrival_time; next_process.turnaround_time = next_process.waiting_time + next_process.burst_time; current_time += next_process.burst_time; } } } void rr(Process processes[], int n, int quantum) { int current_time = 0; int remaining_processes = n; while (remaining_processes > 0) { for (int i = 0; i < n; i++) { if (processes[i].arrival_time <= current_time && processes[i].burst_time > 0) { int time_slice = processes[i].burst_time < quantum ? processes[i].burst_time : quantum; processes[i].burst_time -= time_slice; current_time += time_slice; if (processes[i].burst_time == 0) { remaining_processes--; processes[i].waiting_time = current_time - processes[i].arrival_time - processes[i].turnaround_time; } } } } } void psa(Process processes[], int n) { int current_time = 0; int remaining_processes = n; while (remaining_processes > 0) { int highest_priority_index = -1; int highest_priority = -1; for (int i = 0; i < n; i++) { if (processes[i].arrival_time <= current_time && processes[i].burst_time > 0) { int priority = 1 + processes[i].waiting_time / processes[i].burst_time; if (priority > highest_priority) { highest_priority_index = i; highest_priority = priority; } } } if (highest_priority_index == -1) { current_time++; } else { Process next_process = processes[highest_priority_index]; processes[highest_priority_index] = processes[remaining_processes-1]; processes[remaining_processes-1] = next_process; remaining_processes--; next_process.waiting_time = current_time - next_process.arrival_time; next_process.turnaround_time = next_process.waiting_time + next_process.burst_time; current_time += next_process.burst_time; } } } int main() { Process processes[MAX_PROCESSES]; int n; int quantum; printf("Enter the number of processes: "); scanf("%d", &n); for (int 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; } printf("\nFCFS:\n"); fcfs(processes, n); for (int i = 0; i < n; i++) { printf("Process %d: arrival_time=%d, burst_time=%d, waiting_time=%d, turnaround_time=%d\n", processes[i].pid, processes[i].arrival_time, processes[i].burst_time, processes[i].waiting_time, processes[i].turnaround_time); } printf("\nSJF:\n"); sjf(processes, n); for (int i = 0; i < n; i++) { printf("Process %d: arrival_time=%d, burst_time=%d, waiting_time=%d, turnaround_time=%d\n", processes[i].pid, processes[i].arrival_time, processes[i].burst_time, processes[i].waiting_time, processes[i].turnaround_time); } printf("\nEnter the time quantum for RR: "); scanf("%d", &quantum); printf("\nRR:\n"); rr(processes, n, quantum); for (int i = 0; i < n; i++) { printf("Process %d: arrival_time=%d, burst_time=%d, waiting_time=%d, turnaround_time=%d\n", processes[i].pid, processes[i].arrival_time, processes[i].burst_time, processes[i].waiting_time, processes[i].turnaround_time); } printf("\nPSA:\n"); psa(processes, n); for (int i = 0; i < n; i++) { printf("Process %d: arrival_time=%d, burst_time=%d, waiting_time=%d, turnaround_time=%d\n", processes[i].pid, processes[i].arrival_time, processes[i].burst_time, processes[i].waiting_time, processes[i].turnaround_time); } return 0; } ``` 在上面的代码中,有一个 `Process` 结构体来表示一个进程,包含 PID、到达时间、执行时间、等待时间和周转时间等属性。然后有四个函数 `fcfs`、`sjf`、`rr` 和 `psa` 分别实现先来先服务、最短作业优先、时间片轮转和优先级调度算法。最后在 `main` 函数中通过用户输入创建进程列表,依次使用四算法对进程进行调度,并输出每个进程的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值