银行家算法(多项资源)

银行家算法(单项资源)  

文中给出了单项资源的银行家算法。本文给出的是多种资源的银行家算法。在本质上,单项资源的银行家算法和多种资源的银行家算法没有什么区别,只是书写起来有一点点不同(用C的语法,如果用C++的语法几乎可以写得一模一样)。有关银行家算法的问题大家可以看银行家算法(单项资源) 内容,在此不在赘述。此处只给出源码供大家参考。

不过里面有一个定义

《银行家算法(多项资源)》
//
 定义RES_VECTOR向量,便于程序的理解

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

typedef 
int
 RES_VECTOR[MAX_RESOURCES];
《银行家算法(多项资源)》

这个问题大家可以看typedef使用大全1(数组)

 

《银行家算法(多项资源)》
#include 

StdAfx.h


《银行家算法(多项资源)》
《银行家算法(多项资源)》#include 


Afx.h


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

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

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

#define
 MAX_RESOURCES 10  
//
 最多资源数目

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

//
 定义RES_VECTOR向量,便于程序的理解

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

typedef 
int
 RES_VECTOR[MAX_RESOURCES];
《银行家算法(多项资源)》
《银行家算法(多项资源)》

//
 该程序完成的是银行家算法的核心算法部分,即:判断当前的状态是否
《银行家算法(多项资源)》

//
 是安全的。根据银行家算法,在一个进程提出资源请求时,系统为了避
《银行家算法(多项资源)》

//
 免死锁要对该行为进行判断。如果该行为导致后续系统状态安全,则系
《银行家算法(多项资源)》

//
 统自动满足该请求;否则,如果该行为导致后续系统状态不安全,显然
《银行家算法(多项资源)》

//
 系统要禁止当前的请求,也就是要阻塞请求资源的进程。而该程序就是
《银行家算法(多项资源)》

//
 能判断一个状态[预分配状态]是否是安全状态,判断安全状态的函数是
《银行家算法(多项资源)》

//
 M_SafeTest,其他的都是辅助函数,所以采用了static来修饰。
《银行家算法(多项资源)》// writed by Houjian Tang
《银行家算法(多项资源)》

//
 判断系统状态是否安全

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

int
 M_SafeTest(
int
 nPn, 
int
 nRn, 
《银行家算法(多项资源)》               

const
 RES_VECTOR 
*
pVA, 
《银行家算法(多项资源)》               

const
 RES_VECTOR 
*
pVM, 
《银行家算法(多项资源)》               RES_VECTOR vT, 
《银行家算法(多项资源)》               

int
 
*
safety_seq);
《银行家算法(多项资源)》

//
 获得一个“能执行完”进程

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

static
 
int
 M_PreExcute(
int
 nPn,
《银行家算法(多项资源)》                       

int
 nRn,
《银行家算法(多项资源)》                       

const
 RES_VECTOR 
*
pVA, 
《银行家算法(多项资源)》                       

const
 RES_VECTOR 
*
pVM, 
《银行家算法(多项资源)》                       

const
 RES_VECTOR vL, 
《银行家算法(多项资源)》                       

const
 
int
 
*
finished);
《银行家算法(多项资源)》

//
 向量比较

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

static
 
int
 LessEqul(
int
 nRn, 
const
 RES_VECTOR Va, 
const
 RES_VECTOR Vb);
《银行家算法(多项资源)》

//
 计算向量之差

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

static
 
void
 GetSub(RES_VECTOR v, 
int
 nRn, 
const
 RES_VECTOR va, 
const
 RES_VECTOR vb);
《银行家算法(多项资源)》

//
 计算向量之和

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

static
 
void
 GetAdd(RES_VECTOR v, 
int
 nRn, 
const
 RES_VECTOR va, 
const
 RES_VECTOR vb);
《银行家算法(多项资源)》
《银行家算法(多项资源)》

//
 算法测试函数

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

void
 Test_BanksAlgorithm_multi();
《银行家算法(多项资源)》
《银行家算法(多项资源)》
《银行家算法(多项资源)》
《银行家算法(多项资源)》
《银行家算法(多项资源)》
《银行家算法(多项资源)》
《银行家算法(多项资源)》

//
 比较两个向量的大小,如果pA<=pB小于等于,返回非0, 否则返回0值

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

static
 
int
 LessEqul(
int
 nRn, 
const
 RES_VECTOR Va, 
const
 RES_VECTOR Vb)
《银行家算法(多项资源)》《银行家算法(多项资源)》


{
《银行家算法(多项资源)》    
int i;
《银行家算法(多项资源)》
《银行家算法(多项资源)》    
for (i=0; i<nRn; i++)
《银行家算法(多项资源)》《银行家算法(多项资源)》    
{
《银行家算法(多项资源)》        
if (Va[i] > Vb[i])
《银行家算法(多项资源)》            
return FALSE;
《银行家算法(多项资源)》    }

《银行家算法(多项资源)》    
return TRUE;
《银行家算法(多项资源)》}


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

