1.死锁的定义:
在多道程序系统中, 由于多个进程的并发执行,改善了系统资源的利用率并提高了系统的处理能力。然而,多个进程的并发执行也带来了新的问题------死锁。
所谓死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
2.死锁产生的原因:
(1)、系统资源的竞争
通常系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得进程在运行过程中,会因竞争资源而陷入僵局,如磁带机、打印机等。只有
对不可剥夺的竞争才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。
(2)、进程推进顺序非法
进程在运行过程中,请求和释放资源的顺序不当,也同样会导致死锁。例如,并发进程P1 、 P2分别保持了 资源 R1 、R2 ,而进程P1申请资源R2 ,进程
P2申请资源R1时,两者都会因为所需要资源被占用而阻塞。
信号量使用不当也会造成死锁。进程间彼此相互等待对方发送来的消息,结果也会使得这些进程间无法继续向前推进。例如,进程A 等待进程B 发的消息,
进程B 又等待进程 A发的消息,可以看出进程 A 和 B不是因竞争同一资源,而是在等待对方的资源导致死锁。
3.死锁产生的必要条件: (产生死锁必须同时满足一下四个条件,只要其中任何一个不成立,死锁就不会发生)
(1)、互斥条件:
进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个进程所占用。此时若有其他进程请求该资源,则请求进程
只能等待。
(2)、不可剥夺条件:
进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能获得该资源的进程自己来释放(只能是主动释放)。
(3)、请求和保持条件:
进程已经保持了至少一个资源,但又提出了新的请求资源,而该资源已被其他进程占用,此时请求进程被阻塞,但对自己已获得的资源保持不放。
(4)、循环等待条件:
存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被链中的下一个进程请求。即存在一个处于等待状态的进程集合{P1,P2,...,Pn},
其中Pi 等待的资源被 P(i+1) 占用(i = 0,1,...,n-1) ,Pn 等待的资源被 P0 占用,如下图所示,
直观上看,循环等待条件似乎和死锁定义一样,其实不然。按死锁定义构成等待环所要求的条件更严,它要求Pi 等待的资源必须由 P(i+1)来满足,
而循环等待条件则无此限制。例如,系统中有两台输出设备,P0占有一台,PK 占有另一台,且 K 不属于集合 {0,1,2,...,n}。Pn 等一个输出设备,它可以
从P0 获得,也可能从 PK 获得。因此,虽然 Pn 、P0 和其他一些进程形成了循环等待圈,但 PK 不在圈内,若 PK 释放了输出设备,则可打破循环等待,
如下图所示,因此循环等待只能是死锁的必要条件。
资源分配图含圈而系统又不一定有死锁的原因是同类资源数大于1。但是若系统中每类资源都只有一个资源,则资源分配图就变成了出现死锁的充分
必要条件。
要注意区分不可剥夺条件与请求和保持条件。