一、什么叫死锁

    指在一组进程中,各进程都占有不会释放的资源,但因为互相申请被其它进程所占用的不会释放的资源,从而处于一种永久等待的状态。

    比如说:同一个进程先后两次调用lock,在第二次调用时,由于锁已经被占用,该进程会挂起等待该锁,然而锁是被自己占用的,又没有机会释放,所以就永远处于挂起等待状态了;再比如:进程A获得了锁1,进程B获得了锁2,这时进程A需要调用锁2,结果应该是挂起等待锁2,与此同时,进程B也需要调用锁1,结果是挂起等待锁,于是进程1和2就永远在等待对方释放锁了。


二、产生死锁的原因

    1.竞争资源

    2.进程间推进顺序非法


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

    1.互斥条件:进程对分配到的资源进行排他性使用;

    2.请求和保持条件:进程自己拥有资源,又去请求其他资源,但是该资源已经被其它进程占用,此时进程阻塞,但又不释放自己的资源;

    3.不剥夺条件:对于进程已获得的资源,在未使用完前,不能被剥夺,只能在使用完后自己释放;

    4.环路等待条件:在发生死锁时,必然存在一个进程等待另一个进程已经占用的资源,另一个进程在等待第一个进程已占用的资源。


四、预防死锁的方法

    只要破坏上边四个必要条件中的任意一个条件,死锁就不会发生。

    1.打破互斥条件。也就是说允许进程同时访问某些资源,但是,有的资源必须互斥访问,比如打印机等;

    2.打破请求且申请的条件。可以实行预先分配策略,即进程在运行前向系统申请它所需要的全部资源,如果某个资源得不到满足,则不分配任何资源,此进程暂不运行,但是,这种也有如下缺点:

    (1)许多情况下,一个进程在执行之前不可能知道它所需要的全部资源(进程是动态的);

    (2)导致资源利用率降低。有些资源只有在进程最后的时候会用到一次,但在进程的生存期间却一直占有他们,也就是长期占着不用的状况;

    (3)降低了进程的并发性。因为计算机资源本身就有限,又存在长期占着不用,能分配到所需的全部资源的进程个数必然减少。

    3.打破不可剥夺条件。允许进程强行从占有者夺得资源,当一个进程已经占有了某些资源,它又申请新的资源,但又不能立即被满足,这时必须让它释放所占的全部资源,以后再申请,但是这种方法实现的比较困难,并且会降低系统性能。

    4.打破环路等待条件。实行资源有序分配战略,即把资源事先分类编号,按号分配,这样进程在占有资源时就不会发生环路。这种策略与前边的相比,资源利用率和吞吐量都有了很大的提高,但是存在以下缺点:

    (1)增加了系统开销,因为要给所有资源编号,而且限制了进程对资源的请求;

    (2)为了遵循按编号申请的次序,暂不使用的资源也要提前申请,增加了进程对资源的占用时间。


五、死锁的解除

    1.系统重新启动。这个方法代价太大,它意味着之前所有的进程已经完成的计算工作都将消失。

    2.撤销进程,剥夺资源。终止死锁的进程,回收他们占有的资源,从而解除死锁。包括以下两种情况:

    (1)一次性撤销参与死锁的全部进程,剥夺全部资源;

    (2)逐步撤销参与死锁的进程,逐步回收死锁进程占有的资源。一般来说,逐步撤销进程按一定的原则进行,目的是撤销代价最小的进程,比如按照优先级来确定进程的代价。