操作系统原理期末复习#3:银行家算法
概念回顾
死锁的概念
死锁是指一组进程在执行过程中因争夺资源而造成的一种相互等待的现象。如果没有外力作用,这些进程将无法继续执行下去。死锁是并发系统中一个常见的问题,需要通过各种方法来避免或解决。
死锁产生的必要条件
互斥条件
资源不能共享,某些资源只能被一个进程占有。如果另一个进程请求该资源,必须等待。
请求和保持
进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程阻塞,但对自己已获得的资源保持不放。
不可剥夺条件
已获得的资源在未使用完之前,不能被其他进程强行剥夺,只有在使用完时才由该进程自己释放。
环路条件
在死锁发生时,必然存在一个进程—资源的环形链,即进程集合 P1,P2,…,Pn 中,P1 等资源被 P2 占用,P2 等资源被 P3 占用,依此类推,Pn 等资源被 P1 占用。
术语解释
- 安全状态 / 安全性
- 当系统可以通过某种进程执行序列,使每个进程都能最大限度地获得所需资源,并最终完成执行,则称系统处于安全状态。
- 安全序列:Safe sequence
- 一个进程序列 P1,P2,…,Pn 是安全序列,如果对于每个进程 Pi,它所需要的资源可以由系统当前可用资源和所有前序进程 Pj(j<i)释放的资源满足。安全序列不一定唯一。
- 系统资源总数:Total
- 最大资源需求量:MAX
- 已分配资源数量:Allocation
- 仍然需求资源数:Need
- Need=MAX−Allocation
- 系统剩余资源数:Avaliable
- Avaliable=Total−Allocation
银行家算法
银行家算法是一种用于避免死锁的分配算法。
其基本思想是:在每次资源分配时,通过模拟资源分配后的状态来判断系统是否处于安全状态。只有在资源分配后,系统仍然处于安全状态时,才真正进行资源分配。具体步骤如下:
- 检查请求是否合法:进程提出的资源请求数量不应超过其声明的最大需求量。
- 检查系统可用资源:系统当前可用资源能否满足进程的请求。
- 试探性分配:暂时将资源分配给进程,并更新系统状态。
- 安全性检查:通过检查分配后的系统状态,判断是否存在一个安全序列。如果存在,则分配成功;否则,恢复原状,进程必须等待。
通过银行家算法,可以有效避免系统进入不安全状态,从而避免死锁的发生。
案例分析
设系统中有5个进程 P1,P2,P3,P4,P5 ,有3种类型的资源 A,B,C 。
其中资源 A,B,C 的数量分别为 17,5,20 。
T0 时刻系统状态如下表所示。

(1)填写表格,完成“仍然需求资源数”部分。
Need=MAX−Allocation
NeedP1=(5,5,9)−(2,1,2)=(3,4,7),
NeedP2=(5,3,6)−(4,0,2)=(1,3,4),
NeedP3=(4,0,11)−(4,0,5)=(0,0,6),
NeedP4=(4,2,5)−(2,0,4)=(2,2,1),
NeedP5=(4,2,4)−(3,1,4)=(1,1,0)

(2)T0 时刻系统是否处于安全状态?为什么?
T0 时刻,系统剩余资源数(Avaliable)为:
Avaliable=Total−Allocation=(17,5,20)−(2,1,2)−(4,0,2)−(4,0,5)−(2,0,4)−(3,1,4)=(2,3,3);
NeedP4=(2,2,1)≤Avaliable,NeedP5=(1,1,0)≤Avaliable;
故第一步可以执行 P4,P5 进程,此处以执行 P4 为例。
执行完 P4 后, AllocationP4 释放,
即 Avaliable=Avaliable+AllocationP4=(2,3,3)+(2,0,4)=(4,3,7);
此时 NeedP2,NeedP3,NeedP5≤Avaliable ,故可以执行 P2,P3,P5 进程。
此处执行 P2 ,则 Avaliable=Avaliable+AllocationP2=(4,3,7)+(4,0,2)=(8,3,9);
此时 NeedP1,NeedP3,NeedP5≤Avaliable ,故可以执行 P1,P3,P5 进程。
此处执行 P1 ,则 Avaliable=Avaliable+AllocationP1=(8,3,9)+(2,1,2)=(10,4,11);
同理,继续依次执行 P3,P5 进程(顺序无所谓)。
Avaliable=Avaliable+AllocationP3=(10,4,11)+(4,0,5)=(14,4,16);
Avaliable=Avaliable+AllocationP5=(14,4,16)+(3,1,4)=(17,5,20);
综上,系统在 T0 时刻存在一个安全序列为{P4,P2,P1,P3,P5},故处于安全状态。
(3)如果 T0 时刻进程 P2 又有新的资源请求 (0,3,4) ,是否实施资源分配?为什么?
T0 时刻 Avaliable=(2,3,3)≤(0,3,4) ,请求资源数大于剩余可用资源数,故不可分配。
(4)如果 T0 时刻,若进程 P4 又有新的资源请求 (2,0,1) ,是否实施资源分配?为什么?
依照题意,进程 P4 分配新的资源请求 (2,0,1),则
AllocationP4=(2,0,4)+(2,0,1)=(4,0,5),NeedP4=(4,2,5)−(4,0,5)=(0,2,0);
Avaliable=Total−Allocation=(17,5,20)−(2,1,2)−(4,0,2)−(4,0,5)−(4,0,5)−(3,1,4)=(0,3,2);
后续操作与(2)类似,不再赘述。
最终系统在 T0 时刻存在一个安全序列为{P4,P5,P3,P2,P1},系统安全,可以实施资源分配。
(5)在(4)的基础上,若进程 P1 又有新的资源请求 (0,2,0) ,是否实施资源分配?为什么?
依照题意,在(4)基础上进程 P1 分配新的资源请求 (0,2,0),则
AllocationP1=(2,1,2)+(0,2,0)=(2,3,2),NeedP1=(3,4,7)−(0,2,0)=(3,2,7);
Avaliable=Total−Allocation=(17,5,20)−(2,3,2)−(4,0,2)−(4,0,5)−(4,0,5)−(3,1,4)=(0,1,2);
此时 Avaliable=(0,1,2) 不满足任何进程需要,系统进入不安全状态,故不能实施资源分配。
参考资料