xtu-操作系统实验2-死锁避免——银行家算法

一、实验内容
银行家算法是避免死锁发生的有效算法,预习银行家算法的步骤,算法中包含的数据结构。
1、设计数据结构:可利用资源向量(Availiable),最大需求矩阵(Max),分配矩阵(Allocation),需求矩阵(Need)
2、设计安全检验算法:设置工作向量Work 表示系统可提供进程继续运行可利用资源数目,Finish 表示系统是否有足够的资源分配给进程。
3、5个进程,4类资源

#include<stdio.h>
int available[100],max[100][100],allocation[100][100],line[100],work_allocation[100][100];
char name[100][20];
int bank(int need0[][100],int n0,int m0);
int main()
{
 int i,j,m,n,need[100][100],num[100],number,request[100];
 int anquan;
 printf("请输入资源的种类数目m:");
 scanf("%d",&m);
 printf("请输入各类资源的数量:\n\n");
// printf("%*s%s%*s%s\n",5,"","名称",1,"","数量(Available)" );
 printf("%*s%s\n",5,"","数量(Available)" );
 for(i=1;i<=m;i++) 
 {
  printf("资源%d:",i);
 // scanf("%s %d",&name[i],&available[i]);
  scanf("%d",&available[i]);
 }
 printf("请输入系统进程的数目n:");
 scanf("%d",&n);
 printf("请输入各进程对各类资源的最大需求量(n*m的Max矩阵):\n");
 for(i=1;i<=n;i++)
 {
  for(j=1;j<=m;j++)
  {
   scanf("%d",&max[i][j]);
  }
 }
 printf("请输入各类资源当前已经分配给每个进程的资源数(n*m的Allocation矩阵):\n");
 for(i=1;i<=n;i++)
 {
  for(j=1;j<=m;j++)
  {
   scanf("%d",&allocation[i][j]);
  }
 }
 
 for(i=1;i<=n;i++)
 {
  for(j=1;j<=m;j++)
  { 
   
   need[i][j]=max[i][j]-allocation[i][j];
  }
 }
 
 int a;
 anquan=bank(need,n,m);
 printf("\n\n");
 printf("进程号   Available   Allocation   Need   Work_Allocation\n");
 for(i=1;i<=n;i++)
 {
  printf("%d      ",line[i]);
  a=line[i];
  for(j=1;j<=m;j++) printf("%d ",available[j]);
  printf("     ");
  for(j=1;j<=m;j++) printf("%d ",allocation[a][j]);
  printf("     ");
  for(j=1;j<=m;j++) printf("%d ",need[a][j]);
  printf("     ");
  for(j=1;j<=m;j++) printf("%d ",work_allocation[i][j]);
  
  printf("\n");
 }
 if(anquan==0)
 {
  printf("不存在安全系列\n");
  return 0;
 }
 else
 {
  printf("存在安全序列:");
  for(i=1;i<n;i++) printf("%d --> ",line[i]); 
  printf("%d\n\n",line[i]);
 }
 printf("请输入所要请求资源的进程名:");
 scanf("%d",&number);
 printf("请输入请求的各类资源的数量:\n");
 for(i=1;i<=m;i++) 
 {
  printf("资源%d:",i);
  scanf("%d",&request[i]);
 }
// int a;
/* for(i=1;i<=n;i++)
 {
  a=strcmp(name0,name[i]);
  if(a==0) break;
 } */
 for(j=1;j<=m;j++)
 {
  available[j]=available[j]-request[j];
  allocation[number][j]=allocation[number][j]+request[j];
  need[number][j]=need[number][j]-request[j];
 }
 anquan=bank(need,n,m);
 if(anquan==0)
 {
  printf("分配后不存在安全系列,不响应该请求\n");
  return 0;
 }
 else
 {
  printf("分配后仍存在下列的安全系列,可以响应该请求:");
  for(i=1;i<n;i++) printf("%d --> ",line[i]); 
  printf("%d\n",line[i]);
 }
 
 return 0;
} 
int bank(int need0[][100],int n0,int m0)
{
 int i,j,k,finish[100],work[100],temp;
 
 for(j=1;j<=m0;j++) work[j]=available[j];
 
 for(i=1;i<=n0;i++) finish[i]=0;
 temp=1;
 for(i=1;i<=n0;i++)
 {
  for(j=1;j<=n0;j++)
  {
   if(finish[j]==0)
   {
    for(k=1;k<=m0;k++)
    {
     if(need0[j][k]>work[k]) break;
    }
    if(k>m0)
    {
     finish[j]=1;
     for(k=1;k<=m0;k++)
     {
      work[k]=work[k]+allocation[j][k];
      work_allocation[temp][k]=work[k];
      line[temp]=j;
     }
     temp++;
    }    
   }
  }
 }
 for(i=1;i<=n0;i++)
 {
  if(finish[i]==0) break;
 }
 if(i>n0) return 1;
 else return 0;
}
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值