死锁
1 死锁概念
由于两个或者两个以上的(进程)去抢夺一份资源而造成阻塞的状态叫做死锁, 如果出现了死锁,会造成线程的循环等待,如果没有外力的帮助,就会一直维持着某种状态
2 发生死锁的四个必要条件
1. 互斥。非共享资源是互斥的,同一时刻只能有一个进程占有该资源
2. 占有并等待。一个进程必须占有至少一个资源,比等待另一资源,而该资源为其它进程所占有。
3. 非抢占。资源不能被抢占,即资源只能在进程完成任务后自动释放。
4. 循环等待。设有一组进程P0,P1,...,Pn,进程P0等待的资源为P1所占有,进程P1等待的资源为P2所占有,... ,进程Pn-1等待的资源为Pn所占有,进程Pn等待的资源为P1所占有。
总的来说,死锁发生的原因可归结为三点:
1. 当前进程拥有其他进程需要的资源;
2. 当前进程等待其他进程已拥有的资源;
3. 都不放弃自己的资源。
3 死锁处理
3.1 死锁预防
只要确保至少一个必要条件不成立,就能预防死锁。通过限制如何申请资源的方法来预防死锁。
3.1.1 互斥
对于非共享资源,必须要有互斥条件。
3.1.2 破坏占有并等待条件
破坏此条件,必须保证:当一个进程申请一个资源时,它不能占有资源。
有两种方法:
- 每个进程在执行之前申请并获得所有资源。
- 允许进程在没有资源时才可申请资源。
3.1.3 破坏资源不可被抢占条件
为确保这一条件不成立,可以使用如下协议:如果一个进程占有资源并申请一个不能立即分配的资源,那么其现已分配的资源都可被抢占。
3.1.4 破坏循环等待条件
对所有资源类型进行完全排序,且要求每个进程按递增顺序来申请资源。
3.2 死锁恢复
3.2.1 进程终止
有两种方法通过终止进程以取消死锁。不管采用哪种方法,系统都会收回分配给被终止进程的资源。
- 终止所有所有死锁进程。缺点:代价太大。
- 一次只终止一个进程知道取消死锁循环为止。缺点:每终止一个进程,都必须调用死锁检测算法以确定进程是否仍处于死锁。
3.2.2 资源抢占
通过抢占资源以取消死锁,逐步从进程汇总抢占资源给其他进程使用,知道死锁环被打破。
这种情况有三点必须要考虑:
- 选择一个牺牲品。抢占那些资源和哪个进程?必须确定抢占顺序以使代价最小化。
- 回滚。如果从一个进程那里抢占一个资源,那么应对该进程做些什么安排?即必须将进程回滚到某个安全状态,以便从该状态重启进程。
- 饥饿。如何确保不会发生饥饿?如何确保资源不会总是从同一个进程中被抢占?