死锁 Q&A

1. 试举例说明竞争不可抢占资源所引起的死锁。

不可抢占资源:也就是在p1进程占有使用的时候,p2进程不能去抢。

在两个进程都在运行中,且在进行下一步的时候操作所需的不可抢占资源都被对方正在占有。
进程此时没有办法进行下一步结束释放资源,也不能自己终止,就进入了无限等待的状态,此为死锁。

2. 为了破坏“请求和保持”条件而提出了两种协议,试比较这两种协议。

第一种协议:所有进程在开始运行之前,必须一次性地申请其在整个运行过程中所需的全部资源。优点就是简单、易行且安全;缺点就是资源被严重浪费、进程经常发生饥饿现象。这样的方法虽然可以把死锁杜绝,但是明显太过于死板,浪费资源。当浪费的资源到达一定的值的时候,危害不会比死锁带来的小。明显的治标不治本。

第二种协议:允许一个进程只获得运行初期所需的资源后,便开始运行。进程运行过程中再逐步释放已分配给自己的、且已用毕的全部资源,然后再请求新的所需资源。比上一种要好一些,应该这种方法不仅尽可能的减少死锁发生的概率,而且避免了一定程度的资源浪费,假如死锁发生的结果还可以接受的情况下,使用第二种方式相比第一种却要好的多。

3. 何谓死锁?简述死锁发生的四个必要条件,如何避免与预防死锁?

死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。例如,在某一个计算机系统中只有一台打印机和一台输入 设备,进程P1正占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程P2 所占用,而P2在未释放打印机之前,又提出请求使用正被P1占用着的输入设备。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁状态。

死锁产生的原因

  1. 系统资源的竞争
    系统资源的竞争导致系统资源不足,以及资源分配不当,导致死锁。

  2. 进程运行推进顺序不合适
    进程在运行过程中,请求和释放资源的顺序不当,会导致死锁。

产生死锁的四个必要条件

互斥条件:一个资源每次只能被一个进程使用,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。

请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。

循环等待条件: 若干进程间形成首尾相接循环等待资源的关系

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

死锁的避免与预防

  1. 死锁避免的基本思想:

系统对进程发出每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配。这是一种保证系统不进入死锁状态的动态策略。

理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何让这四个必要条件不成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源。因此,对资源的分配要给予合理的规划。

  1. 死锁避免和死锁预防的区别:

死锁预防是设法至少破坏产生死锁的四个必要条件之一,严格的防止死锁的出现,而死锁避免则不那么严格的限制产生死锁的必要条件的存在,因为即使死锁的必要条件存在,也不一定发生死锁。死锁避免是在系统运行过程中注意避免死锁的最终发生。

4. 在解决死锁问题的几个方法中,哪种方法最易于实现?哪种方法使资源利用率最高?

预防死锁方法最容易实现,但由于所施加的限制条件过于严格,会导致系统资源利用率和系统吞吐量降低;而检测和解除死锁方法可是系统获得较好的资源利用率和系统吞吐量。