银行家算法

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

 

posted @ 2017-09-28 15:16  TQCAI  阅读(286)  评论(0编辑  收藏  举报