⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 w1.c

📁 用C实现的银行家算法
💻 C
字号:
#include <stdio.h>

#define M 3  /*M 是资源的数目*/
#define N 5/*N 是运行的进程数目*/
int available[M];/*可以使用的资源数*/
struct processb{
 char pname[20];         /*进程名称*/
 int max [M];      /*进程需要的最大资源数*/
 int allocation[M];
/*已经给该进程分配的资源数*/
 int need[M];     /*进程仍然需要的资源数*/
  }process[N];
/*safealgorithm 进行安全性判断*/
int safealgorithm()
{
    int i,j;
    int work[M],finish[N];
    for(i=0;i<M;i++)
      work[i]=available[i];/*给 work赋初值*/
    for(i=0;i<N;i++)
      finish[i]=0;       /*finish 置零*/
    for(i=0;i<N;i++)
    {
        for(j=0;j<M;j++)
        if(finish[i]==1||process[i].need[j]>work[j]) break; /*如果存在word<need或者进程已经完成,结束本次循环*/
        if(j==M)                                      /*如果循环是正常结束,那么j=M,说明进程可以执行完*/
        {                                                   /*那么就释放它拥有的所有资源*/
        for(j=0;j<M;j++)
            work[j]=work[j]+process[i].allocation[j];
        finish[i]=1;
          printf("p%d->",i);
             i=-1;}
     }

                                   /*并且将该进程的finish 置1*/
                                   /*然后从头寻找还没完成的进程*/
    for(i=0;i<N;i++)
    if(finish[i]==0)break;                                  /*如果进程没有全部结束,结束本次循环*/
    if(i==N){                                      /*如果 上次循环是正常结束,那么i=N,说明可以全部结束了*/
        printf("\nThis allocation end!\n");                                   /*说明系统是安全的,然后 返回1*/
        printf("This allocation  is an safealgorithm !\n");
        return 1;
        }
    printf("\nthis allocation   is not safealgorithm!\n");
        return 0;              /*否则,说明系统不安全,返回 0*/
}
/*进行第一步的分配判断,即:是否 request > need*/
int compareRN(int i,int request[])
{
    int j;
    for(j=0;j<M;j++)
    if(request[j]>process[i].need[j])
    {
        printf("warning:This allocation is unlegal!\n",j);
        return 0;
    }
    return 1;
}
/*进行第一步的分配判断,即:是否 request > available*/
int compareRA(int request[])
{
    int j;
    for(j=0;j<M;j++)
    if(request[j]>available[j]){
        printf("warning:This allocation is unlegal!\n");
        return 0;
    }
    return 1;
}
/*进行第三步分配判断,即:假如将资源分配给进程,系统是否处于安全状态*/
void tryallocation(int i,int request[])
{
    int j;
    for(j=0;j<M;j++)                         /*假设分配*/
    {
        available[j]=available[j]-request[j];
        process[i].allocation[j]=process[i].allocation[j]+request[j];
        process[i].need[j]=process[i].need[j]-request[j];
    }
    j=safealgorithm();                                      /*安全判断*/
    if(j==0)                                        /*不安全就将假设资源分配作废,恢复初始状态*/
    {   printf("This allocation is failure,undo!!\n");
        for(j=0;j<M;j++)
            {
            available[j]=available[j]+request[j];
            process[i].allocation[j]=process[i].allocation[j]-request[j];
            process[i].need[j]=process[i].need[j]+request[j];
            }
    }
    else printf("This allocation successful\n");         /*否则,资源分配成功*/
}
/*用户进行分配操作*/
void allocation(int i,int request[])
{   
    int j;
    j=compareRN(i,request);/*第一步判断*/
    if(j==0) {
     printf("warning:this algorithm can not allocation!\n");
    return ;
    }
    j=compareRA(request);/*第二步判断*/
    if(j==0){
    printf("warning:this algorithm can not allocation!\n");
    return ;
    }
    tryallocation(i,request);/*第三步判断*/
}
/*显示资源的使用情况*/
void display()
{
    int  i,j;
    printf("Available M:\n");
    for(i=0;i<M;i++)
        {
        printf("%d source still has %d;",i,available[i]);
        if(i%3==0&&i!=0) printf("\n");
        }
    printf("\nAllocation M:\n");
    for(i=0;i<N;i++)
    {
        for(j=0;j<M;j++)
        {
        printf("%s have  %d source %d and still  need %d;\n",process[i].pname,j,process[i].allocation[j],process[i].need[j]);
        }
    }
     printf("\tMAX,\tALLOCATION,\tNEED");
     for(i=0;i<N;i++)
       { printf("\n%s\t",process[i].pname);

          for(j=0;j<M;j++)
           printf("%d",process[i].max[j]);
             printf("\t") ;
         for(j=0;j<M;j++)
           printf("%d",process[i].allocation[j]);
              printf("\t\t") ;
         for(j=0;j<M;j++)
            printf("%d",process[i].need[j]);
               printf("\t") ;
       }
}
/*回收资源的第一步判断,即:判断这个进程]的回收资源数是否大于分配数*/
int Cerror(int i,int back[])
{
    int j;
    for(j=0;j<M;j++)
        {
        if(back[j]>process[i].allocation[j])
            {
            printf("This reback is error,because back is more than allocation!\n");
            return 0;           /*如果 大于的话,返回0*/
            }
        }
    return 1;                   /*否则返回1*/
}
/*进行回收资源的第二步,即:回收资源*/
void Csuccess(int i,int back[])
{
    int  j;
    for(j=0;j<M;j++)
        {
        process[i].allocation[j]=process[i].allocation[j]-back[j];
        process[i].max[j]=process[i].max[i]-back[j];
        available[j]=available[j]+back[j];
        }
        printf("\n call back now!\n");/*已经回收完毕*/
}
/*用户进行回收操作*/
void reback(int i,int back[])
{
    int j;
    if(!(i>=0&&i<N))
        {
        printf("process %d not exist!\n",i);
        return;
        }
    j=Cerror(i,back);
    if(j==0)
        {
        printf("Can not reback!\n");
        return;
        }
    Csuccess(i,back);
}

