死锁的概念:
如果系统资源有限而多个进程分配不当则会产生死锁问题。
例题:
例如上述题目中,若只有5个系统资源;
若将5个系统资源先分配给进程A,等A执行完毕空出5个系统资源之后再分配给进程B,B执行完后再分配给C,如此逐个执行则不会发生死锁问题;
若将5个系统资源分配给进程A2个,再分配给进程B2个,剩余1个系统资源分配给C,此时3个进程都缺少系统资源无法运行,且3个进程都因为未运行完毕而无法让出系统资源,此时进程在等待分配系统资源,而5个系统资源都已经分配,没有多余的系统资源可以分配,此时的进程持续等待,这便是死锁。
题目中问,至少需要多少个系统资源才不可能发生死锁。
此时,若有13个系统资源,A4个,B4个,C4个,剩余的一个随便给哪个进程都能使进程运行,或者A5个,B5个,C3个,等AB运行完之后空余出系统资源C一样可以运行,所以最少需要13个系统资源。
公式:
由此可见,求至少有多少个系统资源才不会发生死锁问题的公式为:
进程个数*(单个进程运行所需的系统资源个数-1)+1;
死锁的形成条件:
互斥:
系统资源是互斥的,同一系统资源在同一时间内只允许一个进程使用。
保持和等待:
各个进程会保持自己现在所持有的资源,并且等待更多的资源给自己。
不剥夺:
系统不会把已经分配给其他进程的资源剥夺回来重新分配。
环路等待:
死锁的预防和避免
死锁的预防:
打破上述死锁形成四大条件
死锁的避免:
1.有序的资源分配:
将资源逐个分配给各个进程,运行完毕之后收回再分配,往往资源利用率很低
2.银行家算法:
以银行放贷的思路来做资源分配,放资源之前首先思考是否可以收回来,收不回来便不放。
银行家算法:
分配资源的原则:
一个进程对资源的需求量不大于系统中总资源数时可接纳该进程;
进程可以分期请求资源,但总数仍不能超过最大需求量;
当系统现有资源不足以满足进程尚需资源数时,可对进程的请求推迟分配,但总能使进程在有限时间内得到资源;
例题:
系统状态安全即没有死锁状态发生
答案:B
首先需求得资源 R1、R2、R3 剩余的资源数
R1=9-(1+2+2+1+1)=2
R2=8-(2+1+1+2+1)=1
R3=5-(1+1+3)=0
其次求得各进程执行完毕尚需的资源数
资源 | 最大需求量 | 已分配资源数 | 还需资源数 | ||||||
进程 | R1 | R2 | R3 | R1 | R2 | R3 | R1 | R2 | R3 |
P1 | 6 | 5 | 2 | 1 | 2 | 1 | 5 | 3 | 1 |
P2 | 2 | 2 | 1 | 2 | 1 | 1 | 0 | 1 | 0 |
P3 | 8 | 1 | 1 | 2 | 1 | 0 | 6 | 0 | 1 |
P4 | 1 | 2 | 1 | 1 | 2 | 0 | 0 | 0 | 1 |
P5 | 3 | 4 | 4 | 1 | 1 | 3 | 2 | 3 | 1 |
若进程P1首先运行:则资源R1、R2、R3剩余量不满足该进程尚需资源量,会发生死锁;
若进程P2首先运行:则3类资源剩余量均满足该进程尚需资源量,可以运行;
若进程P3首先运行:则资源R1、R3剩余量不满足该进程尚需资源量,会发生死锁;
若进程P4首先运行:则资源R3无剩余不满足该进程尚需资源量,会发生死锁;
若进程P5首先运行:则资源R2、R3剩余量不满足该进程尚需资源量,会发生死锁;
因此只能进程P2首先运行,R2运行完毕后归还资源,此时资源分配表为:
资源 | 最大需求量 | 已分配资源数 | 还需资源数 | 当前剩余资源数 (原剩余-P2所需+P2归还) |
进程 | R1 R2 R3 | R1 R2 R3 | R1 R2 R3 | R1 R2 R3 |
P1 | 6 5 2 | 1 2 1 | 5 3 1 | 4 2 1 |
P2 | 2 2 1 | 0 0 0 | 0 0 0 | |
P3 | 8 1 1 | 2 1 0 | 6 0 1 | |
P4 | 1 2 1 | 1 2 0 | 0 0 1 | |
P5 | 3 4 4 | 1 1 3 | 2 3 1 |
由上表可知,此时运行进程P4、P5均不会发生死锁,但一优先般运行下标小的进程,所以运行P4进程;
资源 | 最大需求量 | 已分配资源数 | 还需资源数 | 当前剩余资源数 (原剩余-P4所需+P4归还) |
进程 | R1 R2 R3 | R1 R2 R3 | R1 R2 R3 | R1 R2 R3 |
P1 | 6 5 2 | 1 2 1 | 5 3 1 | 5 4 1 |
P2 | 2 2 1 | 0 0 0 | 0 0 0 | |
P3 | 8 1 1 | 2 1 0 | 6 0 1 | |
P4 | 1 2 1 | 0 0 0 | 0 0 0 | |
P5 | 3 4 4 | 1 1 3 | 2 3 1 |
由上表可知,此时运行进程P5不会发生死锁,所以运行P5进程;
资源 | 最大需求量 | 已分配资源数 | 还需资源数 | 当前剩余资源数 (原剩余-P5所需+P5归还) |
进程 | R1 R2 R3 | R1 R2 R3 | R1 R2 R3 | 6 5 4 |
P1 | 6 5 2 | 1 2 1 | 5 3 1 | |
P2 | 2 2 1 | 0 0 0 | 0 0 0 | |
P3 | 8 1 1 | 2 1 0 | 6 0 1 | |
P4 | 1 2 1 | 0 0 0 | 0 0 0 | |
P5 | 3 4 4 | 0 0 0 | 0 0 0 |
此时再运行P1然后运行P3。
此类题目运算步较为零散,极易出错,若有空余时间当走走其他选项是否能走通