進程調度之FCFS算法(先來先運行算法)


#include<stdio.h>
#define PNUMBER 5//進程個數
#define SNUMBER 3//資源種類個數

//資源的種類,三種
char stype[SNUMBER]={'A','B','C'};

//各種資源的總數量,a種資源總10,b種資源總5,c種資源總7
int avalable[SNUMBER]={10,5,7};

//每個進程對應的完成進程需要的各種類型的資源需求量,靜態值
int pmax[PNUMBER][SNUMBER]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};

//每個進程已經分配的資源情況,動態值
int allocation[PNUMBER][SNUMBER]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};

//每一個進程還需要的資源
int pneed[PNUMBER][SNUMBER]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};

//臨時的數組
int request[SNUMBER];

//當前正在分配資源的進程
int pindex=0;

//顯示每一個進程對資源擁有的現狀
void showdate();

//接受進程分配的請求
void accepetRequest();

//模擬分配
void SimMllocation(int pindex);

//回滾
void rollback(int pindex);

//安全性檢查
int checkIsSafe();

int main()
{
    //主邏輯

    int exit=0;

    //顯示每一個進程現狀
    showdate();

    do
    {
        //接受進程分配的請求
        accepetRequest();

        //模擬分配資源
        SimMllocation(pindex);

        //顯示現在資源現狀
        showdate();

        //檢查是否存在安全序列,數據要保證至少一個進程能完成分配
        if(checkIsSafe()==0)
        {
            //當前進程不存在安全序列,當前進程數據回滾
            rollback(pindex);
        }
        printf("是否繼續0/1\n");
        scanf("%d",&exit);
    }while(exit==1);
    return 0;
}

//顯示每一個進程對資源擁有的現狀
void showdate()
{
    int index=0;
    int index_=0;
    printf("當前資源情況.....\n");
    printf("資源類類型\t資源數量\n");
    for(index=0;index<SNUMBER;index++)
    {
        printf("%c\t\t%d\n",stype[index],avalable[index]);
    }

    printf("\n\n每一個進程所需要資源的最大值.........\n\n");
    printf("進程編號\t資源類型A\t資源類型B\t資源類型C\n");
    for(index=0;index<PNUMBER;index++)
    {
        printf("%d\t\t",index);
        for(index_=0;index_<SNUMBER;index_++)
        {
            printf("%d\t\t",pmax[index][index_]);
        }
        printf("\n");
    }

    printf("\n\n每一個進程所分配的情況......\n\n");
    printf("進程編號\t資源類型A\t資源類型B\t資源類型C\n");
    for(index=0;index<PNUMBER;index++)
    {
        printf("%d\t\t",index);
        for(index_=0;index_<SNUMBER;index_++)
        {
            printf("%d\t\t",allocation[index][index_]);
        }
        printf("\n");
    }

    printf("\n\n每一個進程還需要的資源的情況......\n\n");
    printf("進程編號\t資源類型A\t資源類型\t資源類型C\n");
    for(index=0;index<PNUMBER;index++)
    {
        printf("%d\t\t",index);
        for(index_=0;index_<SNUMBER;index_++)
        {
            printf("%d\t\t",pneed[index][index_]);
        }
        printf("\n");
    }
    printf("---------------------------------------------------------------------------------------------\n");
}

void accepetRequest()
{
    int index=0;
    printf("請輸入你要分配資源的進程編號(0~%d)\n",PNUMBER-1);
    //需要分配資源的進程
    scanf("%d",&pindex);
    //輸入需要各種資源的具體數量
    for(index=0;index<SNUMBER;)
    {
        printf("請輸入%c類資源的數量\n",stype[index]);
        scanf("%d",&request[index]);
        //小於進程對資源的最大要求
        if(request[index]<=pmax[pindex][index]&&request[index]<=avalable[index])
        {
            index++;
        }
    }
}

//模擬分配
void SimMllocation(int pindex)
{
     int index=0;
     for(index=0;index<SNUMBER;index++)
     {
         //總資源減少
         avalable[index]-=request[index];
         //當前進程已經分配的資源
         allocation[pindex][index]+=request[index];
         //還需要的資源
         pneed[pindex][index]-=request[index];
     }
}

//回滾
void rollback(int pindex)
{
    int index=0;
    for(index=0;index<SNUMBER;index++)
    {
        avalable[index]+=request[index];
        allocation[pindex][index]-=request[index];
        pneed[pindex][index]+=request[index];
    }//回滾與模擬分配剛好相反
}

int checkIsSafe()
{
    int index=0;
    int index_=0;
    int count=0;
    int k=0;
    int temp[PNUMBER];
    //余下的資源要保證每一個進程都能得到資源
    int finish[PNUMBER]={0,0,0,0,0};
    //資源
    int work[SNUMBER];
    for(index=0;index<SNUMBER;index++)
    {
        work[index]=avalable[index];
    }
    //所有進程找到
    for(index=0;index<PNUMBER;index++)
    {
        count=0;
        if(finish[index]==1)
            continue;
        //余下的資源是否能滿足某一進程的需要
        for(index_=0;index_<SNUMBER;index_++)
        {
            if(pneed[index][index_]<=work[index_])
            {
                count++;
            }
            if(count==SNUMBER)
            {
                //余下的資源如果滿足一個進程的需要,也就能回收
                finish[index]=1;
                for(index_=0;index_<SNUMBER;index_++)
                {
                    work[index_]+=allocation[index][index_];
                }
                //記下此進程的編號
                temp[k]=index;
                k++;
                //因為有資源回收,所以讓所有進程試試看能不能重新分配
                index=-1;
            }
        }
    }
        //判斷所有進程理論上是否能分配到資源
        for(index=0;index<PNUMBER;index++)
        {
            //只要有一個進程分配不到資源,則不存在安全序列
            if(finish[index]==0)
            {
                printf("***不存在安全序列***");
                return 0;
            }
        }
        printf("安全序列............\n");
        for(index=0;index<PNUMBER;index++)
        {
            printf("%d--->",temp[index]);
        }
        printf("\n");
        return 1;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM