操作系统原理期末复习#3:银行家算法

121 阅读4分钟

操作系统原理期末复习#3:银行家算法

概念回顾

死锁的概念

死锁是指一组进程在执行过程中因争夺资源而造成的一种相互等待的现象。如果没有外力作用,这些进程将无法继续执行下去。死锁是并发系统中一个常见的问题,需要通过各种方法来避免或解决。

死锁产生的必要条件

互斥条件

资源不能共享,某些资源只能被一个进程占有。如果另一个进程请求该资源,必须等待。

请求和保持

进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程阻塞,但对自己已获得的资源保持不放。

不可剥夺条件

已获得的资源在未使用完之前,不能被其他进程强行剥夺,只有在使用完时才由该进程自己释放。

环路条件

在死锁发生时,必然存在一个进程—资源的环形链,即进程集合 P1,P2,,Pn{P_1, P_2, \dots, P_n} 中,P1P_1 等资源被 P2P_2 占用,P2P_2 等资源被 P3P_3 占用,依此类推,PnP_n 等资源被 P1P_1 占用。

术语解释

  • 安全状态 / 安全性
    • 当系统可以通过某种进程执行序列,使每个进程都能最大限度地获得所需资源,并最终完成执行,则称系统处于安全状态。
  • 安全序列:Safe sequence
    • 一个进程序列 P1,P2,,Pn{P_1, P_2, \dots, P_n} 是安全序列,如果对于每个进程 PiP_i,它所需要的资源可以由系统当前可用资源和所有前序进程 PjP_jj<ij < i)释放的资源满足。安全序列不一定唯一
  • 系统资源总数:Total
    • 系统各类资源的总数。
  • 最大资源需求量:MAX
    • 进程安全运行所需的资源。
  • 已分配资源数量:Allocation
    • 当前系统已分配给当前进程的资源数量。
  • 仍然需求资源数:Need
    • Need=MAXAllocationNeed = MAX - Allocation
  • 系统剩余资源数:Avaliable
    • Avaliable=TotalAllocationAvaliable = Total - Allocation

银行家算法

银行家算法是一种用于避免死锁的分配算法。

其基本思想是:在每次资源分配时,通过模拟资源分配后的状态来判断系统是否处于安全状态。只有在资源分配后,系统仍然处于安全状态时,才真正进行资源分配。具体步骤如下:

  1. 检查请求是否合法:进程提出的资源请求数量不应超过其声明的最大需求量。
  2. 检查系统可用资源:系统当前可用资源能否满足进程的请求。
  3. 试探性分配:暂时将资源分配给进程,并更新系统状态。
  4. 安全性检查:通过检查分配后的系统状态,判断是否存在一个安全序列。如果存在,则分配成功;否则,恢复原状,进程必须等待。

通过银行家算法,可以有效避免系统进入不安全状态,从而避免死锁的发生。

案例分析

设系统中有5个进程 P1,P2,P3,P4,P5P_1,P_2,P_3,P_4,P_5 ,有3种类型的资源 A,B,CA,B,C

其中资源 A,B,CA,B,C 的数量分别为 17,5,2017, 5, 20

T0T_0 时刻系统状态如下表所示。

image.png

(1)填写表格,完成“仍然需求资源数”部分。

Need=MAXAllocationNeed = MAX - Allocation

NeedP1=(5,5,9)(2,1,2)=(3,4,7)Need_{P_1} = (5,5,9)-(2,1,2) = (3,4,7), NeedP2=(5,3,6)(4,0,2)=(1,3,4)Need_{P_2} = (5,3,6)-(4,0,2) = (1,3,4), NeedP3=(4,0,11)(4,0,5)=(0,0,6)Need_{P_3} = (4,0,11)-(4,0,5) = (0,0,6), NeedP4=(4,2,5)(2,0,4)=(2,2,1)Need_{P_4} = (4,2,5)-(2,0,4) = (2,2,1), NeedP5=(4,2,4)(3,1,4)=(1,1,0)Need_{P_5} = (4,2,4)-(3,1,4) = (1,1,0)

image.png

(2)T0T_0 时刻系统是否处于安全状态?为什么?

T0T_0 时刻,系统剩余资源数(Avaliable)为:

Avaliable=TotalAllocation=(17,5,20)(2,1,2)(4,0,2)(4,0,5)(2,0,4)(3,1,4)=(2,3,3)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)AvaliableNeed_{P_4}= (2,2,1) \le Avaliable, Need_{P_5} = (1,1,0) \le Avaliable

