操作系统作业之银行家算法实现

银行家算法

代码注释 之后再详细给出

#include<iostream>
#include<vector>
#include<string>
#include<iterator>
using namespace std;
class Process{
    string name;
    vector<int> Allocation;
    vector<int> Max;
    vector<int> Need;
public:
    /*
   Process()
   {
       A = B = C = D =0;
   }
   */
   Process(vector<int> A1,vector<int> M1,vector<int> N1,string sname):Allocation(A1),Max(M1),Need(N1),name(sname){}
   //void operator=(Person& p1){A = p1.A, B = p1.B, C = p1.C, D = p1.D;}
   //void setA(int xA){A = xA;}
  // void setB(int xB){B = xB;}
   //void setC(int xC){C = xC;}
   void setA(int point,int s)
   {
       Allocation[point]+=s;
   }
   //void setM(int point,int s)
   //{
   //    Max[point]+=s;
   //}
   void setN(int point,int s)
   {
       Need[point]-=s;
   }
   int  getA(){return A;}
   //int  getB(){return B;}
   //int  getC(){return C;}
   //int  getD(){return D;}
   vector<int> getA(){return Allocation;}
   vector<int> getM(){return Max;}
   vector<int> getN(){return Need;}
   string getName(){return name;}

};


class Banker_Question{
    vector<Process> v;
    vector<string> pri_seq;
    vector<int> available;
public:
    Banker_Question(vector<Process> tv,vector<string> tpri_seq,vector<int> tavailable):v(tv),pri_seq(tpri_seq),available(tavailable){}
    vector<Process>::iterator getIte(vector<Process>& pw,int position)
   {
       vector<Process>::iterator ite = pw.begin();
       for(int i = 0; i < position ; i++)
        ite++;
       return ite;
   }
    bool Banker_Algorithm(vector<int> request,int P_position)
    {
       Process& Ppro = v[P_position];
       vector<int> Ppro_Need = Ppro.getN();
        for(int i = 0;i < 4;i++)
        {
            if(request[i]>available[i]||request[i]>Ppro_Need[i])
                return false;
        }
        //while(v.size()!=0){

        //int flag = false;
        vector<int> available_test = available;
        for(int i = 0;i < 4;i++)
        {
            Ppro.setA(i,request[i]);
            //cout<<Ppro.getN()[i]-request[i]<<" ";
            Ppro.setN(i,request[i]);
            available_test[i]-=request[i];
            //cout<<"ha"<<available_test[i];
            //cout<<available[i]<<" ";
            //cout<<Ppro.getN()[i]<<" ";
            //if(Ppro.getN()[i]==0)
            //available[i]+=Ppro.getA()[i];
            //else
            //available

        }
        //cout<<endl;
        int flag = 0;
        for(int i = 0;i < 4;i++)
        {
            if(Ppro.getN()[i]!=0)
            {
                flag = 1;
                break;
            }
        }
        vector<Process> vtt = v;
        if(flag==0)
        {
            for(int i = 0;i < 4;i++)
            available_test[i]+=Ppro.getA()[i];
            pri_seq.push_back(Ppro.getName());
            vtt.erase(getIte(vtt,P_position));
        }
        //cout<<Ppro.getA().size()<<endl;
        //copy(Ppro.getA().begin(),Ppro.getA().end(),ostream_iterator<int>(cout," "));
        //cout<<endl;
          //vector<Process> vtt = v;
          //pri_seq.push_back(Ppro.getName());
          //vtt.erase(getIte(vtt,P_position));
        if(Banker_Serach(vtt,pri_seq,available_test))
        {
            v = vtt;
            available = available_test;
            return true;
        }
        else
        {
            for(int i = 0;i < 4;i++)
        {
            Ppro.setA(i,-request[i]);
            Ppro.setN(i,-Ppro.getN()[i]+request[i]);
            //available[i]-=request[i];
        }
            return false;
        }
        }
   bool Banker_Serach(vector<Process> vP_test,vector<string> vI_test,vector<int> vA_test)
    {
        //copy(vI_test.begin(),vI_test.end(),ostream_iterator<string>(cout," "));
        //cout<<endl;
        //copy(vA_test.begin(),vA_test.end(),ostream_iterator<int>(cout," "));
        //cout<<"haha"<<endl;
        if(vP_test.size()==0)
        {
            //copy(vI_test.begin(),vI_test.end(),ostream_iterator<string>(cout," "));
           // cout<<endl;
            pri_seq = vI_test;
            //copy(pri_seq.begin(),pri_seq.end(),ostream_iterator<string>(cout," "));
            return true;
        }
        for(int i = 0;i < vP_test.size();i++)
        {
            //cout<<"haha"<<endl;
            Process p_test = vP_test[i];
            int flag = 0;
            for(int j = 0; j < 4 ; j++)
            {
                if(p_test.getN()[j]>vA_test[j])
                {
                    //cout<<i<<" "<<j<<endl;
                    flag = 1;
                     break;
                }
            }
            if(flag==0)
            {
                //cout<<i<<endl;
                vector<Process> v2 = vP_test ;
                vector<string> v3 = vI_test;
                vector<int> v4 = vA_test;
                for(int k = 0; k < 4 ; k++)
            {
                  v4[k]+=v2[i].getA()[k];
            }
            v3.push_back(v2[i].getName());
            v2.erase(getIte(v2,i));
            if(Banker_Serach(v2,v3,v4));
            return true;
            }
        }
        return false;

    }
    vector<string> getNseq()
    {
        return pri_seq;
    }
    void clearSeq()
    {
        pri_seq.clear();
    }
    vector<int> getAva()
    {
        return available;
    }
};
int main()
{
    int n;
    cout<<"有多少个进程"<<endl;
    cin>>n;
    vector<Process> v;
    for(int i = 0;i < n;i++)
    {
        cout<<"请输入第"<<i<<"个进程所需要的资源"<<endl;
        vector<int> tA(4,0);
        cin>>tA[0]>>tA[1]>>tA[2]>>tA[3];
        //Person tp;
        vector<int> tM(4,0);
        cin>>tM[0]>>tM[1]>>tM[2]>>tM[3];
        vector<int> tN(4,0);
        for(int i = 0;i < 4 ;i++)
            tN[i]=tM[i]-tA[i];
        string name;
        cin>>name;
        //cin>>tp.set
        Process tP(tA,tM,tN,name);
        v.push_back(tP);
    }
    vector<int> va;
    cout<<"请输入系统当前可用各种资源数量"<<endl;
    for(int i = 0 ;i < 4 ;i++)
    {
        int x;
        cin>>x;
        va.push_back(x);
    }
    vector<string> v3;
    Banker_Question bq(v,v3,va);
    vector<int> vneed(4,0);
    char q;
    cout<<"进行分配请按Y(包括只检测当前系统的安全性)"<<endl;
    while(cin>>q&&q!='Q')
    {
    int position;
    cout<<"你需要给哪个进程分配资源(若只检测请输入0)"<<endl;
    cin>>position;
    cout<<"请输入请求资源列表(若只检测请全部输入0)"<<endl;

    for(int i = 0 ;i < 4;i++)
    {
        cin>>vneed[i];
    }
    if(bq.Banker_Algorithm(vneed,position))
    {
        cout<<"可以分配"<<endl;
        //cout<<*bq.getNseq().begin()<<endl;
        vector<string> vv = bq.getNseq();
        //copy(vv.begin(),vv.end(),ostream_iterator<string>(cout," "));
        for(int i = 0;i < vv.size();i++)
            cout<<vv[i]<<" ";
             cout<<endl;
           // vector<int> vv1 = bq.getAva();
           // for(int i = 0;i < vv1.size();i++)
           // cout<<vv1[i]<<" ";
        //copy(bq.getNseq().begin(),bq.getNseq().end(),ostream_iterator<string>(cout," "));

    }
    else
    {
       // vector<int> vv1 = bq.getAva();
       // vector<string> vv = bq.getNseq();
        //for(int i = 0;i < vv1.size();i++)
           // cout<<vv1[i]<<" ";
        cout<<"未分配成功"<<endl;
    }
    bq.clearSeq();
    cout<<"如果想继续分配请按Y否则请按Q"<<endl;
    }
    //for(int i = 0)
    return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值