C语言实现银行家算法源代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言实现银行家算法源代码
#include"stdio.h"
#definemaxprocess50/*最大进程数*/#definemaxresource100/*最大资源数
*/#definetrue1#definefalse0
intavailable[maxresource];/*需用资源数组
*/intmax[maxprocess][maxresource];/*最小市场需求矩阵
*/intallocation[maxprocess][maxresource];/*分配矩阵
*/intneed[maxprocess][maxresource];/*市场需求矩阵
*/intrequest[maxprocess][maxresource];/*进程须要资源数*/
intfinish[maxprocess];/*系统是否有足够的资源分配*/intp[maxprocess];/*记录序列*/intm,n;/*m个进程,n个资源
*/voidinit();intsafe();voidbank();voidmain(){init();safe();bank();
}/*最小资源数*/
voidinit()/*初始化算法*/{inti,j;
printf("恳请输出进程的数目:\\n");scanf("%d",&m);
printf("请输入资源的种类:\\n");scanf("%d",&n);
printf("恳请输出每个进程最多所须要的各资源数,按照%dx%d矩阵输出
\\n",m,n);for(i=0;i<m;i++)for(j=0;j<n;j++)
scanf("%d",&max[i][j]);
printf("恳请输出每个进程已分配的各资源数,也按照%dx%d矩阵输出
\\n",m,n);for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%d",&allocation[i][j]);
need[i][j]=max[i][j]-allocation[i][j];if(need[i][j]<0){
printf("您输出的第%d个进程所具有的第%d个资源数错误,恳请再次输
出:\\n",i+1,j+1);j--;continue;}}}
printf("请输入各个资源现有的数目:\\n");for(i=0;i<n;i++){
scanf("%d",&available[i]);}}
intsafe()/*安全性算法,返回值:true,false*/{
inti,j,k,l=0;
intwork[maxresource];/*工作数组
*/for(i=0;i<n;i++)work[i]=available[i];for(i=0;i<m;i++){
finish[i]=false;}
for(i=0;i<m;i++){
if(finish[i]==true){continue;}else{
for(j=0;j<n;j++){
if(need[i][j]>work[j]){break;}}if(j==n){
finish[i]=true;for(k=0;k<n;k++)
{
work[k]+=allocation[i][k];}p[l++]=i;i=-1;}else{continue;}}if(l==m){ //cout<<"系统就是安全的"<<endl;printf("系统就是安全的\\n");
//cout<<"安全序列:"<<endl;printf("安全序列:\\n");for(i=0;i<l;i++){ //cout<<p[i];
printf("%d",p[i]);if(i!=l-1){
printf("-->");}}
returntrue;}}
printf("系统就是不安全的\\n");returnfalse;}
voidbank()/*银行家算法*/{
inti,cusneed;charagain;while(1){
printf("请输入要申请资源的进程号(注:第1个进程号为0,依次类
推)\\n");scanf("%d",&cusneed);
printf("恳请输出进程所命令的各资源的数量\\n");for(i=0;i<n;i++){
scanf("%d",&request[cusneed][i]);}
for(i=0;i<n;i++){
if(request[cusneed][i]>need[cusneed][i]){
printf("您输出的命令数少于进程的需求量!恳请再次输出!\\n");continue;}
if(request[cusneed][i]>available[i]){
printf("您输出的命令数少于系统有的资源数!恳请再次输出!\\n");continue;}} for(i=0;i<n;i++){
available[i]-=request[cusneed][i];
allocation[cusneed][i]+=request[cusneed][i];need[cusneed][i]-
=request[cusneed][i];}if(safe()){
printf("同意分配命令!\\n");}else{
printf("您的请求被拒绝!\\n");for(i=0;i<n;i++){
available[i]+=request[cusneed][i];
allocation[cusneed][i]-
=request[cusneed][i];need[cusneed][i]+=request[cusneed][i];}}
for(i=0;i<m;i++){
finish[i]=false;}
printf("您还想要再次命令分配吗?就是恳请按y/y,否请按其它键
\\n");scanf("%c",&again);
if(again=='y'||again=='y'){continue;}break;}}。

相关文档
最新文档