上周操作系统的实验,就是模拟实现银行家算法,首先我们还是应该对银行家算法熟悉一下。
银行家算法是最具代表性的避免死锁的算法。因为该算法原本是为银行系统设计的,以确保银行在发放现金贷款时,不会发生不满足所有客户需求的情况。在OS中也可它来实现避免死锁。
算法概述:
为实现银行家算法,每一个进程在进入系统时,它必须申明在运行过程中,可能需要每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量,当进程请求一组资源时,系统必须首先确定是否有足够的资源分配给该进程。若有,再进一步计算在将这组资源分配给进程后,是否会使系统处于不安全状态。如果不会,才将资源分配给它,否则让进程等待。
typedef struct //按照书本上的描述,3种资源
{
int A;
int B;
int C;
} Resource;
const int m=5; //进程个数
Resource Available;//可利用的资源
Resource Max[m];//最大需求
Resource Allocation[m];//当前已分配的资源
Resource Need[m];//还需要的各种资源
int safeseq[m]; //安全序列bool banker(int process,Resource *res)
{
if(res->A<=Need[process].A && res->B<=Need[process].B &&res->C<=Need[process].C)//请求向量需要小于need矩阵中的值
{
if(res->A<=Available.A && res->B<=Available.B &&res->C<=Available.C)//请求的资源需要小于available矩阵的值
{
Probealloc(process,res);//试探分配
if(security())//安全性判断
{
return true;
}
else
{
printf("分配失败,原因:系统将进入不安全状态,有可能引起死锁。\n");
rollbock(process,res);//回滚
}
}
else
{
printf("安全性检查失败。原因:请求向量大于可利用资源向量。\n");
}
}
else
{
printf("安全性检查失败。原因:请求向量大于需求向量。\n");
}
return false;
}void Probealloc(int process,Resource *res)//试探分配
{
Available.A-=res->A;
Available.B-=res->B;
Available.C-=res->C;
Allocation[process].A+=res->A;
Allocation[process].B+=res->B;
Allocation[process].C+=res->C;
Need[process].A-=res->A;
Need[process].B-=res->B;
Need[process].C-=res->C;
}
void rollbock(int process,Resource *res)//若分配失败就进行回滚
{
Available.A+=res->A;
Available.B+=res->B;
Available.C+=res->C;
Allocation[process].A-=res->A;
Allocation[process].B-=res->B;
Allocation[process].C-=res->C;
Need[process].A+=res->A;
Need[process].B+=res->B;
Need[process].C+=res->C;
}bool security()//安全性算法
{
Resource work=Available;
bool finish[m]= {false,false,false,false,false};
int i,j=0;
for(i=0; i<m; i++)
{
if(finish[i]==false)
{
if(Need[i].A<=work.A&&Need[i].B<=work.B&&Need[i].C<=work.C)//判断是否有足够的资源可以进行分配
{
work.A+=Allocation[i].A;
work.B+=Allocation[i].B;
work.C+=Allocation[i].C;
finish[i]=true; //说明可以进行分配
safeseq[j++]=i;//记录安全序列的位置
i=-1;
}
}
}
for(int i=0; i<m; i++) //如果全部分配完全,则为安全状态。
{
if(finish[i]==false)
return false;
}
return true;
}
原文地址:http://blog.csdn.net/whjkm/article/details/41789637