银行家算法模拟实现

一、内容描述:
1.初始化资源
由用户输入数据,分别对可利用资源向量矩阵 AVAILABLE、最大需求矩阵 MAX、分配矩阵ALLOCATION、需求矩阵 NEED 赋值。
2.银行家算法
避免死锁方法把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。银行家算法的基本思想:分配资源之前,判断系统是否是安全的;若安全,才分配。它是最具有代表性的死锁避免算法。
设进程 cusneed 提出请求 REQUEST [i],则银行家算法按如下步骤进行检查:
(1)如果 REQUEST [cusneed][i]<= NEED[cusneed][i],则转(2);否则,出错,因为它所需资源数超过它宣布的最大值。
(2)如果 REQUEST [cusneed][i]<= AVAILABLE[cusneed][i],则转(3);否则,出错,表示尚无足够资源,进程必须等待。
(3)系统试探分配资源,修改下面数据结构中的相关数据:
AVAILABLE[i] = AVAILABLE[i] - REQUEST[cusneed][i];
ALLOCATION[cusneed][i] = ALLOCATION[cusneed][i] + REQUEST[cusneed][i];
NEED[cusneed][i] = NEED[cusneed][i] - REQUEST[cusneed][i];
(4)系统执行安全性检查。如安全,则分配成立;否则本次试探险性分配作废,恢复原来的资源状态,OS 只能让进程等待。
3.安全性检查算法
(1) 设置两个向量
工作向量(系统可提供的资源数):初始值 Work=AVAILABLE;
状态向量(是否有足够的资源分配给进程,并使得进程运行完成):
初始值 FINISH=false;如资源足够分配:FINISH=true
(2) 从进程集合中找到一个满足下述条件的进程,
FINISH==false;
NEED<=Work;
如找到,执行(3);否则,执行(4)
(3) 设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work = Work + ALLOCATION;
Finish=true;
转到(2)
(4) 如所有的进程 Finish= true,则表示系统安全;否则系统处于不安全状态。
二、代码实现
1.代码:

#include <stdio.h>   
#include <curses.h>  
#define MAXPROCESS 50 /*最大进程数*/ 
#define MAXRESOURCE 100 /*最大资源数*/ 
int AVAILABLE[MAXRESOURCE]; /*可用资源数组*/ 
int MAX[MAXPROCESS][MAXRESOURCE]; /*最大需求矩阵*/ 
int ALLOCATION[MAXPROCESS][MAXRESOURCE]; /*分配矩阵*/ 
int NEED[MAXPROCESS][MAXRESOURCE]; /*需求矩阵*/ 
int REQUEST[MAXPROCESS][MAXRESOURCE]; /*进程需要资源数*/ 
bool FINISH[MAXPROCESS]; /*系统是否有足够的资源分配*/
int p[MAXPROCESS]; /*记录序列*/ 
int m,n; /*m 个进程,n 个资源*/ 
void Init(); 
bool Safe();  
void Bank(); 
void main()
{ 
Init(); 
Safe(); 
Bank(); 
} 
void Init() {
int i,j; 
printf("请输入进程的数目:");  
scanf("%d",&m); 
printf("请输入资源的种类:");   
scanf("%d",&n); 
printf("请输入每个进程最多所需的各资源数,按照%d x %d 矩阵输入\n",m,n);
for(i=0;i<m;i++) 
for(j=0;j<n;j++) scanf("%d",&MAX[i][j]); 
printf("请输入每个进程已分配的各资源数,也按照%d x %d 矩阵输入\n",m,n);
for(i=0;i<m;i++) 
{ 
for(j=0;j<n;j++) 
{ 
scanf("%d",&ALLOCATION[i][j]); 
if(NEED[i][j]<0) 
{ 
printf("您输入的第%d 个进程所拥有的第%d 个资源数错误,请重新输入:\n",i+1,j+1);
j--; 
} 
} 
} 
printf("请输入各资源现有数量:\n");
for(i=0;i<n;i++) scanf("%d",&AVAILABLE[i]);
} 
/*银行家算法*/
void Bank()
{ 
int i,cusneed;  
char flag;
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(%s”,&flag); 
if(flag=='y' || flag=='Y') continue; 
break; 
} 
} 
/*安全性算法*/ 
bool Safe() 
{ 
int i,j,k,l=0; 
int Work[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) 
{ 
printf("系统是安全的\n"); 
printf("安全序列:\n"); 
for(i=0;i<l;i++) 
{ 
printf("%d",p[i]); 
if(i!=l-1) printf("-->"); 
} 
printf("\n"); 
return true; 
} 
} 
printf("系统是不安全的\n"); 
return false; 
}

2.运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值