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)
上一篇 2022年5月7日 下午7:20
下一篇 2022年5月7日 下午7:20


相关推荐

  • CultureInfo中重要的InvariantCulture[通俗易懂]

    CultureInfo中重要的InvariantCulture[通俗易懂]CultureInfo简述CultureInfo类位于System.Globalization命名空间内,这个类和这个命名空间许多人都不了解也认为不需要太多了解,实际上,你写的程序中会经常间接得使用这些类。简单的说:当进行数字,日期时间,字符串匹配时,都会进行CultureInfo的操作,也就是不同的CultureInfo下,这些操作的结果可能会不一样。这里要介绍一下非常容易被忽视的In…

    2022年6月19日
    26
  • Linux FTP使用命令

    Linux FTP使用命令文章目录 1 安装 ftp 客户端 2 ftp 的用户 3 登录服务器 4 切换工作目录 5 查看服务器上的目录和文件 6 下载 上传文件 6 1 文件传输的模式 6 2 下载文件 6 3 上传文件 7 其他 ftp 命令 1 安装 ftp 客户端 yum yinstallftp2 ftp 的用户缺省情况下 ftp 服务器和操作系统用户名 密码一样 root 用户的权限过大 不允许登录 ftp 服务器 3 登录服务器方法一 输入 ftp 服务器 ip 地址 回车后根据提示输入用户名和密码方法二 输入 ftp 用 open 服务器 ip 地址

    2026年3月19日
    3
  • 划分子网例题详解

    划分子网例题详解划分子网例题详解(网络基础考试题目)1,假设取得网络地址200.200.200.0 ,子网掩码为255.255.255.0。现在一个子网有100台主机,另外4个子网有20台主机,请问如何划分子网,才能满足要求。请写出五个子网的子网掩码、网络地址、第一个主机地址、最后一个主机地址、广播地址。(子网号可以全0和全1)。请直接写出最后答案。 还没做题之前先要明确IP地址的命名方式、划分子网的实质、以及子…

    2022年6月27日
    32
  • android 如何打开s3db,Android开发教程:使用已有的SQL数据库

    android 如何打开s3db,Android开发教程:使用已有的SQL数据库极品好儿媳全文阅读,燃料乙醇放量,嘉兴办公家具,应向阳,58会展网,证书挂靠,鱼缸清洗,qq蜡笔小新头像我在sqliteadmin创建好数据库StuDB,里面的表如下:650)this.width=650;”>将创建好的数据库在DDMS中点击650)this.width=650;”>导入到data/data/程序的包名/650)this.width=650;”>SQLit…

    2022年6月4日
    37
  • ant安装配置使用介绍及eclipse中使用

    ant安装配置使用介绍及eclipse中使用一、安装ant到官方主页http://ant.apache.org下载新版(目前为Ant1.8.1)的ant,得到的是一个apache-ant-1.8.1-bin.zip的压缩包。将其解压到你的硬盘上,例如:C:\apache-ant-1.8.1。ant是java编写的,具有跨平台特点。.需要安装JDK,二、配置环境变量window中设置ant环境变量:配置环境变量

    2022年7月18日
    22
  • 在Windows XP使用LC5(L0phtCrack)[通俗易懂]

    在Windows XP使用LC5(L0phtCrack)[通俗易懂]在主机里新建用户名,密码陆续为空密码,与用户名相同密码,password123,分别进行登陆测试;

    2022年7月24日
    7

发表回复

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

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