void main()
{
    int i,j,request[M],work[M],back[M];

    char a;
    printf("please input the name of process:\n");/*输入进程名,即:为每个进程起一个名称*/
     for(i=0;i<N;i++)
        {
        printf("The %d process's name is :",i);
        scanf("%s",&process[i].pname);
        }

    printf("please input available source:\n");/*输入目前的可用资源数 */
     for(i=0;i<M;i++)
        {
        scanf("%d",&available[i]);
        }
    printf("please input the max number of source :\n");/*输入进程每个资源的最大需求*/
     for(i=0;i<N;i++)
        for(j=0;j<M;j++)
            {
                scanf("%d",&process[i].max[j]);
            }

again:   printf("The source has been allocation :\n ");/*输入进程已经分配的资源*/
    for(i=0;i<N;i++)
        for(j=0;j<M;j++)
            {
                scanf("%d",&process[i].allocation[j]);
            }
    for(i=0;i<N;i++)/*给进程的need赋初值*/
        for(j=0;j<M;j++)
        {
            process[i].need[j]=process[i].max[j]-process[i].allocation[j];
        }
    i=safealgorithm();/*进行安全性判断*/
    if(i==0)/*如果返回是0,说明系统不安全,让用户重新输入分配情况*/
    {
        printf("Allocation is wrong.please try it again\n");
        goto again;
    }       /*否则,开始让用户进行选择操作*/
    printf("*************************************");
     printf("\n\tMAX,\tALLOCATION,\tNEED");
     for(i=0;i<N;i++)
       { printf("\n%s\t",process[i].pname);

          for(j=0;j<M;j++)
           printf("%d",process[i].max[j]);
             printf("\t") ;
         for(j=0;j<M;j++)
           printf("%d",process[i].allocation[j]);
              printf("\t\t") ;
         for(j=0;j<M;j++)
            printf("%d",process[i].need[j]);
               printf("\t") ;
       }
     printf("\n*************************************")  ;
loop:   printf("\nSelect  your choice\na:Allocation\nr:Reback\nd:Display\n");
    a=getchar();
    a=getchar();        /*a是用户所作的选择,根据a的值确定下一步的操作*/
    switch(a)
    {
       case 'a':        /*入果a='a',说明用户要进行分配操作,输入要分配资源的进程号*/
        {
        printf("Input allocation process'number:");
        scanf("%d",&i);
        printf("Input source request of process %3d\n:",i);/*输入该进程对各个资源的申请情况*/
        for(j=0;j<M;j++)
            {
            printf("source-%d'number:",j);
            scanf("%d",&request[j]);
            }
        allocation(i,request);                              /*进行分配操作*/
        break;
        }
    case 'R':       /*如果用户输入的是'c',说明用户要进行回收操作,输入要回收的进程名*/
        {
        printf("Input reback process'number:");
        scanf("%d",&i);
        printf("Input the number of process %3d'reback source\n:",i);/*输入各个资源的回收数目*/
        for(j=0;j<M;j++)
            {
            printf("source-%d",j);
            scanf("%d",&back[j]);
            }
        reback(i,back);                         /*进行回收操作*/
        break;
        }
    case 'd':                                       /*用户输入的是d,说明用户要进行显示资源操作*/
        {
        display();                                  /*直接执行display*/
        break;
        }
    default:
        printf("ERROR!\n");goto loop;
    }
    printf("\nEND?(y/n)");                            /*用户的这次操作已经完成,提示是否结束如果输入n,返回loop*/
    a=getchar();                                    /*否则退出程序*/
    a=getchar();
    if(a=='n'||a=='N') goto loop;
    else goto end;
end:
    printf("THIS ALLOCATION IS END!");
exit();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -