银行家算法

银行算法的原理是先假定某一次分配成立,然后检查由于这次分配是否会引起死锁,即剩下的资源是不是能满足任一进程完成的需要。如这次分配是安全的(不会引起死锁),就实施本次分配,再作另一种分配试探,一直探索到各进程均满足各自的资源请求,防止了死锁的发生。

操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。银行算法的原理是先假定某一次分配成立,然后检查由于这次分配是否会引起死锁,即剩下的资源是不是能满足任一进程完成的需要。如这次分配是安全的(不会引起死锁),就实施本次分配,再作另一种分配试探,一直探索到各进程均满足各自的资源请求,防止了死锁的发生。

关键代码:

int n,m,i,j,k;

cout<<"请输入进程数 : ";

cin>>n;

cout<<"请输入资源数 : ";

cin>>m;

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

{

    for(k=0;k<m;k++)

        {

        cout<<"请输入进程p"<<j<<"的"<<k+1<<"项资源: ";

        cin>>Allocation[j][k];

        }

}

 

 

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

    {

     for(k=0;k<m;k++)

     {

     cout<<"请输入进程p"<<j<<"的"<<k+1<<"项资源: ";

     cin>>Need[j][k];

     }

    }

 

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

    {

    cout<<"please input Available["<<j+1<<"]: ";

    cin>>Available[j];

    }

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

        {

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

          {

 

 

 

          Max[i][j]=Allocation[i][j]+Need[i][j];

           }

            }

             print(n,m);

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

             SAvailable[i]=Available[i];

              if(bank(SAvailable,n,m))

              {

               int number;

                while(true)

                 {

                 cout<<"请输入申请资源的进程号:";

                    cin>>number;

                      if(number<0)

                         break;

  cout<<"请输入请求的各资源数::";

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

 {

 

 cin>>Request[j];

 

    Available[j]-=Request[j];

     Need[number][j]-=Request[j];

   Allocation[number][j]+=Request[j];

 }

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

    SAvailable[i]=Available[i];

    cout<<"After the request,the program is:"<<endl;

    bank(SAvailable,n,m);

    if(jd==0)

        {

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

            {

            Available[j]+=Request[j];

            Need[number][j]+=Request[j];

            Allocation[number][j]+=Request[j];

            }

        }

            }

        }

            }

bool bank(int* availabled,int n,int m)

{

int L=0,i;

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

Finished[i]=false;

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

{

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

    if(Finished[j]==false && compare(availabled,Need[j],m))

    {

        for(int k=0;k<m;k++)

        availabled[k] += Allocation[j][k];

        Finished[j]=true;

        SafeOrder[L]=j;

        L++;

        break;

    }

}

 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值