死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。
一.死锁产生的原因:
(1)因为系统资源不足,不能满足进程的资源请求,会导致多个线程之间同时争夺一个资源。
(2)进程运行的顺序不合适。
(3)资源分配不得当,有的进程分配的资源太少,会因为争夺资源而陷入死锁。
二.死锁产生的场景:
(1)多个线程:他们因为彼此申请对方的资源而导致的死锁。例如:A线程申请B线程的锁,因为锁被占用而会将A线程挂起而等待B线程释放锁,同时B线程申请A线程的锁,同样因为A的锁被占用,而导致B线程被挂起,当A,B线程都被挂起时因为没有机会释放锁,从而进入死锁。
(2)单个线程:此线程有自己的锁,但是还要申请新的锁,在申请新锁的时候,因为锁被占用,所以会被挂起等待,但是锁是被自己占用的,而自己又被挂起,因为没有机会释放锁,从而会进入死锁状态。
三.死锁产生的条件:
(1)互斥:一个资源一次只能被一个进程使用,当该进程使用此资源的时候,其它进程就不能使用此资源,具有独占性。
(2)请求与保持:一个进程要请求新的资源,但同时对已获得的该资源的进程不释放此资源,则要等待其它进程释放资源。
(3)循环等待:若干个进程都要申请资源,但是对已获得资源的进程不释放此资源,则若干进程陷入循环等待,等待获得资源的进程释放此资源。
(4)不剥夺:对于进程已获得的资源,在未使用完之前,不能被强行剥夺。
四.如何避免死锁?
首先应该根据产生死锁的原因来避免死锁。(比如申请足够的资源,以及进程的执行顺序应该合理,高效,进程间资源的分配应该得当)。
接下来根据死锁产生的条件分析:对于在请求新的资源前,应该将自己的锁释放掉,再申请新的锁,对于不剥夺要适情况而定,如果别人锁的优先级比自己锁的优先级高,则可以抢过来。