银行家算法

#include <string.h>
#include <stdio.h>
#include <iostream>
#define FALSE 0
#define TRUE 1
#define W 10
#define R 10
using namespace std;
int M ; // 总进程数
int N ; // 资源种类
int ALL_RESOURCE[W];// 各种资源的数目总和
int MAX[W][R]; // M个进程对N类资源最大资源需求量
int AVAILABLE[R]; // 系统可用资源数
int ALLOCATION[W][R]; // M个进程已经得到N类资源的资源量
int NEED[W][R]; // M个进程还需要N类资源的资源量
int Request[R]; // 请求资源个数
void output()
{
    int i,j;
    cout<<endl<<"━━━━━━━━━━━━━━━━━━"<<endl;
    cout<<"各种资源的总数量:"<<endl;
    for (j=0;j<N;j++)
        cout<<" 资源"<<j<<": "<<ALL_RESOURCE[j];
    cout<<endl;
    cout<<"━━━━━━━━━━━━━━━━━━"<<endl;
    cout<<"目前各种资源可利用的数量为:"<<endl;
    for (j=0;j<N;j++)
        cout<<" 资源"<<j<<": "<<AVAILABLE[j];
    cout<<endl;
    cout<<"━━━━━━━━━━━━━━━━━━"<<endl;
    cout<<"各进程还需要的资源数量:"<<endl<<endl;
    for(i=0;i<N;i++)
        cout<<"        资源"<<i;
    cout<<endl;
    for (i=0;i<M;i++)
    {
        cout<<"进程"<<i<<":   ";
        for (j=0;j<N;j++)
        cout<<NEED[i][j]<<"         ";
        cout<<endl;
    }
    cout<<endl;
    cout<<"━━━━━━━━━━━━━━━━━━"<<endl;
    cout<<"各进程已经得到的资源量: "<<endl<<endl;
    for(i=0;i<N;i++)
        cout<<"        资源"<<i;
    cout<<endl;
    for (i=0;i<M;i++)
    {
        cout<<"进程"<<i<<":    ";
        for (j=0;j<N;j++)
        cout<<ALLOCATION[i][j]<<"         ";
        cout<<endl;
    }
    cout<<endl;
}

void distribute(int k)
{
    int j;
    for (j=0;j<N;j++)
    {
        AVAILABLE[j]=AVAILABLE[j]-Request[j];
        ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
        NEED[k][j]=NEED[k][j]-Request[j];
    }
}

void restore(int k)
{
    int j;
    for (j=0;j<N;j++)
    {
        AVAILABLE[j]=AVAILABLE[j]+Request[j];
        ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
        NEED[k][j]=NEED[k][j]+Request[j];
    }
}

int check()
{
    int WORK[R],FINISH[W];
    int i,j;
    for(j=0;j<N;j++) WORK[j]=AVAILABLE[j];
    for(i=0;i<M;i++) FINISH[i]=FALSE;
        for(i=0;i<M;i++)
        {
            for(j=0;j<N;j++)
            {
                if(FINISH[i]==FALSE&&NEED[i][j]<=WORK[j])
                {
                    WORK[j]=WORK[i]+ALLOCATION[i][j];
                }
            }

            FINISH[i]=TRUE;
        }
        for(i=0;i<M;i++)
        {
            if(FINISH[i]==FALSE)
            {
                cout<<endl;
                cout<<" 系统不安全!!! 本次资源申请不成功!!!"<<endl;
                cout<<endl;
                return 1;
            }
            else
            {
                cout<<endl;
                cout<<" 经安全性检查,系统安全,本次分配成功。"<<endl;
                cout<<endl;
                return 0;
            }

        }
}

void bank()   // 银行家算法
{
    int i=0,j=0;
    char flag='Y';
    while(flag=='Y'||flag=='y')
    {
        i=-1;
        while(i<0||i>=M)
        {
            cout<<"━━━━━━━━━━━━━━━━━━"<<endl;
            cout<<endl<<" 请输入需申请资源的进程号:";
            cin>>i;
            if(i<0||i>=M)  cout<<" 输入的进程号不存在,重新输入!"<<endl;
        }
        cout<<" 请输入进程"<<i<<"申请各类资源的数量:"<<endl;
        for (j=0;j<N;j++)
        {
            cout<<" 资源"<<j<<": ";
            cin>>Request[j];
            if(Request[j]>NEED[i][j]) // 若请求的资源数大于进程还需要i类资源的资源量j
            {
                cout<<endl<<" 进程"<<i<<"申请的资源数大于进程"<<i<<"还需要"<<j<<"类资源的数量!";
                cout<<" 若继续执行系统将处于不安全状态!"<<endl;
                flag='N';
                break;
            }
            else
            {
                if(Request[j]>AVAILABLE[j]) // 若请求的资源数大于可用资源数
                {
                    cout<<endl<<" 进程"<<i<<"申请的资源数大于系统可用"<<j<<"类资源的数量!";
                    cout<<" 若继续执行系统将处于不安全状态!"<<endl;
                    flag='N';
                    break;
                }

            }

        }
        if(flag=='Y'||flag=='y')
        {
            distribute(i); // 调用change(i)函数,改变资源数
            if(check()) // 若系统安全
            {
                restore(i); // 调用restore(i)函数,恢复资源数
                output();   // 输出资源分配情况
            }
            else       // 若系统不安全
                output(); // 输出资源分配情况
        }
        else      // 若flag=N||flag=n
            cout<<endl;
        cout<<" 是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ";
        cin>>flag;
    }
}

