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

📄 banker.c

📁 本程序为自己在学习操作系统时独立根据书上所述的银行家算法制作而成
💻 C
字号:
#include<stdio.h>int *Sc(int i,int m[]){  switch(i){    case 1:scanf("%d",&m[0]);break;    case 2:scanf("%d %d",&m[0],&m[1]);break;    case 3:scanf("%d %d %d",&m[0],&m[1],&m[2]);break;    case 4:scanf("%d %d %d %d",&m[0],&m[1],&m[2],&m[3]);break;    case 5:scanf("%d %d %d %d %d",&m[0],&m[1],&m[2],&m[3],&m[4]);break;    case 6:scanf("%d %d %d %d %d %d",&m[0],&m[1],&m[2],&m[3],&m[4],&m[5]);break;    case 7:scanf("%d %d %d %d %d %d %d",&m[0],&m[1],&m[2],&m[3],&m[4],&m[5],&m[6]);break;    case 8:scanf("%d %d %d %d %d %d %d %d",&m[0],&m[1],&m[2],&m[3],&m[4],&m[5],&m[6],&m[7]);break;    case 9:scanf("%d %d %d %d %d %d %d %d %d",&m[0],&m[1],&m[2],&m[3],&m[4],&m[5],&m[6],&m[7],&m[8]);break;    case 10:scanf("%d %d %d %d %d %d %d %d %d %d",&m[0],&m[1],&m[2],&m[3],&m[4],&m[5],&m[6],&m[7],&m[8],&m[9]);break;    default:{printf("wrong!input again:");}    }  return m;}/*void Pr(int i,int *p){  switch(i){    case 1:printf("%d\n",*p);break;    case 2:printf("%d %d\n",*p,*(p+1));break;    case 3:printf("%d %d %d\n",*p,*(p+1),*(p+2));break;    case 4:printf("%d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3));break;    case 5:printf("%d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4));break;    case 6:printf("%d %d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4),*(p+5));break;    case 7:printf("%d %d %d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4),*(p+5),*(p+6));break;    case 8:printf("%d %d %d %d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4),*(p+5),*(p+6),*(p+7));break;    case 9:printf("%d %d %d %d %d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4),*(p+5),*(p+6),*(p+7),*(p+8));break;    case 10:printf("%d %d %d %d %d %d %d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3),*(p+4),*(p+5),*(p+6),*(p+7),*(p+8),*(p+9));break;  }}*/void Pr(int i,int *p){  int t;  for(t=0;t<i;t++){printf("%d ",*(p+t));}}int test(int *array,int num){//全1则1,一0则0  int i,j=1;  for(i=0;i<num;i++)  {    if(*(array+i)==0)    j=0;  }  if(j==0)return 0;  else return 1;}int main(){    int rsn;		//resource number 资源种类数  int prn;		//process number 进程数  int i[100];		//作为所有for循环的计数器  int c;		//作为选择的结果  int p;		//作为发出请求的进程id  int cate;		//作为判断test函数的返回值    printf("请输入资源的种类数和进程的个数,用空格隔开:");  scanf("%d %d",&rsn,&prn);  int available[rsn];		//表示每类资源可利用的数目           int max[prn][rsn];		//表示每个进程中对每类资源的最大需求数量  int allocation[prn][rsn];	//表示类资源当前已分配给每一进程的资源数  int need[prn][rsn];		//表示每个进程尚需的各类资源数    int request[rsn];		//表示请求向量所请求的每类资源的数量  int work[rsn];		//工作向量,表示系统可提供给进程继续运行的各类资源数目  int finish[prn],*fi;		//表示系统是否有足够的资源分配给进程  int available_s[rsn],allocation_s[prn][rsn],need_s[prn][rsn];//备份数组  int counter;			//安全状态检查时用来记录更改进程的个数的计数器  int *av,*ma[prn],*all[prn],*nee[prn],*re,*wo;//作为各数组的指针//给available数组赋值  printf("请依次输入%d种资源的可利用资源数目,用空格隔开:",rsn);  av=Sc(rsn,available);  input://给max数组赋值  for(i[1]=0;i[1]<prn;i[1]++){    printf("请依次输入第%d个进程对每类资源(共%d类)的最大需求数,用空格隔开:",i[1]+1,rsn);    ma[i[1]]=Sc(rsn,max[i[1]]);  }//给allocation数组赋值  for(i[2]=0;i[2]<prn;i[2]++)  {    printf("请依次输入第%d个进程已占有的每类资源(共%d类)的个数,用空格隔开:",i[2]+1,rsn);    all[i[2]]=Sc(rsn,allocation[i[2]]);  }  //给need数组赋值  for(i[3]=0;i[3]<prn;i[3]++)  {    for(i[4]=0;i[4]<rsn;i[4]++)    {      if(max[i[3]][i[4]]-allocation[i[3]][i[4]]>=0)      {        need[i[3]][i[4]]=max[i[3]][i[4]]-allocation[i[3]][i[4]];      }      else {printf("you inout a wrong number,please input again.\n");goto input;}      }    nee[i[3]]=&need[i[3]][0];  }//打印输出的结果  for(i[4]=0;i[4]<prn;i[4]++)  {    printf("进程P%d的信息如下:\n",i[4]+1);    printf("对%d类资源的最大需求分别是:",rsn);    Pr(rsn,max[i[4]]);    printf("已占有的%d类资源数目分别是:",rsn);    Pr(rsn,all[i[4]]);    printf("尚需的%d类资源的数目分别是:",rsn);    Pr(rsn,nee[i[4]]);    printf("\n");  }  printf("目前每种资源的可利用数目为:");  Pr(rsn,av);  printf("\n");//请求部分开始:  for(;;)  {again2:    printf("请选择:1、输入请求向量并计算是否分配资源;2、显示各进程状态;3、退出。请选择:");    scanf("%d",&c);    switch(c)    {      case 1:{          printf("请输入发出请求的进程:");scanf("%d",&p);          printf("请输入请求的资源数组:");again1:          re=Sc(rsn,request);          for(i[10]=0;i[10]<rsn;i[10]++)/*依次测试资源是否超过最大数和是否有足够的资源*/          {                          if(request[i[10]]>need[p-1][i[10]])//所需资源是否超过宣布的最大数            {              printf("所需的资源超过最大数目,请重新输入:\n");              goto again1;            }            if(request[i[10]]>available[i[10]])//是否有足够资源            {                              printf("没有足够的资源进程P%d需等待!\n",p);                goto again2;              }          }//备份available、allocation和need          for(i[19]=0;i[19]<prn;i[19]++)          {            available_s[i[19]]=available[i[19]];            for(i[20]=0;i[20]<rsn;i[20]++)            {              allocation_s[i[19]][i[20]]=allocation[i[19]][i[20]];                need_s[i[19]][i[20]]=need[i[19]][i[20]];            }          }//试探分配          printf("系统将进行试探分配:");          for(i[11]=0;i[11]<rsn;i[11]++)          {            available[i[11]]=available[i[11]]-request[i[11]];            allocation[p-1][i[11]]=allocation[p-1][i[11]]+request[i[11]];            need[p-1][i[11]]=need[p-1][i[11]]-request[i[11]];          }//用安全性算法检查      step1:    fi=finish;          for(i[13]=0;i[13]<prn;i[13]++){finish[i[13]]=0;}          for(i[12]=0;i[12]<rsn;i[12]++){work[i[12]]=available[i[12]];}          wo=work;step2:    i[31]=0;step:     if(finish[i[31]]==0)            {              for(i[32]=0;i[32]<rsn;i[32]++)              {                if(need[p-1][i[32]]>work[i[32]])goto step4;              }              for(i[33]=0;i[33]<rsn;i[33]++)              {                work[i[33]]=work[i[33]]+allocation[i[31]][i[33]];              }              finish[i[31]]=1;              counter=1;              i[31]++;              goto step;            }          if(counter==1){counter=0;goto step2;}step4:    if(test(fi,prn)==1)          {            for(i[34]=0;i[34]<rsn;i[34]++)            {              if(need[p-1][i[34]!=0])goto print;                   }            for(i[23]=0;i[23]<rsn;i[23]++)            {              available[i[23]]=available[i[23]]+max[p-1][i[23]];              available_s[i[23]]=available[i[23]];            }print:      printf("系统安全,执行此次分配!\n");            for(i[35]=0;i[35]<rsn;i[35]++)            {              available_s[i[35]]=available[i[35]];              for(i[22]=0;i[22]<rsn;i[22]++)              {                allocation_s[i[21]][i[22]]=allocation[i[21]][i[22]];                  need_s[i[21]][i[22]]=need[i[21]][i[22]];              }            }          }          else          {            printf("系统不安全,请求被驳回!\n");            for(i[21]=0;i[21]<prn;i[21]++)            {              available[i[21]]=available_s[i[21]];              for(i[22]=0;i[22]<rsn;i[22]++)              {               allocation[i[21]][i[22]]=allocation_s[i[21]][i[22]];                 need[i[21]][i[22]]=need_s[i[21]][i[22]];              }            }                      }                    for(i[4]=0;i[4]<prn;i[4]++)          {            printf("进程P%d的信息如下:\n",i[4]+1);            for(i[37]=0;i[37]<rsn;i[37]++)            {              if(need[i[4]][i[37]]==0){printf("进程P%d已经完成!",i[4]+1);goto here;}            }            printf("对%d类资源的最大需求分别是:",rsn);            Pr(rsn,max[i[4]]);            printf("已占有的%d类资源数目分别是:",rsn);            Pr(rsn,all[i[4]]);            printf("尚需的%d类资源的数目分别是:",rsn);            Pr(rsn,nee[i[4]]);here:       printf("\n");          }          printf("目前每种资源的可利用数目为:");          Pr(rsn,av);          printf("\n");          break;        }      case 2: {        for(i[4]=0;i[4]<prn;i[4]++)          {            printf("进程P%d的信息如下:\n",i[4]+1);            printf("对%d类资源的最大需求分别是:",rsn);            Pr(rsn,max[i[4]]);            printf("已占有的%d类资源数目分别是:",rsn);            Pr(rsn,all[i[4]]);            printf("尚需的%d类资源的数目分别是:",rsn);            Pr(rsn,nee[i[4]]);            printf("\n");          }        printf("目前每种资源的可利用数目为:");        Pr(rsn,av);break;        }      case 3:goto end;    }  }end:  printf("再见\n");  }

⌨️ 快捷键说明

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