死锁

死锁与避免死锁

死锁产生的条件:

1.互斥条件:资源是独占的且排他使用,进程互斥使用资源,即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一进程占有时,则申请者等待直到资源被占有者释放。

2.不可剥夺条件:进程所获得的资源在未使用完毕之前,不被其他进程强行剥夺,而只能由获得该资源的进程资源释放。

3.请求和保持条件:进程申请新的资源,若新的资源被其他进程占用,则阻塞,同时继续占用已申请到的资源。

4.循环等待条件:在发生死锁时必然存在一个进程等待队列{P1,P2,…,Pn},其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路,环路中每一个进程所占有的资源同时被另一个申请,也就是前一个进程占有后一个进程所申请的资源。

以上给出了导致死锁的四个必要条件,只要系统发生死锁则以上四个条件至少有一个成立。事实上循环等待的成立蕴含了前三个条件的成立,似乎没有必要列出然而考虑这些条件对死锁的预防是有利的,因为可以通过破坏四个条件中的任何一个来预防死锁的发生。

避免死锁:

避免死锁是使系统始终处于安全状态,所谓安全状态是指系统能够按照某种进程推进顺序(p1,p2,……pn)为每个进程分配所需资源,直到满足每个进程对资源的最大需求,使每个进程都可以顺利完成。

假设系统中有三个进程p1、p2、p3,共有12台磁带机,进程p1一共需要10台,p2需要4台,p3需要9台,假设T0时刻,p1、p2、p3分别已经获得了5台、2台、2台,剩余3台,这个时候系统就处于安全状态,因为可以按照这一顺序给进程分配资源,使得三个进程全部运行完成。

银行家算法避免死锁的思想和上边大致一样(可能同时分配多种资源)。

可以同时使用两个互斥量A、B,总是让它们以相同的顺序加锁,这样可以避免死锁。可能出现的死锁只会发生在一个线程试图锁住另一个线程以相反的顺序锁住的互斥量。

死锁的检测与解除

要检测死锁,1.必须保存有关资源的请求和分配信息。2.利用一种算法来检测是否发生了死锁。

死锁的检测可以利用资源分配图


image.png

上图表示:P1进程已经获得两个R1资源,并申请一个R2资源,P2进程已经获得一个R2资源和一个R1资源,并请求一个P2资源。

为了检测死锁,我们可以简化资源分配图,先找出既不阻塞又非独立的进程结点P1,如果P1能够顺利获得所需资源,且运行完之后释放所获资源,则删除与P1有关的连线,然后看P2是否能够顺利获得所需资源,然后删除与P2有关的连线。如果最后能够完全简化(删除了所有线),则说明没有发生死锁,如果不能完全简化,则说明发生了死锁。

死锁的解除:如果检测到了死锁,有两种方法解除死锁:

1.抢占资源,从一个或多个进程中抢占足够数量的资源,分配给死锁进程。

2.终止或者撤销一个或多个进程,直到系统从死锁状态解脱出来。

终止进程的方法有:

1.终止所有进程(代价太大)

2.逐个终止进程。每终止一个进程,都需要花费一个代价,在逐个终止进程直到解除死锁之后,按照代价从小到大依次把进程插入到新状态(非死锁状态)的队列中。

你可能感兴趣的:(死锁)