上周操作系统的实验,就是模拟实现银行家算法,首先我们还是应该对银行家算法熟悉一下。
银行家算法是最具代表性的避免死锁的算法。因为该算法原本是为银行系统设计的,以确保银行在发放现金贷款时,不会发生不满足所有客户需求的情况。在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