您的位置:首页 > 其它

死锁的定义、产生原因、必要条件、避免死锁和解除死锁的方法

2017-04-26 19:46 716 查看
一、死锁产生的原因:

1)、因为系统的资源不足,不能满足进程的资源请求,会导致多个线程同时争夺一个资源

2)、进程运行推进的顺序不合适

3)、资源分配不当,有的进程资源分配太少,会因为争夺资源而陷入死锁

二、死锁产生的场景:

1)、多个线程:彼此申请对方资源不足而导致的死锁,A申请B的锁的时候,因为锁被占用所以会把A挂起等待B释放锁,同时B申请A的 锁,同样因为A的锁锁被占用,B会被挂起等待,都被挂起没有机会释放锁,则进入了死锁。

2)、单个线程:有自己的锁,但是还要申请新锁,在申请新锁的时候,因为所被占用,所以会被挂起等待,但是锁是被自己占用,而自己又被挂起,没机会释放锁,则会进入死锁。

三、死锁产生的4个必要条件:

(1)、互斥:一个资源一次只能被一个进程使用,当该进程使用该资源的时候,其他进程就不能使用,具有独占性;

(2)、请求与保持:一个进程要请求新的资源,但同时对已获得的资源不释放,要等待其他进程释放资源;

(3)、循环等待:若干进程都要申请资源,但是都对已获得的资源不释放,都要等待其他进程释放资源,若干进程陷入循环等待资源;

(4)、不剥夺:进程已获得的资源,在未使用完之前,不能被强行剥夺。

四、这4个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁,因此可以写下如下的预防死锁的方法:

1)、破坏“互斥”条件:就是在系统里取消互斥、若资源一般不被一个进程独占使用,那么死锁是肯定不会发生的,但一般“互斥”条件是无法破坏的。因此,在死锁预防里主要是破坏其他三个必要条件,而不去涉及破坏“互斥”条件。

2)、破坏“请求和保持”条件:在系统中不允许进程在已获得某种资源的情况下,申请其他资源。即要想出一个办法,阻止进程在持有资源的同时申请其他资源。—-方法:所有进程在运行之前,必须一次性地申请在整个运行过程中所需的全部资源。这样,该进程在整个运行期间,便不会再提出资源请求,从而破坏“请求”条件。系统在分配资源时,只要有一种资源不能满足进程的要求,即使其他所需的各种资源都空闲也不分配给该进程,而让该进程的等待。由于该进程在等待期间未占有任何资源,于是破坏了“保持”条件。

该方法的优点:简单易行。且安全

缺点:资源被严重浪费,严重恶化了资源的利用率

五、死锁的解除:

一旦检测出死锁,就应立即采取相应的措施,以解除死锁,解除死锁主要有俩种方法:

1、抢占资源:从一个或多个进程中抢占足够数量的资源,分配给死锁进程,以解除死锁状态

2、终止或撤销进程:终止或撤销系统中的一个或多个死锁进程,直至打破循环环路,使系统从死锁状态解脱出来。

总结:

一般情况下,如果同一个线程先后两次调用lock,在第二次调用时,由于锁已经被占用,该进程会挂起等待别的线程释放锁,然而锁正是被自己占用着的,该进程又被挂起而没有机会释放锁,因此就永远处于挂起等待状态了,这就叫做死锁(Deadlock)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: