操作系统——死锁

注意区分两个概念
死锁(Deadlock):指进程之间无休止地相互等待
饥饿(Starvation):指一个进程无休止地等待

在多道程序系统中,虽然可借助于多个程序的并发执行来改善系统的资源利用率,提高系统吞吐量,但可能引发死锁(因为上面也提到了死锁是进程间无休止地相互等待)

产生死锁的原因

1、竞争资源
2、进程间推进顺序非法

操作系统——死锁_第1张图片

产生死锁的必要条件

①互斥条件:进程对所分配到的资源进行排他性使用
②请求和保持条件:进程已经保持了至少一个资源,又提出新的资源请求,而新请求资源被其他进程占有只能造成自身进程阻塞,但对自己已获得的其他资源保持不放,必然影响其他进程。
③不剥夺条件:进程已获得的资源未使用完之前不能被剥夺,只能在使用完时由自己释放。
④环路等待条件

处理死锁的基本方法

事先预防:
①预防死锁
    设置限制条件,破坏四个必要条件的一个或几个,预防发生死锁。
    较易实现。限制条件的严格也会导致系统资源利用率和系统吞吐量降低。
②避免死锁
    不须事先限制,破坏四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。
    这种事先加以较弱限制的方法,实现上有一定难度,但可获较高的资源利用率及系统吞吐量,目前在较完善的系统中,常用此方法来避免发生死锁。

事后处理:
③检测死锁。
    允许系统运行过程中发生死锁,但通过系统检测机构可及时的检测出,能精确确定与死锁有关的进程和资源;然后采取适当的措施,从系统中将已发生的死锁清除掉。
④解除死锁。
    与死锁检测配套的一种措施。
    常用的实施方法:撤销或挂起一些进程,以便回收一些资源并将他们分配给已阻塞进程,使之转为就绪以继续运行。
    死锁的检测与解除措施,有可能使系统获得较好的资源利用率和吞吐量(死锁几率不一定很高),但在实现上难度也最大。

预防死锁的方法

资源的排他性无法更改,需要在其他三个条件上入手

1.破坏“请求保持条件”:所有进程开始运行之前,必须一次性申请所需的全部资源(AND信号量集)—算法简单、易于实现、安全。但缺点是资源浪费严重、进程会延迟运行。

2.破坏“不剥夺条件”:允许进程先运行,当提出的新的要求不被满足时必须释放它自己保持的全部资源,以后需要时再次重新申请,----实现起来较为复杂且代价大,可能出现反复申请和释放等情况。

3.破坏“环路等待条件”:有序设置资源,将所有资源按类型进行线性排队,赋予不同序号,所有进程必须严格按照序号进行资源请求。----与前两种相比资源利用率和吞吐量明显改善,但是资源编号限制新设备的增加,应用中的使用设备顺序与规定的顺序并不协调,限制了用户编程自由。

你可能感兴趣的:(操作系统——死锁)