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");
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • chmod的用法_group用法与语法

    chmod的用法_group用法与语法介绍Linux中的Chmod命令用于更改或分配文件和目录的权限。在Linux/Unix系统中,文件和目录的可访问性是由文件所有权和权限决定的。在上一篇文章中,我们了解了如何使用chown命令管理文件和目录的所有权。在本教程中,我们将介绍chmod命令。chmod命令(changemode的缩写)用于管理文件和目录权限,并确定谁可以访问它们。现在让我们深入了解文件和目录权限的本质,以及如何修改它们。Linux权限文件和目录可以属于文件(u),组(g)或其他(o)的所有者u-所有人的权限g

    2022年10月20日
  • C语言之格式化输出字符

    C语言之格式化输出字符1、格式化输出字符:%d十进制有符号整数%ld十进制long有符号整数%u十进制无符号整数%o以八进制表示的整数%x以十六进制表示的整数%ffloat型浮点数%lfdouble型浮点数%e指数形式的浮点数%c单个字符%s字符串%p指针的值2、特殊应用:%5d要求宽度为5位,如果不足5位,前面空格补齐;如果足够5位,此语句无效。%05d要求宽度为5位,如果不足5位,前面0补…

  • vue脚手架基本使用[通俗易懂]

    vue脚手架基本使用[通俗易懂]vue脚手架基本使用

  • 如何跳过MVC中的ValidateRequest验证

    如何跳过MVC中的ValidateRequest验证
    MVC中客户端传值到服务器端时,如果客户端字符串含有““字样时就会报“检测到有潜在危险”的错误。
    如:从客户端(“test
    ttt”)中检测到有潜在危险的Request.Form值。
    解决办法:在对应的ActionResult前面加上[ValidateInput(false)]就可以解决,去除验证。

     
    下面是一个富文本的页面源码示例:
    <%@PageLanguage="C#"MasterPageFile="~/V

  • linux中运行bminer,ETH/ETC挖矿教程:Bminer & Ethminer

    linux中运行bminer,ETH/ETC挖矿教程:Bminer & Ethminer一、操作系统:windowsLinux二、挖矿软件:Bminer(N卡)Ethminer(N卡/A卡)三、挖矿教程:bminer使用教程1.解压压缩包2.修改mine.bat右键点击mine.bat->编辑->删除所有原文件内容->将下方内容粘贴至文件@echoOFFSETADDRESS=__需要修改__SETUSERNAME=%ADDRESS%.__需要修改__SET…

    2022年10月15日
  • nextline函数_在JAVA中Scanner中的next()和nextLine()为什么不能一起使用?

    nextline函数_在JAVA中Scanner中的next()和nextLine()为什么不能一起使用?Java输入一直是一个坑,本来一直用Scanner,但一直搞不懂换行符啥的,就用BufferReader,但前不久大疆笔试需要持续输入,早忘了Scanner怎么写,而那个场景用Scanner很好实现……就继续在这里记录一下Scanner的坑吧一、next&nextLine区别next不能得到带有空格的字符串一定要读到有效字符后才可以结束,结束条件是碰到空格…

发表回复

您的电子邮箱地址不会被公开。

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