银行家算法
#include "LinkList.h" #include "MultiArr.h" #include "procs.h" #include "str.h" #include "stdio.h" void main() {while(1){ int i , j; int index; printf("请输入需要访问的文件夹号:\n"); scanf("%d",&index); CStr doc="test"+CStr(index)+"/"; CStr SMax=doc+"Max.txt"; CStr SAllocation=doc+"Allocation.txt"; CStr SNeed=doc+"Need.txt"; CStr SAvailable=doc+"Available.txt"; CMultiArr<int> Max(SMax.str,i); CMultiArr<int> Allocation(SAllocation.str,i); CMultiArr<int> Need(SNeed.str,i); CMultiArr<int> Available(SAvailable.str,i); int ProcN=Max.Size(0); int ResN=Max.Size(1); //display printf("最大需求矩阵 Max:\n"); for(i=0;i<ProcN;i++) { for(j=0;j<ResN;j++) printf("%d,",Max.Get(i,j)); printf("\n"); } printf("分配矩阵 Allocation:\n"); for(i=0;i<ProcN;i++) { for(j=0;j<ResN;j++) printf("%d,",Allocation.Get(i,j)); printf("\n"); } printf("需求矩阵 Need:\n"); for(i=0;i<ProcN;i++) { for(j=0;j<ResN;j++) printf("%d,",Need.Get(i,j)); printf("\n"); } printf("可用资源向量 Available:\n"); for(i=0;i<ResN;i++) printf("%d,",Available.Get(i,j)); printf("\n"); //Build Matric: Work CMultiArr<int> Work(Available);//copy by Available for(i=0;i<3;i++) printf("%d,",Work.Get(i)); printf("\n"); int * Finish=new int[ProcN]; zeros(Finish,ProcN);//构造Finish CLinkList<int> seq;//安全序列 int len,oldLen; while(1)//进程:行。资源:列。 { oldLen=seq.GetLen(); for(i=0;i<ProcN;i++)//i 是矩阵的列 { if(!Finish[i]){//如果未分配 bool yes=1; for(j=0;j<ResN;j++){//j 是资源。对资源进行遍历 if(Need.Get(i,j)>Work.Get(j) )//只要有一个资源大于了可分配资源 { yes=0; break; } } if(yes)//对于这个进程,所有资源都可以进行分配 {//i 进程可以使用 j 资源。运行完毕后Work的 j 资源可以加上他已分配的资源 for(int k=0;k<ResN;k++) Work.Set( Work.Get(k)+Allocation.Get(i,k) ,k);//i 是矩阵的列,代表进程。k是矩阵的行,代表资源 Finish[i]=1; seq.Add(i); } } } len=seq.GetLen(); if(len==oldLen){//检测到迭代后安全序列的长度没有变化 if(isEntire(1,Finish,ProcN)) { printf("安全序列为:"); seq.display(); } else {printf("不存在安全序列。\n"); seq.display();} break; } } printf("\n"); } system("pause"); }