//
 计算向量减法,即v=va-vb

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

static
 
void
 GetSub(RES_VECTOR v, 
int
 nRn, 
const
 RES_VECTOR va, 
const
 RES_VECTOR vb)
《银行家算法(多项资源)》《银行家算法(多项资源)》


{
《银行家算法(多项资源)》    
int i;
《银行家算法(多项资源)》
《银行家算法(多项资源)》    
for (i=0; i<nRn; i++)
《银行家算法(多项资源)》        v[i] 
= va[i]  vb[i];
《银行家算法(多项资源)》}


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

//
 计算向量加法,即v=va+vb

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

static
 
void
 GetAdd(RES_VECTOR v, 
int
 nRn, 
const
 RES_VECTOR va, 
const
 RES_VECTOR vb)
《银行家算法(多项资源)》《银行家算法(多项资源)》


{
《银行家算法(多项资源)》    
int i;
《银行家算法(多项资源)》
《银行家算法(多项资源)》    
for (i=0; i<nRn; i++)
《银行家算法(多项资源)》        v[i] 
= va[i] + vb[i];
《银行家算法(多项资源)》}


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

//
 查找一个可执行完进程,并返回进程编号,返回 -1 表示没有进程可以执行
《银行家算法(多项资源)》

//
 nPn —- 进程数目
《银行家算法(多项资源)》

//
 nRn —- 资源数目
《银行家算法(多项资源)》

//
 pVA  —- 进程已申请资源数
《银行家算法(多项资源)》

//
 pVM  —- 进程请求的最大资源数
《银行家算法(多项资源)》

//
 vL  —- 当前剩余的资源数目
《银行家算法(多项资源)》

//
 finished —- “能执行完”标志

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

static
 
int
 M_PreExcute(
int
 nPn, 
《银行家算法(多项资源)》                       

int
 nRn,
《银行家算法(多项资源)》                       

const
 RES_VECTOR 
*
pVA, 
《银行家算法(多项资源)》                       

const
 RES_VECTOR 
*
pVM, 
《银行家算法(多项资源)》                       

const
 RES_VECTOR vL, 
《银行家算法(多项资源)》                       

const
 
int
 
*
finished)
《银行家算法(多项资源)》《银行家算法(多项资源)》


{
《银行家算法(多项资源)》    RES_VECTOR vQ; 
// 还需要的资源数
《银行家算法(多项资源)》
    int i;
《银行家算法(多项资源)》
《银行家算法(多项资源)》    
// 在每一个进程中查找一个可以运行完的进程
《银行家算法(多项资源)》
    for (i=0; i<nPn; i++
《银行家算法(多项资源)》《银行家算法(多项资源)》    
{
《银行家算法(多项资源)》        GetSub(vQ, nRn, pVM[i], pVA[i]);
《银行家算法(多项资源)》
《银行家算法(多项资源)》        
if (!finished[i] && // 第一个条件:进程没有执行完
《银行家算法(多项资源)》
            LessEqul(nRn, vQ, vL)) // 第二个条件:剩余资源可以满足该进程的执行
《银行家算法(多项资源)》
            return i;
《银行家算法(多项资源)》    }

《银行家算法(多项资源)》
《银行家算法(多项资源)》    
return 1;
《银行家算法(多项资源)》}


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

//
 判断当前的状态是否安全,同时给出安全序列
《银行家算法(多项资源)》

//
 返回值:返回当前能够执行完的进程数目。
《银行家算法(多项资源)》

//
 nPn —- 进程数目
《银行家算法(多项资源)》

//
 pA  —- 进程已申请资源数
《银行家算法(多项资源)》

//
 pM  —- 进程请求的最大资源数
《银行家算法(多项资源)》

//
 nT  —- 系统中所有资源数
《银行家算法(多项资源)》

//
 safety_seq —- 进程执行的安全序列

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

int
 M_SafeTest(
int
 nPn, 
int
 nRn, 
《银行家算法(多项资源)》               

const
 RES_VECTOR 
*
pVA, 
《银行家算法(多项资源)》               

const
 RES_VECTOR 
*
pVM, 
《银行家算法(多项资源)》               RES_VECTOR vT, 
《银行家算法(多项资源)》               

int
 
*
safety_seq)
《银行家算法(多项资源)》《银行家算法(多项资源)》


{
《银行家算法(多项资源)》    
int nFN = 0// 已执行完的进程数量
《银行家算法(多项资源)》
    int *finished = new int[nPn]; // 进程能执行完标志
《银行家算法(多项资源)》
    int i;
《银行家算法(多项资源)》
《银行家算法(多项资源)》    
// 系统剩余资源数
《银行家算法(多项资源)》
    RES_VECTOR vL;
《银行家算法(多项资源)》    
for (i=0; i<nRn; i++)
《银行家算法(多项资源)》        vL[i] 
= vT[i];
《银行家算法(多项资源)》
《银行家算法(多项资源)》    
// 初始化“能运行完”标志和系统剩余资源数
《银行家算法(多项资源)》
    for (i=0; i<nPn; i++)
《银行家算法(多项资源)》《银行家算法(多项资源)》    
{
《银行家算法(多项资源)》        finished[i] 
= FALSE; // 初始化进程”能执行完”标志
《银行家算法(多项资源)》
        GetSub(vL, nRn, vL, pVA[i]);     // 初始化系统剩余资源数
《银行家算法(多项资源)》
    }

《银行家算法(多项资源)》
《银行家算法(多项资源)》    
// 主循环,每次找一个进程,找不到则终止退出
《银行家算法(多项资源)》
    while (nFN < nPn)
《银行家算法(多项资源)》《银行家算法(多项资源)》    
{
《银行家算法(多项资源)》        
// 找到一个“可执行完”进程
《银行家算法(多项资源)》
        int nPid = M_PreExcute(nPn, nRn, pVA, pVM, vL, finished);
《银行家算法(多项资源)》
《银行家算法(多项资源)》        
if (nPid >= 0// 查找成功
《银行家算法(多项资源)》《银行家算法(多项资源)》
        {
《银行家算法(多项资源)》            GetAdd(vL, nRn, vL, pVA[nPid]);   
// 修改剩余资源数
《银行家算法(多项资源)》
            safety_seq[nFN++= nPid;  // 添加到安全序列
《银行家算法(多项资源)》
            finished[nPid] = TRUE;     // 修改进程执行完标志
《银行家算法(多项资源)》
        }

《银行家算法(多项资源)》        
else
《银行家算法(多项资源)》《银行家算法(多项资源)》        
{
《银行家算法(多项资源)》            
// 如果查找失败,则直接退出
《银行家算法(多项资源)》
            break;
《银行家算法(多项资源)》        }

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

《银行家算法(多项资源)》
《银行家算法(多项资源)》    delete []finished;
《银行家算法(多项资源)》    
return nFN;
《银行家算法(多项资源)》}


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

//
 算法测试函数

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

void
 Test_BanksAlgorithm_multi()
《银行家算法(多项资源)》《银行家算法(多项资源)》


{
《银行家算法(多项资源)》《银行家算法(多项资源)》    RES_VECTOR T 
= {6342};          // 系统拥有的资源数
《银行家算法(多项资源)》

《银行家算法(多项资源)》
#define PN   5              // 系统中进程数
《银行家算法(多项资源)》
#define RN   4              // 系统中拥有的资源种类数
《银行家算法(多项资源)》    
// 进程已申请资源数
《银行家算法(多项资源)》《银行家算法(多项资源)》
    RES_VECTOR VA[PN] = {
《银行家算法(多项资源)》《银行家算法(多项资源)》        
{3011},
《银行家算法(多项资源)》《银行家算法(多项资源)》        
{0100},
《银行家算法(多项资源)》《银行家算法(多项资源)》        
{1110},
《银行家算法(多项资源)》《银行家算法(多项资源)》        
{1101},
《银行家算法(多项资源)》《银行家算法(多项资源)》        
{0000}
《银行家算法(多项资源)》    }
;  
《银行家算法(多项资源)》
《银行家算法(多项资源)》    
// 进程最大需求资源数
《银行家算法(多项资源)》《银行家算法(多项资源)》
    RES_VECTOR VM[PN] = {
《银行家算法(多项资源)》《银行家算法(多项资源)》        
{4111},
《银行家算法(多项资源)》《银行家算法(多项资源)》        
{0211},
《银行家算法(多项资源)》《银行家算法(多项资源)》        
{4210},
《银行家算法(多项资源)》《银行家算法(多项资源)》        
{1111},
《银行家算法(多项资源)》《银行家算法(多项资源)》        
{2110}
《银行家算法(多项资源)》    }
;  
《银行家算法(多项资源)》
《银行家算法(多项资源)》    
int SQ[PN];             // 安全序列
《银行家算法(多项资源)》

《银行家算法(多项资源)》    
int fn = M_SafeTest(PN, RN, VA, VM, T, SQ);
《银行家算法(多项资源)》    
if (fn == PN)
《银行家算法(多项资源)》《银行家算法(多项资源)》    
{
《银行家算法(多项资源)》        printf(
Status Safety! Safety Sequence: );
《银行家算法(多项资源)》        
for (int i=0; i<fn; i++)
《银行家算法(多项资源)》            printf(
%c  A+SQ[i]);
《银行家算法(多项资源)》        printf(
);
《银行家算法(多项资源)》    }

《银行家算法(多项资源)》    
else
《银行家算法(多项资源)》        printf(
Status Unsafety! );
《银行家算法(多项资源)》}


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

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