死锁定义
死锁是指两个或两个以上的进程在执行过程中,由于资源竞争或者由于彼此通信而造成的一种阻塞现象,若无外力作用,他们都将无法推进下去,此时称系统处于死锁状态,这些永远在互相等待的进程称为死锁进程。
死锁产生的四个必要条件
(1)最基本的条件是互斥条件,只有多个进程互斥的求访问同一个资源,才会导致某个资源不能被某些需要的进程所得到
(2)请求和保持条件:对于请求和保持条件我们可以这样理解,要产生死锁是由于申请资源的进程本身都已经拥有了一部分资源,而同时又去申请另外一些进程占有的自己所必须的条件,这样每个进程都在等待申请其他进程的资源,导致所有的进程都陷入到死等中;
(3)不可抢占条件:对于不可抢占条件也很容易理解,试想一下如果进程中有抢占的条件的话,那么优先级高的进程就会抢占到优先级低的进程的资源,这显然是不符合死锁的定义的,因此不可抢占条件是必不可少的;
(4)循环等待条件:为了方便我们的理解,可以以两个进程为例,类似于scoped_ptr中的循环引用问题;
死锁解除和避免算法:
本质:因为死锁必须满足四个必要条件,因此死锁的解除和避免主要是从破坏死锁的四个必要条件入手;
预防死锁
一般来说互斥条件是无法破坏的,所以在解除或者预防死锁时主要从其他三个方面入手
(1)破坏请求和保持条件
第一种协议:在所有进程开始运行之前,必须一次性的申请其在整个运行过程中的所有资源,这样便破坏了请求条件;只要一个进程中有一个资源不满足,必须释放他所占有的资源,这样便破坏了保持条件;
第二种协议:第二种协议是第一种协议的改进,它允许进程只要获得运行初期所需的资源后,便开始运行,在运行过程中在逐步释放已分配给自己的(破坏了保持条件),且已经用完的全部资源,然后再开始申请新的资源。
两种协议比较:第二种协议优于第一种协议,因为第一种协议会造成资源的严重浪费,使资源利用率大大的降低,也会由于占据大量资源导致其它进程的饥饿问题
(2)破坏不可抢占条件
方式一:当一个进程已经占有了某些不可抢占的资源时,又去申请新的资源而得不到满足时,就必须释放自己已经保持的所有资源(类似于上面的第一种协议中破坏保持条件),待以后需要的时候再重新申请;
方式二:如果系统中的进程的优先级不同时,当优先级高的进程去申请优先级低的进程所占据的资源时,操作系统就可以抢占优先级低的进程的资源;
(3)破坏循环等待条件
对系统所有资源进行线性排序并赋予不同的序号,这样我们便可以规定进程在申请资源时必须按照序号递增的顺序进行资源的申请,当以后要申请时需检查要申请的资源的编号大于当前编号时,才能进行申请。
解除死锁:
常用的解除死锁的两种方法
(1)抢占资源:从一个或者多个进程中抢占足够的资源,分配给死锁进程,用于解除死锁;
(2)终止(或撤销)进程:终止(或撤销)系统中的一个或者多个死锁进程,直至打破死锁循环环路,使系统从死锁中解除出来。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)