死锁的定义
死锁是指多个进程在运行过程中由于争夺资源而造成的一种僵局,若无外力作用,它们都将无法推进下去。此时系统处于一种死锁状态,这些互相等待的进程称之为死锁进程。
注意:通过系统资源分配图可以更精确地描述死锁。
死锁产生的原因
(1)竞争资源。
比如:进程P1持有资源R1,它需要资源R2才能完成运行从而释放资源R1;进程P2持有资源R2,它需要资源R1才能完成运行从而释放资源R2;此时,系统就进入了一种僵局,死锁发生。
(2)进程间推进顺序非法。
系统资源分配图
由进程集合P、资源集合R和边集合E组成。
P_i -> R_j:表示申请边。进程P_i申请了资源R_j。申请边由进程(圆圈表示)指向资源(矩形框表示)。
R_j -> P_i:表示分配变。资源R_j分配给了进程P_i。分配边由资源(矩形框内的一个点,其表示一个资源)指向进程(圆圈表示)。
可以证明:
如果系统资源分配图中没有环,则一定不存在死锁。
如果系统资源分配图中有环,则可能存在死锁。(具体要看每个类型的资源有多少个,若每个类型的资源只有一个则一定存在死锁)
(1)无死锁
P3执行完释放R3;P2得到R3执行完释放R1;P1得到R1执行完释放资源。
(2)有死锁
P3需要得到R2才会执行从而释放R3;P2需要得到R3才会执行从而释放R2,R1;P1需要得到R1才会执行。
P3,P2,P1就这样相互僵持谁也不能执行。
(3)无死锁
P4会执行完释放R2,P3得到R2会执行完释放R1,P1得到R1会执行完释放资源。P2直接执行完释放资源。
死锁的四个必要条件
(1)互斥:至少有一个资源一次只能供一个进程使用,其他进程想使用必须等到其被释放为止。
(2)占有并等待:一个进程占有至少一个资源并得到另一个资源,这另一个资源又被其他等待进程所占有。
(3)不可抢占:进程持有的资源只能被进程自己释放。
(4)循环等待:有一组等待进程 {P0,P1,…,Pn},P0 等待的资源为 P1 占有,P1 等待的资源为 P2 占有,……,Pn-1 等待的资源为 Pn 占
有,Pn 等待的资源为 P0 占有。形成一个等待环。
注意:所有四个条件必须同时成立才会出现死锁。循环等待条件意味着占有并等待条件,这样四个条件并不完全独立。