死锁
定义:
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种堵塞的现象。在没有外力的作用下,它们将无法推进下去,此时系统便处于死锁状态或者产生了死锁。举个例子,当线程 A 持有独占锁 a ,并尝试去获取独占锁 b 的同时,线程 B 持有独占锁 b ,并尝试获取独占锁 a 的情况下,就会发生 AB 两个线程由于互相持有对方需要的锁。
产生原因:
- 竞争资源 - 共享资源数量不满足各个进程的需求
- 进程调度顺序不当
必要条件:(只有全部满足这四种必要条件才会导致死锁,缺一不可)
- 互斥条件:线程要求对所分配的资源进行 排他性控制 ,即在一段时间内某资源仅为一个线程所占有。此时若有其他线程请求该资源,则请求线程只能等待。
- 不剥夺条件:线程所获得的资源在未使用完毕之前,不能被其他线程强行夺走,即只能由获得该资源的线程自己来释放(只能是主动释放)
- 请求保持条件:线程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他线程所占用,此时请求线程被堵塞,但对自己已获得的资源保持不放。
- 循环等待条件:存在一种线程资源的循环等待链,链中每一个线程已获得的资源同时被链中下一个资源所请求。
预防死锁的方法
由于导致死锁的四个必要条件,我们只需要破坏其中一个或者多个必要条件,就能够避免死锁的产生。
1、破坏不可剥夺条件
- 当一个进程请求新的资源得不到满足时,必须释放占有的资源
- 进程运行时占有的资源可以被释放,意味着可以被剥夺
2、破坏请求保持条件
- 系统规定进程运行之前,一次性申请所有需要的资源
- 进程在运行期间不会提出资源请求。
3、破坏循环等待条件
- 可用资源线性排序,申请必须按照需要递增申请
- 线性申请不再形成环路,从而破坏循环等待条件
- 如 A -> B -> C -> D,想要获得 C 资源,必须先申请 A 资源