void version()
{
    cout<<endl;
    cout<<"\t              银 行 家 算 法         "<<endl;
}

int main() // 主函数
{
    int i=0,j=0,p;
    version();
    getchar();
    cout<<endl<<"请输入总进程数:";
    cin>>M;
    cout<<endl<<"━━━━━━━━━━━━━━━━━━"<<endl;
    cout<<"请输入总资源种类:";
    cin>>N;
    cout<<endl<<"━━━━━━━━━━━━━━━━━━"<<endl;
    cout<<"请输入各类资源总数:(需要输入数为"<<N<<"个)";
    for(i=0;i<N;i++)
        cin>>ALL_RESOURCE[i];
    cout<<endl<<"━━━━━━━━━━━━━━━━━━"<<endl;
    cout<<"输入各进程所需要的各类资源的最大数量:(需要输入数为"<<M*N<<"个)";
    for (i=0;i<M;i++)
    {
        for (j=0;j<N;j++)
        {
            do
            {
                cin>>MAX[i][j];
                if (MAX[i][j]>ALL_RESOURCE[j])
                    cout<<endl<<"占有资源超过了声明的该资源总数,请重新输入"<<endl;
            }
            while (MAX[i][j]>ALL_RESOURCE[j]);
        }
    }
    cout<<endl<<"━━━━━━━━━━━━━━━━━━"<<endl;
    cout<<"输入各进程已经占据的各类资源的数量:(需要输入数为"<<M*N<<"个)";
    for (i=0;i<M;i++)
    {
        for (j=0;j<N;j++)
        {
            do
            {
                cin>>ALLOCATION[i][j];
                if (ALLOCATION[i][j]>MAX[i][j])
                    cout<<endl<<"占有资源超过了声明的最大资源,请重新输入"<<endl;
            }
            while (ALLOCATION[i][j]>MAX[i][j]);
        }
    }
    for (j=0;j<N;j++)  // 初始化资源数量
    {
        p=ALL_RESOURCE[j];
        for (i=0;i<M;i++)
        {
            p=p-ALLOCATION[i][j];// 减去已经被占据的资源
            AVAILABLE[j]=p;
            if(AVAILABLE[j]<0)
                AVAILABLE[j]=0;
        }
    }
    for (i=0;i<M;i++)
        for(j=0;j<N;j++)
            NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];
    output();
    bank();
    return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设计一个n个并发进程共享m个系统资源的程序以实现银行家算法。要求: 1) 简单的选择界面; 2) 能显示当前系统资源的占用和剩余情况。 3) 为进程分配资源,如果进程要求的资源大于系统剩余的资源,不与分配并且提示分配不成功; 4) 撤销作业,释放资源。 编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁的发生。 银行家算法分配资源的原则是:系统掌握每个进程对资源的最大需求量,当进程要求申资源时,系统就测试该进程尚需资源的最大量,如果系统中现存的资源数大于或等于该进程尚需求资源最大量时,就满足进程的当前申。这样就可以保证至少有一个进程可能得到全部资源而执行到结束,然后归还它所占有的全部资源供其它进程使用。 银行家算法中的数据结构 (1)可利用资源向量Available(一维数组) 是一个含有m个元素,其中的每一个元素代表一类可利用的资源数目,其初值是系统中所配置的该类全部可用资源数目。如果Available[j]=k, 表示系统中现有Rj类资源k个。 (2)最大需求矩阵Max(二维数组) m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max(i,j)=k, 表示进程i需要Rj类资源的最大数目为k。 (3)分配矩阵Allocation(二维数组) m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation(i,j)=k, 表示进程i当前已分得Rj类资源k个。 (4)需求矩阵Need (二维数组) 是一个含有n*m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need(i,j)=k, 表示进程i还需要Rj类资源k个,方能完成其任务。 Need(i,j)= Max(i,j)-Allocation(i,j)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值