死锁:
银行家算法是用于避免死锁的,那么死锁是什么呢?
所谓死锁,是指两个以上的进程互相都要求对方已经占有的资源导致无法继续运行下去的现象。
死锁的四大条件:
1.互斥:即在一段时间内某资源只能被一个进程占用。当一个进程获得了某资源后,其他进程必须等待该进程释放该资源之后才能继续占用。
2.请求和保持:指进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有。
3.不可抢占条件:指进程已经获得了某些资源(包括CPU、内存、设备等),并且在等待其他资源的时候不释放已经占有的资源。
4.环路等待:指系统中若干进程形成一种头尾相接的循环等待资源的关系。例如,进程 A 等待进程 B 占用的资源,进程 B 等待进程 C 占用的资源,而进程 C 又等待进程 A 占用的资源,形成一个环路。
对于死锁采取的策略:
1.死锁的预防:对于死锁的预防就是要打破四大条件,可以通过
有序资源分配法:规定所有进程对资源的请求必须按照一定的顺序进行。这样可以避免环路等待条件的发生,从而预防死锁。
静态资源分配法:在系统运行之前就确定每个进程可能需要的最大资源数目,然后根据这一数目决定资源的分配。
预先分配资源法:在进程启动时,系统要求进程一次性申请其所需的全部资源,如果所需资源无法一次性分配完成,则不分配任何资源。
2.死锁的避免就是银行家算法
3.死锁的检测与解除:人为介入进行死锁的检测与解除
4.鸵鸟策略(不予理睬):这样的策略一般用于死锁发生概率极低的情况。
死锁问题:
系统有5个进程:A,B,C,D,E,这5个进程都需要4个系统资源。如果系统至少有多少个资源,则不可能发生死锁。
若n<4,此时系统不能满足任何一个进程,系统一定死锁。
若n=4,可以使系统完成一个进程,进而释放资源给另外一个进程。,所以当n>=4时,则可能避免死锁。
最极端的情况是每个进程都缺1个资源,即5个进程都有3个资源,即3*5=15个进程,依然发生了死锁。这个情况浪费就很大了,所以在4<=n<=15时,都可能发生死锁。
若n>16时,那么一定不会发生死锁。
对于系统不可能发生死锁的最小资源数:
(w-1)*m+1<=n
m表示进程数
w表示进程需要的资源数
这个公式可以通俗解释为:每一个进程都拿到了(w-1)个资源,在这样的情况下只要再多一个资源数,就不会发生死锁了
例题:
某计算机系统中互斥资源R的可用数为8,系统中有3个进程P1、P2和P3竞争R,且每个进程都需要i个R,该系统可能会发生死锁的最小i值为 (4)
分析:总资源数n=8,进程数m=3,每个进程需要的资源数w=i,列公式:
(i-1)*3+1<=8,得到i<=7/3时,不可能发生死锁,所以可能发生死锁的只有4
银行家算法:
某系统有A、B、C、D四类资源可供五个进程P1、P2、P3、P4、P5共享。系统对这四类资源的拥有量为:A类3个、B类14个、C类12个、D类12个进程对资源的需求和分配情况如下:
(1) 现在系统的各类资源还剩余多少?
根据下表:MAX表示最大需求数,ALL表示已分配的资源,NEED表示还需要的资源(最大需求量-已占有资源)
MAX | ALL | NEED | ||||||||||
A | B | C | D | A | B | C | D | A | B | C | D | |
p1 | 0 | 0 | 1 | 2 | 0 | 0 | 1 | 2 | 0 | 0 | 0 | 0 |
p2 | 1 | 7 | 5 | 0 | 1 | 0 | 0 | 0 | 0 | 7 | 5 | 0 |
p3 | 2 | 3 | 5 | 6 | 1 | 3 | 5 | 4 | 1 | 0 | 0 | 2 |
p4 | 0 | 6 | 5 | 2 | 0 | 6 | 3 | 2 | 0 | 0 | 2 | 0 |
p5 | 0 | 6 | 5 | 6 | 0 | 0 | 1 | 4 | 0 | 6 | 4 | 2 |
系统各类资源的剩余量:系统对各类资源的拥有量 - 各类资源已分配的量
得到Avail=A:1 B:5 C:2 D:0
① work表示剩余资源,从上表中NEED中各类资源选小于1,5,2,0的数,P4,P1都满足,下面选择P1
② 运行完P1后,work+all都释放了,则作为下一个资源的剩余资源,再在各类资源的NEED中找小于(1,5,3,2)的资源,以此类推:
work |
all | need | work+all | T&F | |||||||||||||
A | B | C | D | A | B | C | D | A | B | C | D | A | B | C | D | ||
P1 | 1 | 5 | 2 | 0 | 0 | 0 | 1 | 2 | 0 | 0 | 0 | 0 | 1 | 5 | 3 | 2 | T |
P4 | 1 | 5 | 3 | 2 | 0 | 6 | 3 | 2 | 0 | 0 | 2 | 0 | 1 | 11 | 6 | 4 | T |
P2 | 1 | 11 | 6 | 4 | 1 | 0 | 0 | 0 | 0 | 7 | 5 | 0 | 2 | 11 | 6 | 4 | T |
P3 | 2 | 11 | 6 | 4 | 1 | 3 | 5 | 4 | 1 | 0 | 0 | 2 | 3 | 14 | 11 | 8 | T |
P5 | 3 | 14 | 11 | 8 | 0 | 0 | 1 | 4 | 0 | 6 | 4 | 2 | 3 | 14 | 12 | 12 | T |
(2) 现在系统是否处于安全状态?为什么?
因为可以找到如P1->P4->P2->P3->P5这样的安全序列,所以该系统处于安全状态。
(3) 如果现在进程P2提出需要A类资源0个、B类资源4个、C类资源2个和D类资源0个,系统能否去满足它的请求? 请说明原因。
P2:request(A:0,B:4,C:2,D:0)
①以下条件都满足才能继续下一步:
requestNEED(0,7,5,0)
requestAvail(1,5,2,0)
②
Avail=Avail-request=(1, 5,2,0) - (0,4,2,0) =(1,1,0,0)
NEED=NEED-request=(0,7,5,0) - (0,4,2,0) =(0,3,3,0)
ALL=ALL+request=(1,0,0,0)+(0,4,2,0) = (1,4,2,0)
再将新的数据换到以上表格的P2中,继续以上步骤,如果能得出一个安全序列,则能满足请求,如果不能得到一个安全序列,则表示不能满足请求。
进程资源图:
对于下图,先分析资源分配情况,列出剩余可用资源: 此时已分配1个R1给进程P,剩余1个R1可用。再判断申请后进程是否能够执行: P进程申请1个R1,系统有1个R1可用,P进程可成功执行,执行后释放占用的2个R1。
注:对于进程资源图,如果有进程成功执行,并且释放资源,那么这个进程资源图就可以进一步化简,称为可化简的进程资源图,有资源能支持节点完成进程的称为非阻塞节点,否则称为阻塞节点,若化简后还有进程没有完成执行那么就称为死锁
例题:
分析:
资源:对于R1,两个资源都已分配,没有资源了,对于R2,R2分配了两个资源还剩余一个资源,
进程:对于P1,P1节点需要一个R2,而系统刚好有一个R2,所以P1是非阻塞节点。
对于P2,P2节点需要一个R1,没有系统没有R1资源,所以P2是阻塞节点
对于P3,P3节点还需要一个R2资源,刚好R2有一个资源,所以P3是非阻塞节点。
在P1和P3中任选一个节点执行,若P1执行完成,释放一个R1,资源可以给P2,P2进程执行完毕后会释放一个R2资源,此时有2个R2,但是P3的执行只需要一个R2资源,所以此时我们可以说
这个图可化简,是非死锁的。