故第一步可以执行 P4,P5P_4,P_5 进程,此处以执行 P4P_4 为例。

执行完 P4P_4 后, AllocationP4Allocation_{P_4} 释放,

Avaliable=Avaliable+AllocationP4=(2,3,3)+(2,0,4)=(4,3,7)Avaliable = Avaliable + Allocation_{P_4} = (2,3,3)+(2,0,4) = (4,3,7)

此时 NeedP2,NeedP3,NeedP5AvaliableNeed_{P_2},Need_{P_3},Need_{P_5} \le Avaliable ,故可以执行 P2,P3,P5P_2,P_3,P_5 进程。

此处执行 P2P_2 ,则 Avaliable=Avaliable+AllocationP2=(4,3,7)+(4,0,2)=(8,3,9)Avaliable = Avaliable + Allocation_{P_2} = (4,3,7)+(4,0,2) = (8,3,9)

此时 NeedP1,NeedP3,NeedP5AvaliableNeed_{P_1},Need_{P_3},Need_{P_5} \le Avaliable ,故可以执行 P1,P3,P5P_1,P_3,P_5 进程。

此处执行 P1P_1 ,则 Avaliable=Avaliable+AllocationP1=(8,3,9)+(2,1,2)=(10,4,11)Avaliable = Avaliable + Allocation_{P_1} = (8,3,9)+(2,1,2) = (10,4,11)

同理,继续依次执行 P3,P5P_3,P_5 进程(顺序无所谓)。

Avaliable=Avaliable+AllocationP3=(10,4,11)+(4,0,5)=(14,4,16)Avaliable = Avaliable + Allocation_{P_3} = (10,4,11)+(4,0,5) = (14,4,16)

Avaliable=Avaliable+AllocationP5=(14,4,16)+(3,1,4)=(17,5,20)Avaliable = Avaliable + Allocation_{P_5} = (14,4,16)+(3,1,4) = (17,5,20)

综上,系统在 T0T_0 时刻存在一个安全序列为{P4,P2,P1,P3,P5}\{P_4, P_2, P_1, P_3, P_5\},故处于安全状态。

(3)如果 T0T_0 时刻进程 P2P_2 又有新的资源请求 (0,3,4)(0,3,4) ,是否实施资源分配?为什么?

T0T_0 时刻 Avaliable=(2,3,3)(0,3,4)Avaliable = (2,3,3) \le (0,3,4) ,请求资源数大于剩余可用资源数,故不可分配。

(4)如果 T0T_0 时刻,若进程 P4P_4 又有新的资源请求 (2,0,1)(2,0,1) ,是否实施资源分配?为什么?

依照题意,进程 P4P_4 分配新的资源请求 (2,0,1)(2,0,1),则

AllocationP4=(2,0,4)+(2,0,1)=(4,0,5),NeedP4=(4,2,5)(4,0,5)=(0,2,0)Allocation_{P_4}=(2,0,4)+(2,0,1)=(4,0,5), \\ Need_{P_4}=(4,2,5)-(4,0,5)=(0,2,0)

Avaliable=TotalAllocation=(17,5,20)(2,1,2)(4,0,2)(4,0,5)(4,0,5)(3,1,4)=(0,3,2)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)类似,不再赘述。

最终系统在 T0T_0 时刻存在一个安全序列为{P4,P5,P3,P2,P1}\{P_4, P_5, P_3, P_2, P_1\},系统安全,可以实施资源分配。

(5)在(4)的基础上,若进程 P1P_1 又有新的资源请求 (0,2,0)(0,2,0) ,是否实施资源分配?为什么?

依照题意,在(4)基础上进程 P1P_1 分配新的资源请求 (0,2,0)(0,2,0),则

AllocationP1=(2,1,2)+(0,2,0)=(2,3,2),NeedP1=(3,4,7)(0,2,0)=(3,2,7)Allocation_{P_1}=(2,1,2)+(0,2,0)=(2,3,2), \\ Need_{P_1}=(3,4,7)-(0,2,0)=(3,2,7)

Avaliable=TotalAllocation=(17,5,20)(2,3,2)(4,0,2)(4,0,5)(4,0,5)(3,1,4)=(0,1,2)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)Avaliable=(0,1,2) 不满足任何进程需要,系统进入不安全状态,故不能实施资源分配。

参考资料

  • 计算机操作系统:微课视频版/郁红英等编著.——4版.——北京:清华大学出版社,2202.1(2024.1重印)
  • www.bilibili.com/video/BV1kJ…