回 帖 发 新 帖 刷新版面

主题:有点问题 的银行家算法

#include<iostream.h>
#include <stdlib.h>
#include<iomanip.h>
#include<conio.h>
const   int   N=5;  //行数  0,1,2,3,4 
const   int   M=3;  //列数  0,1,2

void Print(int Available[M],int Need[N][M],int Allocation[N][M])  //打印输出看一下结果
{
    int i;
    cout<<"A,B,C现在已经分配如下: \n\n";
    cout<<"进程名\t"<<"    Allocation\t\t"<<"Need\t\t"<<"Available"<<endl;
    cout<<"\t    A   B   C"<<"\t     A   B   C"<<"\t\tA   B   C\n";
    cout<<"---------------------------------------------------------\n";
    for(i=0;i<N;i++)
    {
        cout<<setw(4)<<i<<setw(9);
        cout<<Allocation[i][0]<<setw(4)<<Allocation[i][1]<<setw(4)<<Allocation[i][2]<<setw(9);
        cout<<Need[i][0]<<setw(4)<<Need[i][1]<<setw(4)<<Need[i][2]<<setw(11);
        if(i==0)
            cout<<Available[0]<<setw(4)<<Available[1]<<setw(4)<<Available[2]<<endl;
        else
            cout<<endl;
    }
}


bool issafe(int Available[M],int Need[N][M],int Allocation[N][M])  //用银行家方法试着分配了后,现在来看系统是否处于安全状态
{
    int   work[M];      
    int   i,j,num=0,flag=N;   
    bool   finish[N]={false,false,false,false,false};   
    for(i=0;i<M;i++)  //i表示第i列   
        work[i]=Available[i];   //在执行安全性算法开始时
    while(--flag>=0)  //对所有的进程扫描N次
    {        
        for(i=0;i<N;i++)  
        {    
            if(finish[i]==false)
            {
                if(Need[i][0]<=work[0] && Need[i][1]<=work[1] && Need[i][2]<=work[2])
                {
                    if(Need[i][0]!=0 || Need[i][1]!=0 || Need[i][2]!=0)  
                        for   (j=0;j<M;j++)                    
                            work[j]=work[j]+Allocation[i][j]; 
                    finish[i]=true;
                    num++;
                    if(num==N)
                        return true;  //如果num==N的话就可以提前结束此子程序
                }
            }
        } 
    }   //用while 循环从头再来
    cout<<"###########"<<num<<endl;
    return   false; //跳出循环说明不是所有的finish[i]=ture
}

void Bank(int n,int Available[M],int Need[N][M],int Allocation[N][M],int Request[M])  //银行家算法
{
    char ch;
    for(int j=0;j<M;j++)  //n表示第n行
    {
        if (Request[j]>Need[n][j])   
        {
            ch=j+'A';  //为了更清楚是哪个资源请求过多
            cout<<"由于请求的 "<<ch<<" 资源大于需要的,所以不能分配\n";  
            Print(Available,Need,Allocation);
            return;   //结束
        }   
        else if (Request[j]>Available[j])   
        { 
            ch=j+'A';
            cout<<"由于请求的 "<<ch<<" 资源大于可分配的的,所以不能分配\n";   
            Print(Available,Need,Allocation);
            return; //结束  
        } 
    }
    
    for(j=0;j<M;j++)   //上面两个条件都满足,就修改
    {
        Allocation[n][j]+=Request[j];
        Available[j]-=Request[j];   
        Need[n][j]-=Request[j];
        if( (Need[n][0]==0) && (Need[n][1]==0) && (Need[n][2]==0) )  //若进程执行完了就收回资源
        {
            for(int i=0;i<M;i++)
                Available[i]=Allocation[n][i]+Available[i];
        }
    }    
    
    if(issafe(Available,Need,Allocation))  //调用安全性算法检测
    {
        cout<<"分配后系统处于安全状态,可以分配,如下:\n\n";
        Print(Available,Need,Allocation);
    }
    else                    //  分配后系统处于不安全状态,要撤消修改
    {
        cout<<"分配后系统处于不安全状态,不可以分配\n"; 
        for(j=0;j<M;j++) 
        {   
            Allocation[n][j]-=Request[j];   
            Available[j]+=Request[j]; 
            Need[n][j]+=Request[j];   
        }
        Print(Available,Need,Allocation);
    }
}


void main()
{
    int A,B,C;
    int choice;
    int Available[M]={3,3,2};   
    int Need[N][M]=  {  {7,4,3},
                        {1,2,2},
                        {6,0,0},
                        {0,1,1},
                        {4,3,1}
                    };   
    int Allocation[N][M]={  {0,1,0},
                            {2,0,0},
                            {3,0,2},
                            {2,1,1},
                            {0,0,2}
                        };   
    int Request[N];
    A=Available[0];
    B=Available[1];
    C=Available[2];
    for(int j=0;j<N;j++)
    {
        A=A+Allocation[j][0];
        B=B+Allocation[j][1];
        C=C+Allocation[j][2];
    }
    cout<<"系统中共有资源A="<<A<<endl;
    cout<<"系统中共有资源B="<<B<<endl;
    cout<<"系统中共有资源C="<<C<<endl;
    Print(Available,Need,Allocation);
    if(issafe(Available,Need,Allocation))  //调用安全性算法
        cout<<"此时系统处于安全状态\n";
    else
        return;  //一开始系统处于安全状态,程序结束
    do
    {
        cout<<"\n1.使用银行家算法  2.不使用银行家算法\n";
        cout<<"请选择: ";
        cin>>choice;        
        int n;
        cout<<"输入请求进程号(0---"<<N-1<<"): ";
        cin>>n;
        cout<<"输入 A 的请求资源: ";
        cin>>Request[0];
        cout<<"输入 B 的请求资源: ";
        cin>>Request[1];
        cout<<"输入 C 的请求资源: ";
        cin>>Request[2];
        //system("cls");
        if(choice==1)
            Bank(n, Available,Need,Allocation,Request) ;    //调用银行家算法
        //else
        //{
        //}
    }while( (A!=Available[0]) || (B!=Available[1]) || (C!=Available[2]) );  //这三个条件只要有一个满足,循环还是要做,所以不是&&
    cout<<"\n所以的进程都执行完了!\n";
}


回复列表 (共1个回复)

沙发


向大家推荐一个学习算法的网站.
算法源码吧  [url=http://www.sfcode.cn/]http://www.sfcode.cn/[/url]

我来回复

您尚未登录,请登录后再回复。点此登录或注册