• 进程调度之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
    ");
            scanf("%d",&exit);
        }while(exit==1);
        return 0;
    }
    
    //显示每一个进程对资源拥有的现状
    void showdate()
    {
        int index=0;
        int index_=0;
        printf("当前资源情况.....
    ");
        printf("资源类类型	资源数量
    ");
        for(index=0;index<SNUMBER;index++)
        {
            printf("%c		%d
    ",stype[index],avalable[index]);
        }
    
        printf("
    
    每一个进程所需要资源的最大值.........
    
    ");
        printf("进程编号	资源类型A	资源类型B	资源类型C
    ");
        for(index=0;index<PNUMBER;index++)
        {
            printf("%d		",index);
            for(index_=0;index_<SNUMBER;index_++)
            {
                printf("%d		",pmax[index][index_]);
            }
            printf("
    ");
        }
    
        printf("
    
    每一个进程所分配的情况......
    
    ");
        printf("进程编号	资源类型A	资源类型B	资源类型C
    ");
        for(index=0;index<PNUMBER;index++)
        {
            printf("%d		",index);
            for(index_=0;index_<SNUMBER;index_++)
            {
                printf("%d		",allocation[index][index_]);
            }
            printf("
    ");
        }
    
        printf("
    
    每一个进程还需要的资源的情况......
    
    ");
        printf("进程编号	资源类型A	资源类型	资源类型C
    ");
        for(index=0;index<PNUMBER;index++)
        {
            printf("%d		",index);
            for(index_=0;index_<SNUMBER;index_++)
            {
                printf("%d		",pneed[index][index_]);
            }
            printf("
    ");
        }
        printf("---------------------------------------------------------------------------------------------
    ");
    }
    
    void accepetRequest()
    {
        int index=0;
        printf("请输入你要分配资源的进程编号(0~%d)
    ",PNUMBER-1);
        //需要分配资源的进程
        scanf("%d",&pindex);
        //输入需要各种资源的具体数量
        for(index=0;index<SNUMBER;)
        {
            printf("请输入%c类资源的数量
    ",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("安全序列............
    ");
            for(index=0;index<PNUMBER;index++)
            {
                printf("%d--->",temp[index]);
            }
            printf("
    ");
            return 1;
    }
  • 相关阅读:
    如果控制文件损坏那么如何恢复?恢复控制文件的方式有哪几种
    【OCP|OCM】Oracle培训考证系列
    【RMAN】Oracle中如何备份控制文件?备份控制文件的方式有哪几种?
    在高并发、高负载的情况下,如何给表添加字段并设置DEFAULT值?
    CentOS 7.1静默安装11.2.0.3 64位单机数据库软件
    造成错误“ORA-12547: TNS:lost contact”的常见原因有哪些?
    如何让oracle DB、监听和oem开机启动(dbstart)
    ipcs、ipcrm、sysresv、kernel.shmmax
    【DG】利用闪回数据库(flashback)修复Failover后的DG环境
    【BBED】BBED模拟并修复ORA-08102错误
  • 原文地址:https://www.cnblogs.com/yinbiao/p/9021544.html
Copyright © 2020-2023  润新知