c语言 银行家算法(完整代码实现)

c语言 银行家算法(完整代码实现)银行家算法例子:T0时刻进程P1提出需要(1、0、2)个资源的请求T0时刻进程P4提出需要(3、3、0)个资源的请求T0时刻进程P0提出需要(0、2、0)个资源的请求全局变量:intMax[5][3]={7,5,3,3,2,2,9,0,2,2,2,2,4,3,3};//五个进程对各种资源的最大需求intAllocation[5][3]={0,1,0,2,0,0,3,0,2,2,1,1,0,0,2};//五个进程已分配的各种资源数目intNeed[5][3]={7,4,3

大家好,又见面了,我是你们的朋友全栈君。

银行家算法

例子:
在这里插入图片描述
T0时刻进程P1提出需要(1、0、2)个资源的请求
T0时刻进程P4提出需要(3、3、0)个资源的请求
T0时刻进程P0提出需要(0、2、0)个资源的请求
定义全局变量:

int Max[5][3] = { 
   7,5,3,3,2,2,9,0,2,2,2,2,4,3,3}; //五个进程对各种资源的最大需求
int Allocation[5][3] = { 
   0,1,0,2,0,0,3,0,2,2,1,1,0,0,2}; //五个进程已分配的各种资源数目 
int Need[5][3] = { 
   7,4,3,1,2,2,6,0,0,0,1,1,4,3,1}; //五个进程任需要各种资源的数目 
int Available[3] = { 
   3,3,2}; //可利用的各资源的数目
int Work[3]; //可用资源数 
bool Finish[5]; //进程是否完成 
int Request[3]; //进程提出对各个资源请求的数目 
int Sequence[5]; //安全序列 

安全性判断函数:

bool is_safe() //安全性判断 
{ 
   
int i,j,i1 = 0;
bool t = false;

for(i = 0; i < 3; i++) //把Available赋值给Work
{ 
   
Work[i] = Available[i];
}

for(i = 0; i<5; i++) //初始化所有进程未完成 
{ 
   
Finish[i] = false;
}

while(1)
{ 
   
for(j = 0; j < 5; j++) //寻找Need小于等于Work的进程 
{ 
   
if(Finish[j]) continue;
t = true;
for(i = 0; i < 3; i++)
{ 
   
if(Need[j][i] <= Work[i]) continue;
else
{ 
   
t = false;
break;
}
}
if(t) break; //判断第j个进程是否满足Need小于等于Work
}

if(t && (Finish[j] == false)) //是否找到Need小于等于Work的进程并且进程未完成 
{ 
   
for(i = 0; i < 3; i++)
{ 
   
Work[i] = Work[i] + Allocation[j][i];
}
Finish[j] = true; //进程完成 
Sequence[i1] = j; //安全序列
i1++;
}
else
{ 
   
for(i = 0; i < 5; i++)
{ 
   
if(Finish[i]) continue;
else return false;
}
return true;
}

}
return true;
} 

资源的请求函数:


void request_option(int a)             //资源的请求选择 
{ 
   
 int i;
 bool t = true;
 
 for(i = 0; i < 3; i++)                //判断Requesti是否小于等于Needi 
 { 
   
  if(Request[i] <= Need[a][i]) continue;
  else
  { 
   
   printf("错误!\n");          //Requesti大于Needi出现错误,请求失败 
   t = false;
   break;
  }
 }
 
 if(t)
 { 
   
  for(i = 0; i < 3; i++)         //判断Requesti是否小于等于Availablei 
  { 
   
   if(Request[i] <= Need[a][i]) continue;
   else
   { 
   
    printf("错误,进程堵塞!\n");    //Requesti大于Availablei出现错误,进程Pi堵塞 
    t =  false;
    break;
   }
  }
 }
 
 if(t)               //试分配 
 { 
   
  for(i = 0; i < 3; i++)
  { 
   
   Available[i] = Available[i] - Request[i];
   Allocation[a][i] = Allocation[a][i] + Request[i];
   Need[a][i] = Need[a][i] - Request[i];
  }  
 }
 
}

完整代码:

#include<stdio.h>
int Max[5][3] = { 
   7,5,3,3,2,2,9,0,2,2,2,2,4,3,3};         //五个进程对各种资源的最大需求
int Allocation[5][3] = { 
   0,1,0,2,0,0,3,0,2,2,1,1,0,0,2};  //五个进程已分配的各种资源数目 
int Need[5][3] = { 
   7,4,3,1,2,2,6,0,0,0,1,1,4,3,1};        //五个进程任需要各种资源的数目 
int Available[3] = { 
   3,3,2};                              //可利用的各资源的数目
int Work[3];                                             //可用资源数 
bool Finish[5];                                          //进程是否完成 
int Request[3];                                          //进程提出对各个资源请求的数目 
int Sequence[5];                                         //安全序列 

