银行家算法(单项资源)

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

    算法在执行过程中要求
        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! );
《银行家算法(单项资源)》}


《银行家算法(单项资源)》
《银行家算法(单项资源)》

    原文作者:银行家问题
    原文地址: https://blog.csdn.net/eion/article/details/1500780
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