1. 程式人生 > >c語言實現fcfs,rr_1,spn,srt4種排程演算法(無資料結構)

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