P4可执行完成。
finish[4]=true;
work=work+allocation[4]=(9,3,4)+(0,0,2)=(9,3,6)
结论:
系统至少可以找到一个安全的执行序,如(P2,P1,P3,P4)可使各进程正常运行终结。
(3)系统不能将资源分配给进程P1,因为虽然可利用资源还可以满足进程P1现在的需求,但是一旦分配给进程P1后,就找不到一个安全执行的序列保证各进程能够正常运行终结。
所以进程P1应该进入阻塞状态。
(4)系统满足进程P1和P2的请求后,没有立即进入死锁状态,因为这时所有进程没有提出新的资源申请,全部进程均没有因资源没有得到满足而进入阻塞状态。
只有当进程提出资源申请且全部进程都进入阻塞状态时,系统才处于死锁状态。
但最终会进入死锁状态。
例2:
某系统有同类资源m个,n个并发进程可共享该类临界资源。
求:
每个进程最多可申请多少个该类临界资源,保证系统一定不会发生死锁。
解:
设每个进程最多申请该类资源的最大量为x。
每个进程最多申请x个资源,则n个进程最多同时申请的该类临界资源数为:
n*x。
为保证系统不会发生死锁,应满足下列不等式:
n(x-1)+1≤m(*)
则系统一定不会发生死锁。
这是因为进程最多申请x个资源,最坏的情况是每个进程都已得到了(x-1)个资源,现均申请要最后一个资源。
只要系统至少还有一个资源就可使其中一个或几个进程得到所需的全部资源,在它们执行结束后归还的资源可供其他进程使用,因而不可以发生死锁。
解不等式(*),可得:
x≤1+[(m-1)/n]
即:
x的最大值为1+[(m-1)/n]。
因而,当每个进程申请资源的最大数值为1+[(m-1)/n]时,系统肯定不会发生死锁。
例3:
设系统中有3中类型的资源(A,B,C)和5个进程P1、P2、P3、P4、P5,A类资源的数目为17,B类资源的数目为5,C类资源的数目为20。
在T0时刻系统状态如下表所示。
系统采用银行家算法实施死锁避免策略。
资源情况
进程
Max
ABC
Allocation
ABC
Available
ABC
P1
559
212
233
P2
536
402
P3
4011
405
P4
425
204
P5
424
314
(1)T0时刻是否为安全状态?
若是,给出安全序列。
(2)若在T0时刻进程P2请求资源(0,3,4),是否能实施资源分配?
为什么?
(3)在
(2)的基础上,若进程P4请求资源(2,0,1),是否能实施资源分配?
为什么?
(1)由题目所给出的最大资源需求量和已分配的资源数量,可以计算出T0时刻各进程的资源需求量Need,Need=Max-Allocation,利用银行家算法对T0时刻的资源分配情况进行分析,可得此时的安全性分析情况,如下表:
进程
资源情况
Work
ABC
Need
ABC
Allocation
ABC
Work+Allocation
ABC
Finish
P5
233
110
314
547
true
P4
547
221
204
7411
true
P3
7411
006
405
11416
true
P2
11416
134
402
15418
true
P1
15418
347
212
17520
true
从T0的安全性分析中可以看出,存在一个安全序列{P5、P4、P3、P2、P1},故T0时刻的状态是安全的。
(6分)
(2)若在T0时刻进程P2请求资源(0,3,4),因请求资源数(0,3,4)大于剩余资源数(2,3,3),所以不能分配。
(2分)
(3)在
(2)的基础上,若进程P4请求资源(2,0,1),按银行家算法进行检查:
P4请求资源(2,0,1)<=P4需求资源(2,2,1)
P4请求资源(2,0,1)<=剩余资源数(2,3,3)
试分配并修改相应的数据结构,由此形成的资源分配情况如下表所示:
资源情况
进程
Allocation
ABC
Need
ABC
Available
ABC
P1
212
347
033
P2
402
134
P3
405
006
P4
405
020
P5
314
110
此时,如题
(1)利用银行家算法检查系统的安全状态,存在一个安全序列{P4、P5、P3、P2、P1},故该状态是安全的,可以立即将P4请求的资源分配给它。
例4:
某系统有同类资源m个,n个并发进程可共享该类临界资源。
求:
每个进程最多可申请多少个该类临界资源,保证系统一定不会发生死锁。
解:
设每个进程最多申请该类资源的最大量为x。
为保证系统不会发生死锁,应满足下列不等式:
n(x-1)+1≤m(*)
解不等式(*),可得:
x≤1+[(m-1)/n]
即:
x的最大值为1+[(m-1)/n]。
因而,当每个进程申请资源的最大数值为1+[(m-1)/n]时,系统肯定不会发生死锁。
某系统中有5个并发进程,都需要同类资源3个,试问该系统不会发生死锁的最少资源数是(11)。
某系统中有4个并发进程,都需要同类资源3个,试问该系统不会发生死锁的最少资源数是(9)。
某计算机系统中有8台打印机,有K个进程竞争使用,每个进程最多需要3台打印机.该系统可能会发生死锁的K的最小值是(4)
系统中有3个进程,每个进程需2台打印机,如果系统配有4台打印机,则系统______不可能________出现死锁的情况(本题要判断出现死锁的可能性:
可能或不可能)。
若系统运行中出现如下表所示的资源分配情况,该系统是否安全?
若是,给出安全序列;如果进程P2此时提出资源申请(1,2,2,2),系统能否将资源分配给它?
为什么?
资源情况
进程
Allocation
(已分配资源数)
Need
(还需要资源数)
Available
(系统可以分配资源数)
P0
0032
0012
1622
P1
1000
1750
P2
1354
2356
P3
0332
0652
P4
0014
0656
答:
(1)利用安全性算法对此刻的资源分配情况进行如下表的安全性检:
资源情况
进程
Work
Need
Allocation
Work+Allocation
P0
1622
0012
0032
1654
P3
1654
0652
0332
1986
P4
1986
0656
0014
19910
P1
19910
1750
1000
29910
P2
29910
2356
1354
3121414
从表中可以看出,此时存在一个安全序列{P0,P3,P4,P1,P2},故系统是安全的。
(2)P2请求资源(1,2,2,2)<=P2需求资源(2,3,5,6)&<=剩余资源数(1,6,2,2)
资源情况
进程
Allocation
Need
Available
P0
0032
0012
0400
P1
1000
1750
P2
2576
1134
P3
0332
0652
P4
0014
0656
此时,可利用资源(0,4,0,0)已不能满足任何进程的需要,故系统进入不安全状态,故不能将资源分配给P2。
资源分配图。
系统死锁可以利用资源分配图来描述。
该图是由一组方框、圆圈和一组箭头线组成的,
(1)资源分配图。
资源分配图采用图素的含义分别是:
方框:
表示资源。
有几类资源就画几个方框,方框中的小圆圈表示该类资源的个数。
当个数较大时可以在方框内用阿拉伯数字表示。
圆圈:
表示进程。
有几个进程就画几个圆圈,圆圈内标明进程名称。
箭头线:
表示资源的分配与申请。
由方框指向圆圈的箭头线表示资源的分配线,由圆圈指向方框的箭头线表示资源的请求线。
(2)死锁定理。
在死锁检测时,可以利用把资源分配图进行简化的方法来判断系统当前是否处于死锁状态。
具体方法如下:
①在资源分配图中,找出一个既非阻塞又非孤立的进程结点Pi。
如果Pi可以获得其所需要的资源而继续执行,直至运行完毕,就可以释放其所占用的全部资源。
这样,就可以把Pi所有关连的资源分配线和资源请求线消去,使之成为孤立的点。
②重复进行上述操作。
在一系列的简化后,如果消去了资源分配图中所有的箭头线,使所有进程结点都成为孤立结点,则称该资源分配图是可完全简化的;反之,则称该资源分配图是不可完全简化的。
如果当前系统状态对应的资源分配图是不可完全简化的,则系统处于死锁状态,该充分条件称为死锁定理。
什么是死锁定理?
利用死锁定理判断下图的当前状态是否会产生死锁?
死锁定理:
S为死锁状态的充分条件是,当且仅当S状态的资源分配图不可完全简化。
简化过程,结论:
不会产生死锁。
死锁的检测
1.利用资源分配图
系统对资源的分配情况可以用有向图加以描述:
该图由结对组成:
G=(V,E)。
其中,V是顶点的集合,E是有向边的集合,顶点集合可分为两部分:
P={P1,P2,…Pn},它由系统中全部进程组成;R={r1,r2,r3},它由系统中的全部资源组成。
由边组成的集合E中,每一个元素都是一个有序结对(pi,rj)或(rj,pi)。
其中,pi是P中的一个进程(pi∈P),rj是R中的资源类型(rj∈R)。
如果(pi,rj)∈E,则存在一条从进程pi指向资源rj的有向边,进程pi申请一个rj资源单位。
当前pi在等待资源。
如果(pi,rj)∈E,则有向边是从资源rj指向进程pi,就表示有一个rj资源分配给进程pi。
边(pi,rj)称为申请边,而(rj,pi)称为赋给边。
在资源分配图中,我们用圆圈表示每个进程,用方框表示各种资源的类型。
方框中圆点的数量表示该类资源的个数。
当然,申请边只能指向方框,而赋给边必须指向方框中的一个圆点。
例如
如图所示的资源分配图表示:
P1申请临界资源R,同时R已被进程P2占有。
临界资源R类中只有一个资源。
2.资源分配图的简化
在利用资源分配图进行死锁检测时,目的是为了决定当前状态是否发生死锁。
如果满足下列条件,那么一个连续可重被利用的资源图就能够通过进程P来进行化简:
(1)进程没有被阻塞
(2)进程没有请求边
(3)有分配边指向P
通过消除所有指向P的分配边,可以化简资源分配图。
如果一个资源分配图不能通过任一个进程化简,那么它就是不可被简化的;如果有一个化简序列,导致图中没有任何种类的边,那么它就是可完全简化的。
3.死锁定理
通过资源分配图,我们就可以很直观地看出系统中的进程使用资源的情况。
很显然,如果图中不出现封闭的环路,则系统中不会存在死锁。
但如果系统出现由各有向边组成的环路,则是否产生死锁,还需进一步分析:
如果环路可以通过化简的方式取消,则系统一定不产生死锁;如果环路通过化简的方式仍不能取消,即不能再进行简化,则系统一定会产生死锁。
这就是著名的死锁定理。
某系统状态S为死锁状态的充分必要条件是:
当且仅当S状态的资源分配图是不可完全简化的。
即:
如果资源分配图中不存在环路,则系统不存在死锁;如果资源分配图中存在环路,则系统中可能产生死锁,如果不可再简化,则系统产生死锁。