bool is_safe()                           //安全性判断 
{ 
   
 int i,j,i1 = 0;
 bool t = false;
 
 for(i = 0; i < 3; i++)               //把Available赋值给Work
 { 
   
  Work[i] =  Available[i];
 }
  
 for(i = 0; i<5; i++)                 //初始化所有进程未完成 
 { 
   
  Finish[i] = false;
 }
 
 while(1)
 { 
   
  for(j = 0; j < 5; j++)           //寻找Need小于等于Work的进程 
  { 
   
   if(Finish[j]) continue;
   t = true;
   for(i = 0; i < 3; i++)
   { 
   
    if(Need[j][i] <= Work[i]) continue;
    else
    { 
   
     t = false;
     break;
    }
   }
   if(t) break;                 //判断第j个进程是否满足Need小于等于Work
  }
  
  if(t && (Finish[j] == false))    //是否找到Need小于等于Work的进程并且进程未完成 
  { 
   
   for(i = 0; i < 3; i++)
   { 
   
    Work[i] = Work[i] + Allocation[j][i];
   }
   Finish[j] = true;           //进程完成 
   Sequence[i1] = j;           //安全序列
   i1++;
  }
  else
  { 
   
   for(i = 0; i < 5; i++)
   { 
   
    if(Finish[i]) continue;
    else return false;
   }
   return true;
  }
  
 }
 return true;
}

void request_option(int a)             //资源的请求选择 
{ 
   
 int i;
 bool t = true;
 
 for(i = 0; i < 3; i++)                //判断Requesti是否小于等于Needi 
 { 
   
  if(Request[i] <= Need[a][i]) continue;
  else
  { 
   
   printf("错误!\n");          //Requesti大于Needi出现错误,请求失败 
   t = false;
   break;
  }
 }
 
 if(t)
 { 
   
  for(i = 0; i < 3; i++)         //判断Requesti是否小于等于Availablei 
  { 
   
   if(Request[i] <= Need[a][i]) continue;
   else
   { 
   
    printf("错误,进程堵塞!\n");    //Requesti大于Availablei出现错误,进程Pi堵塞 
    t =  false;
    break;
   }
  }
 }
 
 if(t)               //试分配 
 { 
   
  for(i = 0; i < 3; i++)
  { 
   
   Available[i] = Available[i] - Request[i];
   Allocation[a][i] = Allocation[a][i] + Request[i];
   Need[a][i] = Need[a][i] - Request[i];
  }  
 }
 
}

void print_Sequence()        //打印安全序列 
{ 
   
 int i;
 printf("安全序列为:");
 for(i=0;i<4;i++)
 { 
   
  printf("P%d->",Sequence[i]);
 }
 printf("P%d\n",Sequence[4]);
}

int main()
{ 
   
 int i,a;
 if(is_safe())                          //判断T0系统是否处于安全状态
 { 
   
  printf("T0系统处于安全状态\n");
  print_Sequence();                 //打印输出找到的资源分配的安全序列
  printf("\n"); 
 }
 else
 { 
   
  printf("T0系统处于不安全状态\n");
 }
 
 printf("请输入资源请求的进程(0:P0 1:P1 2:P2 3:P3 4:P4):");
 scanf("%d",&a);
 printf("输入请求A、B、C资源的数目:");
 for(i = 0; i < 3; i++)
 { 
   
  scanf("%d",&Request[i]);
 } 
  
 request_option(a);
 if(is_safe())                          //系统是否处于安全状态
 { 
   
  printf("系统能满足该资源请求\n");
  print_Sequence();                 //打印输出找到的资源分配的安全序列
 }
  else
 { 
   
  printf("系统不能满足该资源请求\n");
 }
 
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139839.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • cde网站_zaqxswcde

    cde网站_zaqxswcde给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。示例 1:输入:matrix = [[9,9,4],[6,6,8],[2,1,1]]输出:4 解释:最长递增路径为 [1, 2, 6, 9]。示例 2:输入:matrix = [[3,4,5],[3,2,6],[2,2,1]]输出:4 解释:最长递增路径是 [3, 4, 5, 6]。注意

    2022年8月9日
    0
  • 域名是http和https都可以访问;但是http访问,就没法存储session:https就可以存储session「建议收藏」

    域名是http和https都可以访问;但是http访问,就没法存储session:https就可以存储session

    2022年2月10日
    45
  • 计算机程序的构造和解释——笔记(一)

    计算机程序的构造和解释——笔记(一)

    2021年7月9日
    67
  • oracle字段换名语句,修改表名的sql语句

    oracle字段换名语句,修改表名的sql语句sql语句能不能修改表名可以。SQL自带了一系列的系统存储过程。其中sp_rename就具有修改表名和列名的功能。对于sp_rename是这样定义的:更改当前数据库中用户创建对象(如表、列或用户定义数据类型)的名称。基本语法:修改表名:EXECsp_rename'[原有表名]’,'[新表名]’;修改列名:EXECsp_rename'[原有列名]’,‘[新列名]’,’COLUMN’…

    2022年5月13日
    63
  • rhel6 裸设备绑定

    rhel6 裸设备绑定

    2021年8月31日
    59
  • 银行风控模型

    银行风控模型风控催生原因对于银行来说,现今互联网贷款和信用卡办理面临的主要难题是数据和风控。站在银行或金融机构角度,自然而然是想获得更多的信息和数据,但是在收集数据这方面又是比较无力的。加上当下的发展趋势,消费贷以及贷款审批速度都要求快。如何在快的的过程中对客户进行一个全面的审查,得出一个合理的结果呢?如果没有详细的数据对客户进行评估,这势必会提高放贷的风险。风控概述所谓风控,是指多银行贷款资金的…

    2022年6月13日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号