银行家安全算法

// Banker.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "iostream"
#include "string"
using namespace std;

const int M = 100;      //进程的最大值
const int N = 100;      //资源的最大值
int Avaliable [N];      //Available:可利用资源向量
int temp[100]={0};      //存放安全序列
int Work[100]={0};      //存放系统可提供资源
char Name[N];           //资源的名称
int Max[M][N];          //M进程对N类资源的最大需求
int Allocation[M][N];   //M进程已获得的资源N
int Need[M][N];         //表示M进程尚需资源N的数量
int Request[M][N];      // 表示M进程请求资源N
int NumR;               //资源种类的数量
int NumC;               //进程的数量
/*
    以上数据存在如下关系:
       Need[M][N] = Max[M][N] - Allocation[M][N]
*/

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

void Initialize()// 对开始时的资源、进程进行初始化
{
    /* 对Available[i]进行初始化 */
    cout<<"请输入资源种类的数量"<<endl;
    cin>>NumR;
    for (int i = 0;i<NumR;i++)
    {
        cout<<"资源"<<i+1<<"的名称:";
        cin>>Name[i];       //输入资源的名称
        cout<<"资源"<<i+1<<"的数量:"<<endl;
        cin>>Avaliable[i];  //输入资源的数量
    }
    cout<<endl<<"请输入进程的数量:";
    cin>>NumC;              //输入进程数量

    /* 对 Max[i][j]的初始化 */
    cout<<"请输入各进程的最大需求量("<<NumC<<"*"<<NumR<<"矩阵)[Max]:"<<endl<<"资源:";
    for(int i=0;i<NumR;i++)
    {
        cout<<Name[i]<<"   ";
    }
    cout<<endl;
    for(int i=0;i<NumC;i++)
    {
        cout<<"进程"<<i<<":" ;
        for(int j=0;j<NumR;j++)
            cin>>Max[i][j];//输入进程i对资源j的最大需求
    }

    /* 对Allocation[i][j] Need[i][j]进行初始化*/
    cout<<"请输入各进程已经申请的资源量("<<NumC<<"*"<<NumR<<"矩阵)[Allocation]:"<<endl<<"资源:";
    for(int i=0;i<NumR;i++)
    {
        cout<<Name[i]<<"   ";
    }
    cout<<endl;
    for(int i=0;i<NumC;i++)
    {
        cout<<"进程"<<i<<":" ;
        for(int j=0;j<NumR;j++)
        {
             cin>>Allocation[i][j];//输入进程i对资源j的最大需求
              Need[i][j]=Max[i][j]-Allocation[i][j];
         
        }
            
    }
 
}

void ShowDate()// 显示资源分布状况
{
    cout<<"系统目前可用的资源[Avaliable]:"<<endl;
    for(int i=0;i<NumR;i++)
    cout<<Name[i]<<" ";
    cout<<endl;
    for (int j=0;j<NumR;j++)
    cout<<Avaliable[j]<<" ";//输出可用分配资源
    cout<<endl;
    cout<<"             Max      Allocation     Need"<<endl;
    cout<<"进程名     ";
    for(int j=0;j<NumC;j++){
        for(int i=0;i<NumR;i++)
            cout<<Name[i]<<" ";
        cout<<"      ";
    }
    cout<<endl;
    for(int i=0;i<NumC;i++){
        cout<<" "<<i<<"         ";
        for(int j=0;j<NumR;j++)
            cout<<Max[i][j]<<" ";
        cout<<"      ";
        for(int j=0;j<NumR;j++)
            cout<<Allocation[i][j]<<" ";
        cout<<"      ";
        for(int j=0;j<NumR;j++)
            cout<<Need[i][j]<<" ";
        cout<<endl;
    }

}

bool Safe()
{
    int i,k=0,m,apply,Finish[100]={0};//Finish[100]初始化
    int j;
    int flag=0;
    for(int i=0;i<NumR;i++)
    {
        Work[i]=Avaliable[i];
    }
    for(i=0;i<NumC;i++)
    {
        apply=0;  //当 apply 用来计算检验过的资源数
        for(j=0;j<NumR;j++)
        {
            if (Finish[i]==0&&Need[i][j]<=Work[j])  // 对进程 i 的 j 资源进行确认
            {   
                apply++;
                if(apply==NumR)
                {
                    for(m=0;m<NumR;m++)
                        Work[m]=Work[m]+Allocation[i][m];//变分配数
                    Finish[i]=1;
                    temp[k]=i;
                    i=-1;
                    k++;
                    flag++;
                }
            }
        }
    }
    for(i=0;i<NumC;i++){
        if(Finish[i]==0){
            cout<<"系统不安全"<<endl;//不成功系统不安全
            return 0;
        }
    }
    cout<<"系统是安全的!"<<endl;//如果安全,输出成功
    cout<<"分配的序列:";
    for(i=0;i<NumC;i++){//输出运行进程数组
        cout<<temp[i];
        if(i<NumC-1) cout<<"->";
    }
    cout<<endl;
    return 1;
}

void Banker() //银行家算法
{
    int i,j;
    char k;
    cout<<"请输入发出请求的进程:\n";
    cin>>i;
    cout<<"请输入请求资源类型: \n";
    cin>>k;
    for(int l=0;l<NumR;l++)
    {
        if(k==Name[l])
        {
            j=l;
            break;
        }
    }
    cout<<"请输入请求资源数量"<<endl;
    cin>>Request[i][j];
    if(Request[i][j]>Need[i][j])
    {
        cout<<"error :Your request is beyond system's need !"<<endl;
    }
    else if(Request[i][j]>Max[i][j])
    {
        cout<<"error : Your request is beyond system's have ! "<<endl;
    }
    else
    {
                Avaliable[j]=Avaliable[j]-Request[i][j];
                Allocation[i][j] = Allocation[i][j]+Request[i][j];
                Need[i][j] = Need[i][j] - Request[i][j];
                ShowDate(); //显示修改后的资源分布情况
                if(Safe())
                {
                    cout<<"分配成功!"<<endl;
                }
                else
                {
                    Avaliable[j]=Avaliable[j]+Request[i][j];
                    Allocation[i][j] = Allocation[i][j]-Request[i][j];
                    Need[i][j] = Need[i][j] + Request[i][j];
                    cout<<"分配失败,进程P"<<i<<"请等待"<<endl;
                 }
    }
}


int main()
{
    Initialize();
    ShowDate();
    while(1)
    {
        Banker();
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值