基本概念:
死锁:进程间因循环等待资源出现的永久性阻塞现象
可抢占性资源:可以从拥有它的进程中剥夺而不会产生任何不良影响的资源(竞争可抢占性资源不会引起死锁问题)
不可抢占性资源:拥有它的进程在主动释放前,不能被其他进程或系统强行剥夺,否则会引起相关计算失效的资源
资源分配图:刻画进程请求和占有资源的一个有效工具。(圆圈:进程节点;方框:资源节点;方框中的圆点:资源实例;圆圈到方框的边:资源请求边)
产生死锁的原因:
- 竞争资源(系统提供的资源数目<并发进程所要求的该类资源数)
- 进程推进顺序不当(请求和释放资源的顺序不当)
产生死锁的必要条件:
- 互斥条件:资源在一段时间内只能由一个进程占有
- 请求且保持条件/占有且等待条件:进程在占有一个资源时,提出新的资源请求,但被阻塞,因此它“吃着碗里的,看着锅里的”
- 不可抢占条件
- 循环等待条件:存在一个封闭的进程-资源链
处理死锁的方法:
- 预防死锁:简单、直观、事先预防,通过设置某些限制条件,破坏产生的必要条件来预防
- 避免死锁:事先预防,在资源的动态分配过程中,用某种方法防止系统进入不安全状态
- 检测和解除死锁:设法发现并解除
- 忽略死锁:当处理死锁的代价高昂且发生死锁的概率极低时
预防死锁:
破坏条件2: 要求进程一次性申请到运行所需的全部资源才开始执行(效率不高且影响了系统的并发度)
破坏条件3: 规定一个已经占有了某些资源的进程,再申请资源而得不到满足时,必须释放它已获得的所有资源(复杂、代价大、增加系统开销、降低系统吞吐量)
破坏条件4: 将系统中的资源按类型编号,所有进程必须按照资源序号递增的顺序申请资源,低序号:常用的、普通的;高序号:数量少、贵重资源(不利于新设备类型的增加)
避免死锁:
死锁避免是一种动态机制,它并不限制进程对资源的申请命令,而是把系统的状态分为安全状态(系统能按某种进程推进顺行,为每个进程分配所需资源,直至满足每个进程对资源的最大需求,使每个进程都顺利完成)和不安全状态,对进程所发出的每个资源清求都实行动志检查, 确保系统的终都受正安全状态,避免发生死锁。
不安全状态未必产生死锁
银行家算法
- resource:系统中每类资源的总数目
- available:系统中每类资源的可用数目
- max:每个进程对每类资源的最大需求数目
- allocation:已分配给每个进程的资源数目
- need:每个进程尚需的各类资源数目
- work:系统可提供给进程继续运行所需的各类资源数目,初值与available相同
- finish:系统是否有足够资源分配给进程(bool类型)
例1: 假设系统中有四个进程{P1, P2,P3,P4}和三类资源{A,B,C},三类资源的数量分别为9、3、6。若To时刻资源分配情况如下表所示,试回答:
(1)该系统是否处于安全状态?
(2)若进程P1提出请求Request1[2,2, 1],系统能否将资源分配给它?
(3)若进程P2提出请求Request2[1, 0, 1], 系统能否将资源分配给它?
(4)若进程P3提出请求Request3[1, 0, 1], 系统能够将资源分配给它?T0时刻资源分配情况:
T0时刻系统的状态:
need = max - allocation
available = 总资源数-各进程的allocation之和
eg: P1所需的A资源数 = 3-1 = 2
A资源的可用数目 = 9(题目中给的)- (1+2+5)= 1
(1) T0时刻的安全序列:
所以,T0时刻是安全的,存在安全序列{P3,P1,P2,P4}
work 初值 = available (查上一张表)
每当进程完成,释放已分配的资源,work数便增加
(2)进程P1发出资源请求Request[2. 2, 1]后,系统按银行家算法进行检查:
①Request1[2,2, 1]≤Need1[2, 2, 2]:
②Request1[2,2, 1]> Available[1, 1, 2],即系统没有足够的可用资源供其使用。因此,进程P1的资源请求无法满足,故进程P1产生阻塞。(3)进程P2发出资源请求Request2[1, 0, 1]后,系统按银行家算法进行检查:
①Request2[1, 0, 1]≤Need2[1, 0, 3];
②Request2[1, 0, 1]≤Available[1, 1, 2];
③系统假设满足进程P2的请求,为其分配所需资源,修改后的状态数据如下表所示:④在进行安全性算法检查时发现,可用资源Available[0,1, 1]已不能满足任何进程的需要,故系统进入不安全状态。因此,进程P2的资源请求无法满足,故进程P2产生阻塞。
(4)进程P3发出资源请求Request3[1, 0, 1]后,系统按银行家算法进行检查:
①Request3[1, 0, 1]≤Need3[1, 0, 2];
②Request3[1, 0, 1]<Available[I, 1, 2];
③系统假设满足进程P3的请求,为其分配所需资源,修改的数据结构可表示为:
Available = [1, 1,2] - [1,0, 1] = [0,1, 1]
Need3 = [1, 0, 2] - [1,0, 1] = [0,0, 1]
Allocation3 = [5, 1,1] + [1,0, 1] = [6, 1,2]
④利用安全性算法检查系统是否处于安全状态,如下表所示:
由安全性算法检查结果得知,可以找到一个安全序列{ P3, PI, P2, P4}。因此,系统处于安全状态。所以,可以将进程P3所请求的资源分配给它。
习题
例1: 设系统中有5个进程P1、P2、P3、 P4和P5,有3种类型的资源A、B和C,其中资源A的数量是17,资源B的数量是5,资源C的数量是20。T0时刻,系统状态如下表所示。
(1) T0时刻系统是否处于安全状态,为什么?
(2) T0时刻,进程P2提出资源请求[0,3,4],是否实施资源分配,为什么?
(3) T0时刻,进程P4提出资源请求[2, 0, 1], 是否实施资源分配,为什么?
参考:《计算机操作系统》电子工业出版社