C++--问题17--银行家算法--动态避免死锁
题目:在一个真实的计算机系统中,资源会损坏或被替换,新的进程会进入和离开系统,新的资源会被购买和添加到系统中。如果用银行家算法控制死锁,下面哪些变化是安全的(不会导致可能的死锁)?(A D)
A.增加可用资源(新的资源被添加到系统)
B.减少可用资源(资源被从系统中永久性地移出)
C.增加一个进程的Max(进程需要更多的资源,超过所允许给予的资源)
D.减少一个进程的Max(进程不再需要那么多资源)
解析:导致死锁的原因为系统可以使用的资源不满足进程所需资源。所以可以增加可用资源或者减少进程所需资源。
死锁主要有三种避免方法:
(1) 预防死锁发生:通过对死锁产生的四个必要条件进行限制;
(2) 检测与解除死锁:这种方式使允许死锁发生,检测死锁产生,然后解除死锁;检测的具体实施可以维护两个资源矩阵,对可用资源和需要资源进行比较;解除死锁的方式主要可以实施抢占剥夺;kill掉进程;回滚系统等;
(3)动态避免:在资源分配过程中,确保资源请求批准后系统不会进入死锁或潜在的死锁状态。如银行家算法。
银行家算法是仿照银行发放贷款时采用的控制方式而设计的一种死锁避免算法,该算法的策略是实现动态避免死锁。
银行家算法的基本思想是:分配资源之前,判断系统是否安全,如果安全才会进行资源分配。
我们把操作系统看做是银行家,操作系统管理的资源相当于银行家的资金,线程向操作系统请求分配资源就是用户向银行家要贷款。
学习这位作者:wenmingxing
链接:https://www.jianshu.com/p/355f138ea3c8
银行家算法实例
系统中有R1,R2,R3三种资源,在time0时刻,5个线程T0,T1,T2,T3,T4对资源占用和需求的情况如下表,此时系统的可用资源向量为(3,3,2)。求T0时刻系统是否存在安全序列?
thread | sum_need | allocated | needing | available |
T0 | (7,5,3) | (0,1,0) | (7,4,3) | (3,3,2) |
T1 | (3,2,2) | (2,0,0) | (1,2,2) | |
T2 | (9,0,2) | (3,0,2) | (6,0,0) | |
T3 | (2,2,2) | (2,1,1) | (0,1,1) | |
T4 | (4,3,3) | (0,0,2) | (4,3,1) |
1、在time0时刻,available(3,3,2) > T1.needing(1,2,2); 所以T1可以执行,T1执行完毕之后available = T1.allocated(2,0,0) + available(3,3,2) = (5,3,2)
thread | sum_need | allocated | needing | available |
T0 | (7,5,3) | (0,1,0) | (7,4,3) | (5,3,2) |
T2 | (9,0,2) | (3,0,2) | (6,0,0) | |
T3 | (2,2,2) | (2,1,1) | (0,1,1) | |
T4 | (4,3,3) | (0,0,2) | (4,3,1) |
2、进入time1时刻,available(5,3,2) < T2.needing(6,0,0),不满足T2,有因为available(5,3,2) > T3.needing(0,1,1);所以T3可以执行,T3执行完毕之后available = T3.allocated(2,1,1)+available(5,3,2) = (7,4,3)
thread | sum_need | allocated | needing | available |
T0 | (7,5,3) | (0,1,0) | (7,4,3) | (7,4,3) |
T2 | (9,0,2) | (3,0,2) | (6,0,0) | |
T4 | (4,3,3) | (0,0,2) | (4,3,1) |
3、进入time2时刻,available(7,4,3) > T4.needing(4,3,1);所以T4可以执行,T4执行完毕之后available = T4.allocated(0,0,2) + available(7,4,3) = (7,4,5)
thread | sum_need | allocated | needing | available |
T0 | (7,5,3) | (0,1,0) | (7,4,3) | (7,4,5) |
T2 | (9,0,2) | (3,0,2) | (6,0,0) |
4、进入time3时刻,available(7,4,5) > T2.needing(6,0,0);所以T2可以执行,T2指向完毕之后available = T2.allocated(3,0,2) + available(7,4,5) = (10,4,7);
thread | sum_need | allocated | needing | available |
T0 | (7,5,3) | (0,1,0) | (7,4,3) | (10,4,7) |
5、进入time4时刻,因为available(10,4,7) > T0.needing(7,4,3);所以执行T0。完成安全序列。
上面只是安全序列的一个例子,可能还存在其他安全序列。