银行家算法(单项资源)

银行家算法是操作系统课程里面为数不多的几个算法之一,理解银行家算法对理解进程的死锁有很大的帮助。而银行家算法本身并没有太复杂的计算,只是在理解上有一个问题稍微难一点。

    算法在执行过程中要求
        1:每次在“未执行完”进程中找到一个可以满足要求的进程来执行
        2:如果当前状态下所有进程都能够执行完,才表示该状态是安全的。

    上面的第二点比较容易被忽视。下面是算法源码,源码中注释比较多,在这里就不啰嗦了。

#include  " StdAfx.h "

#include 
" Afx.h "

#define  MAX_PROCESSES 10   //  最大进程数目

//  查找一个可执行完进程,并返回进程编号,返回 -1 表示没有进程可以执行
//  nPn ---- 进程数目
//  pA  ---- 进程已申请资源数
//  pM  ---- 进程请求的最大资源数
//  nL  ---- 当前剩余的资源数目
//  finished ---- 已经执行完成的进程
static   int  S_PreExcute( int  nPn,  const   int   * pA,  const   int   * pM,  int  nL,  const   int   * finished)
{
    
for (int i=0; i<nPn; i++
    
{
        
if (!finished[i] && // 第一个条件:进程没有执行完
            (pM[i]-pA[i]) <= nL) // 第二个条件:剩余资源可以满足该进程的执行
            return i;
    }

    
return -1;
}


//  判断当前的状态是否安全,同时给出安全序列
//  返回值:返回当前能够执行完的进程数目。
//  nPn ---- 进程数目
//  pA  ---- 进程已申请资源数
//  pM  ---- 进程请求的最大资源数
//  nT  ---- 系统中所有资源数
//  safety_seq ---- 进程执行的安全序列
int  S_SafeTest( int  nPn,  const   int   * pA,  const   int   * pM,  int  nT,  int   * safety_seq)
{
    
int nFN = 0// 已执行完的进程数量
    int *finished = new int[nPn]; // 进程能执行完标志

    
int nL = nT; // 系统剩余资源数

    
for (int i=0; i<nPn; i++)
    
{
        finished[i] 
= FALSE; // 初始化进程"能执行完"标志
        nL -= pA[i];     // 初始化系统剩余资源数
    }



    
while (nFN < nPn)
    
{
        
// 找到一个可执行完进程
        int nPid = S_PreExcute(nPn, pA, pM, nL, finished);
        
if (nPid < 0// 查找失败
            break;
        
else // 查找成果
        {
            nL 
+= pA[nPid];            // 修改剩余资源数
            safety_seq[nFN++= nPid;  // 添加到安全序列
            finished[nPid] = TRUE;     // 修改进程执行完标志
        }

    }


    delete []finished;
    
return nFN;
}



void  Test_BanksAlgorithm_single()
{
    
int T = 10;             // 系统拥有的资源数
#define PN   3              // 系统中进程数
    
int A[PN] = {233};  // 进程已申请资源数
    int M[PN] = {486};  // 进程最大需求资源数
    int SQ[PN];             // 安全序列

    
int fn = S_SafeTest(PN, A, M, T, SQ);
    
if (fn == PN)
    
{
        printf(
"Status Safety! Safety Sequence: ");
        
for (int i=0; i<fn; i++)
            printf(
"%d  ", SQ[i]);
        printf(
" ");
    }

    
else
        printf(
"Status Unsafety! ");
}


  • 0
    点赞
  • 9
    收藏
  • 打赏
    打赏
  • 1
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

eion

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值