#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");
}