1. 死锁的四个必要条件
- 互斥使用
- 不可剥夺
- 占有且等待
- 循环等待
2. 死锁的处理方法
1)死锁的预防
互斥:不能禁止。
占有且等待:一次性申请所有资源。两个问题造成低效,一个是进程等待所有资源满足,可能需要阻塞很长时间,分配的资源可能该进程长时间不用,也不能让其他进程用;另一个是一个进程可能事先并不能知道它所需要的所有资源。
不可抢占:占优部分资源的进程如果进一步申请资源被拒绝,则需要释放最初占有的资源;或者一个进程请求的资源正被另一个进程占有时,操作系统可以抢占另一个进程,让它释放资源。
循环等待:对资源类型进行排序,资源申请必须按序进行。跟不可抢占的预防一样,低效。
缺点:引入太多不合理的因素,且低效。
2)死锁的避免
如果系统中所有的进程存在一个可完成的执行序列,则称系统出于安全状态,死锁的避免需要寻找安全序列。
银行家算法:进程请求一组资源时,假意同意该请求,因此改变里系统状态,然后确定结果是否出于安全状态。如果是,同意这个请求;如果不是,阻塞该进程直到同意该请求后系统仍能处于安全状态。
缺点:也有很多限制,比如必须事先声明每个进程请求的最大资源。每次申请资源都要执行银行家算法 O(m·n^2^),效率太低,代价太大。
3)死锁检测+恢复
缺点:像银行家算法那样检测死锁,但是恢复不容易,进程造成的改变很难恢复。
4)死锁忽略
许多通用操作系统,如 PC 机安装的 Windows 和 Linux,都采用死锁忽略
因为,死锁出现的概率比较低,而且死锁忽略的代价最小 ,很多时候重启一下就可以了
5)综合死锁策略
针对不同的资源类型,选择不同的死锁策略
- 可交换空间:一次性分配所有资源;
- 进程资源:死锁避免;
- 内存:基于抢占的预防;
- 内部资源:基于资源排序的预防