银行家算法 C++简单实现

操作系统 银行家算法

#include<iostream>
using namespace std;
#include<vector>
#include<windows.h>
vector<vector<int> > mycin()
{
    int x,y;
    vector<vector<int> > v;
    cout<<"请输入进程的个数"<<endl;
    cin>>x;
    cout<<"请输入资源的个数"<<endl;
    cin>>y;
    cout<<"请输入T时刻的资源分配情况"<<endl;
    for(int i=0;i<x;i++){
        vector<int> vv;
        for(int j=0;j<3*y;j++){
            int o;cin>>o;
            vv.push_back(o);
        }
        v.push_back(vv);
    }
    cout<<"请输入系统可用资源:"<<endl;
    for(int i=0;i<y;i++){
        int o;cin>>o;
        v[0].push_back(o);
    }
    return v;
}
void mycout(vector<vector<int> > v)
{
    cout<<endl<<"资源分配情况如下:"<<endl;
    cout<<"       Max        Allocation       Need       Available"<<endl<<"    ";
    for(int i=0;i<4;i++){
        for(int j=0;j<v[0].size()/4;j++){
            char a='A';
            cout<<(char)(a+j)<<"   ";
        }
        cout<<"  ";
    }
    cout<<endl;
    for(int i=0;i<v.size();i++){
        cout<<"P"<<i<<"  ";
        for(int j=0;j<v[i].size();j++){
            if(j%(v[0].size()/4)==0&&j!=0)
                cout<<"  ";
            cout<<v[i][j]<<"   ";
        }
        cout<<endl;
    }
}
void compute(vector<vector<int> > v)
{
    int x=v.size();
    int y=v[0].size()/4;
    vector<int> p;
    int m=1; //是否满足
    int d=1;//是否安全
    for(int k=0;k<x;k++){//找x次,每次找一个,找不到就不安全
        for(int i=0;i<x;i++){
            m=1;
            for(int j=2*y;j<3*y;j++){//need数只要有一个大于可用的,就不满足
                if(v[i][j]>v[0][j+y])
                    m=0;
            }
            if(m==1){//上一个循环满足
                m=0;
                for(int j=2*y;j<3*y;j++){//need数只要有一个不等于0,就满足
                    if(v[i][j]!=0)
                        m=1;
                }
            }
            if(m==1){//满足分配
                for(int j=0;j<y;j++){
                    v[0][j+3*y]+=v[i][j+y];//完成分配,可用资源增加,need数置为0
                    v[i][j+2*y]=0;
                }
                p.push_back(i);
                break;
            }
        }
        if(m==0){
            cout<<"此状态时,系统不安全"<<endl<<endl;
            d=0;
            break;
        }
    }
    if(d==1){
        cout<<endl<<"此状态时,系统安全"<<endl;
        cout<<"存在一个安全序列如下:"<<endl;
        for(int i=0;i<p.size();i++){
            cout<<"p"<<p[i]<<"  ";
        }
        cout<<endl;
    }
}
void test(vector<vector<int> >&  v)
{
    int y=v[0].size()/4;
    while(1){
        int x;
        vector<int> vv;
        cout<<endl<<"请输入要申请资源的资源名:"<<endl;
        for(int i=0;i<v.size();i++){
            cout<<"P"<<i<<"  ";
        }
        cout<<endl;
        cin>>x;
        cout<<"请输入P"<<x<<"发出的请求向量,如:1 0 2"<<endl;
        for(int i=0;i<y;i++){
            int o;cin>>o;
            vv.push_back(o);
        }
        for(int i=0;i<y;i++){
            v[x][y+i]+=vv[i];
            v[x][2*y+i]-=vv[i];
            v[0][3*y+i]-=vv[i];
        }
        int k=0;//Need数是否都为零
        for(int i=0;i<y;i++){
            if(v[x][2*y+i]!=0)
                k=1;
        }
        if(k==0){
            cout<<"P"<<x<<"进程已结束"<<endl;
            for(int i=0;i<y;i++){
                v[0][3*y+i]+=v[x][y+i];
                if(x==0){
                    v[1].push_back(v[0][3*y+i]);
                }
            }
            v.erase(v.begin()+x);
        }
        compute(v);
        mycout(v);
        cout<<endl<<"是否继续申请资源:"<<endl;
        cout<<"1---继续   2----退出"<<endl;
        int m;cin>>m;
        if(m==2){
            break;
        }
        system("cls");
        mycout(v);
    }
}
int main()
{
    vector<vector<int> > v=mycin();
    mycout(v);
    compute(v);
    test(v);
}
/*
资源分配表1
进程数 5
资源数 3
5
3
7 5 3 0 1 0 7 4 3
3 2 2 2 0 0 1 2 2
9 0 2 3 0 2 6 0 0
2 2 2 2 1 1 0 1 1
4 3 3 0 0 2 4 3 1
3 3 2

5
3
7 5 3 0 1 0 7 4 3
3 2 2 3 0 2 0 2 0
9 0 2 3 0 2 6 0 0
2 2 2 2 1 1 0 1 1
4 3 3 0 0 2 4 3 1
2 3 0
*/

在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值