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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue-router 多级路由redirect 重定向的问题

    vue-router 多级路由redirect 重定向的问题在做多级路由的时候遇到很多问题,虽然不难,但是如果没有经验,往往要花一整天时间才能解决(可能我笨),况且网上资料也很少。项目需要是这样的:登录页面跳到后台页面重定向,登录页是一级路由对应页面登录后:同时重定向二级和三级页面,这样登录就会重定向了,此时url但又有一个问题:当再次点击底部“堂食”的时候,url变成这样,并且三级页面没有出来解决办法是:在这个“堂食”按键添加一个方法记住,也只…

    2022年7月11日
    89
  • java 测试程序代码运行时间过长_Java测试

    java 测试程序代码运行时间过长_Java测试突然想准确的测试一下Java代码的执行时间,在网上找了一会。发现基本有以下两种方法:第一种是以毫秒为单位计算的。Java代码//伪代码  long startTime=System.currentTimeMillis();   //获取开始时间  doSomeThing();  //测试的代码段  long endTime=System.currentTime

    2022年10月18日
    2
  • pytorch-DataLoader(数据迭代器)

    pytorch-DataLoader(数据迭代器)目录1.1dataset1.1.1Map-styledatasets实现方法一(简单直白法)实现方法二(借助TensorDataset直接将数据包装成dataset类)实现方法三(地址读取法)1.1.1Iterable-styledatasets我们一般使用一个for循环(或多层的)来训练神经网络,每一次迭代,加载一个batch的数据,神经网络前向反向传播各一次并更新一次参数。而这个过程中加载一个batch的数据这一步需要使用一个torch.utils.data.DataLoader对象,并且

    2022年6月11日
    82
  • jsessionid的困扰「建议收藏」

    问题:向某银行发送支付请求时,如果客户端cookie开启,第一次请求时,请求地址会自动增加一jsessionid,第二次没有问题。如果客户端cookie关闭,无论如何请求地址会自动添加一jsessionid,从而导致支付页面不能显示。————————-查了网上的一些解决办法,找到原因,如下:在你的程序第一次访问服务器的时候,服务端并不知道

    2022年4月14日
    110
  • FileInputFormat

    FileInputFormat最顶级是InputFormat抽象类,该类定义了两个方法,方法getSplits是负责切分输入文件(们)的,把很多的输入文件(们)切分成很多的输入分片,切分规则就是在这里定义的,每个InputSpl

    2022年7月2日
    23
  • 简单网页制作「建议收藏」

    简单网页制作「建议收藏」我们以山东理工大学作为实例:1。首先分析网页有几块模块组成(div)组成。大div里面又有几块小div组成。即:画红线代表网页的模块(div).2.用QQ截图来测量网站模块的具体尺寸。然后布

    2022年8月3日
    10

发表回复

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

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