银行家算法

 要求:针对3类资源、5个进程的情况,设计相应的数据结构,分别表示每个进程占用各类资源的情况;编程实现安全性算法函数,编制主函数,动态输入资源的占用情况,进程的资源申请,调用安全性函数,实现银行家算法

 

 

#include "stdafx.h"

#include <stdio.h>

#include <iostream.h>

int available[3];         //可用资源

int work[3];              //工作向量

bool finish[5];           //用以判断系统是否有足够资源分给相应进程

int pro;                  //请求资源的进程

struct process {

    int max[3];           //资源最大需求量

    int allocation[3];    //已分配资源

    int need[3];          //还需要的资源

    int request[3];       //请求资源量

 

}p[5];

/*********************输入各类资源量及进程中各类资源的情况*****************/

void input(){

       cout<<"请输入各类资源的可用量"<<endl;

       for (int i=0;i<3;i++)

       {

              cin>>available[i];  //全部可用资源量

       }

       for (i=0;i<5;i++)

       {

              finish[i]=false;    //初始化finish[i]

              cout<<"请输入进程"<<i<<"对各类资源的最大需求量"<<endl;

              for (int j=0;j<3;j++)

              {

                     cin>>p[i].max[j];

              }

              cout<<"请输入进程"<<i<<"已分配的各类资源量"<<endl;

              for (j=0;j<3;j++)

              {

                     cin>>p[i].allocation[j];

              //     cout<<"需求量"<<p[i].allocation[j]<<endl;

              //     cout<<""

                     if (p[i].allocation[j]>available[j])

                     {

                            cout<<"您输入的已分配资源量大于资源总量,请重新输入!"<<endl;

                            j--;

                            continue;

                     }

                     if (p[i].allocation[j]>p[i].max[j])

                     {

                            cout<<"您输入的已分配资源量大于所需最大资源总量,请重新输入!"<<endl;

                            j--;

                            continue;

                     }

                     available[j]-=p[i].allocation[j];    //分配资源后可利用资源减少

              }

              for (j=0;j<3;j++)

              {

                     p[i].need[j]=p[i].max[j]-p[i].allocation[j];

                     p[i].request[j]=0;

              }

       }  

}

/*****************************输出当前时刻资源的分配情况**************************/

void print(){

       cout<<"*****************此时的资源分配情况****************"<<endl;

       cout<<"Process   Max      Allocation     Need     Available"<<endl;

       for (int i=0;i<5;i++)

       {

              cout<<"  "<<i<<"     ";

              for (int j=0;j<3;j++)

              {

                     cout<<p[i].max[j]<<"  ";

                    

              }

              cout<<"   ";

              for (j=0;j<3;j++)

              {

                     cout<<p[i].allocation[j]<<"  ";

              }

              cout<<"   ";

              for (j=0;j<3;j++)

              {

                     cout<<p[i].need[j]<<"  ";

              }

              cout<<"   ";

              if (i==0)

              {

                     for(j=0;j<3;j++)

                            cout<<available[j]<<"  ";

                    

              }

              cout<<endl;

       }

}

/*********************银行家算法*****************/

void banker(){

       cout<<"请输入请求资源的进程(0~~4"<<endl;

       cin>>pro;

       if (pro>4)

       {

              cout<<"输入了错误的进程号,请检查"<<endl;

              return;

       }

       cout<<"请输入进程所请求的各类资源量"<<endl;

       for (int i=0;i<3;i++)

       {

              cin>>p[pro].request[i];

              if (p[pro].request[i]>p[pro].need[i])

              {

                     cout<<"进程请求资源量超过其所需最大资源量,非法请求"<<endl;

                     break;

              }

              if (p[pro].request[i]>available[i])

              {

                     cout<<"进程请求资源量超过可用资源量,进程等待"<<endl;

                     break;

              }

              available[i]-=p[pro].request[i];

              p[pro].allocation[i]+=p[pro].request[i];

              p[pro].need[i]-=p[pro].request[i];

       }

}

/*********************安全性算法*****************/

void safe(){

       int k=0;

       int safe[5]={-1,-1,-1,-1,-1}; //用于存放安全序列

       for (int i=0;i<3;i++)

       {

              work[i]=available[i];

       }

       for (i=0;i<5;i++)

       {

              //cout<<"i的值"<<i<<endl;

              if (finish[i]==false)

              {

                     //cout<<"check "<<i<<endl;

                     for(int j=0;j<3;j++)

                     {

                            if (p[i].need[j]>work[j])

                            {

                                   //cout<<i<<"不安全"<<endl;

                                   break;

                            }

                     }

              /*    if (finish[i]==true)

                     {

                            cout<<i<<"为真,输出"<<endl;

                     }*/

                     if (j==3)

                     { 

                            //cout<<"find  "<<i<<endl;

                            for (j=0;j<3;j++)

                            {

                               work[j]+=p[i].allocation[j];

                               // cout<<"  "<<work[j];

                            }    

                            //cout<<endl;

                            finish[i]=true;

                            //cout<<i<<"值为真"<<endl;

                            //     print();

                            safe[k]=i;

                            i=-1;

                            k++;

                            }    

              }

       }

       for (i=0;i<5;i++)

       {

              if (finish[i]==false)

              {

                     cout<<"系统处于不安全状态不能分配"<<endl;

                     for (int j=0;j<3;j++)

                     {

                            available[j]+=p[pro].request[j];

                            p[pro].allocation[j]-=p[pro].request[j];

                      p[pro].need[j]+=p[pro].request[j];

                     }

                     break;

              }

       }

       if (i==5)

       {

              cout<<"系统处于安全状态,一个安全序列是"<<endl;

              for (i=0;i<5;i++)

              {

                     cout<<"p["<<safe[i]<<"]"<<" ";

                     finish[i]=false;

              }

              cout<<endl;

       }

}

/*********************主函数*****************/

int main(int argc, char* argv[])

{

       char b;

       input();

       print();

       safe();

       cout<<"/n要继续申请资源,请按'y''Y',否则按'n''N'"<<endl;

       cin>>b;

    if (b=='y'||b=='Y')

    {    

       banker();

       safe();

    }

       else{

              return 0;

       }

 

       return 1;

}

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值