一、内容描述:
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.运行结果: