银行家算法解析

应用条件:

1、 在固定数量的进程中共享数量固定的资源

2、 每个进程预先指定完成工作所需的最大资源数量

3、 进程不能申请比系统中可用资源总数还多的资源

4、 进程等待资源的时间是有限的

5、 如果系统满足了进程对资源的最大需求,那么,进程应该再有限的时间内使用资源,然后归还给系统

 

假设系统中:

N:系统中进程数量

M:资源类数量

数据结构用以描述系统状态:

Available:ARRAY[1……M]of integer; //系统中的可以分配的资源数量

Max: ARRAY[1…N,1…M] of integer; //进程对资源的最大需求

Allocation: ARRAY[1…N,1…M] of integer; //当前系统中分配给进程的资源数

Need: ARRAY[1…N,1…M] of integer; //进程还需要多少资源

Request: ARRAY[1…N,1…M] of integer; //本次进程对资源申请数量

符号:

Available

Max[i]

Allocation[i]

Need[i]

Request[i]

 

当进程pi提出资源申请时,系统执行下列步骤:

(1)若Request[i]<= Need[i], 转(2);
     否则,报错返回;

(2)若Request[i]<= Available,转(3);

     否则,进程等待;

(3)假设系统分配了资源,则有:

     Available = Available[i] – Request[i];

    Allocation[i] = Allocation[i] + Request[i];

    Need[i] = Need[i] – Request[i];

(以上表示系统的新状态)

若系统新状态是安全的,则分配完成

若系统新状态是不安全的,则回复原来状态,进程等待

 

如何判断系统是否处于安全状态?

为进行安全性检查,定义数据结构:

Work: ARRAY[1…M]of integer;

Finish:ARRAY[1…N] of Boolean;

安全性检查的步骤:

(1)     Work = Available; //存放当前可用资源数量

Finish = false; //初始化为false

(2)     寻找满足条件的i:

a.     Finish[i]==false; //这个进程还没有被检查过

b.     Need[i]<=Work; //检查这个进程还需要的资源是否可以满足

如果不存在,则转(4)

(3)   Work = Work +Allocation[i];

 //假设这个进程战友的资源都还给系统,得到新可用资源的数量

     Finish[i] = true; //把进程标记成true,然后继续找下一个未检查过进程

     转(2)

(4) 若对所有i,Finish[i]==true,             

     则系统处于安全状态,否则系统处于不安全状态

//跳出循环结束

 

例子

 

目前占有量

最大需求量

尚需要量

P1

1

4

3

P2

4

6

2

P3

5

8

3

系统剩余量

 

2

 

//此时系统只能分配资源给P2,

那么安全序列是P2,P1或P2,P3

 

伪代码(pseudo-code)

P – 进程的集合

Mp – 进程p的最大的请求数目

Cp – 进程p当前被分配的资源

A – 当前可用的资源

while (P != ) {

    found = FALSE;

    foreach (p P) {

        if (Mp − Cp≤ A) {

             /* p可以獲得他所需的資源。假設他得到資源後執行;執行終止,並釋放所擁有的資源。*/

             A = A+ Cp ;

             P = P− {p};

             found= TRUE;

        }

    }

    if (! found)return FAIL;

}

return OK;

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