死锁
一、死锁产生的必要条件
- 互斥
- 占有并等待:一个进程必须占有至少一个资源,并等待另一资源,而该资源为其他进程所占有
- 非抢占
- 循环等待
二、死锁处理方法
1.死锁预防:确保至少有一个死锁必要条件不成立
- 互斥:通常不能通过否定互斥条件来预防死锁。
- 占有并等待:必须保证当一个进程申请一个资源时,不能占有其他资源。一个进程可以申请一些资源并使用它们,然而在它申请更多其他资源之前必须释放其现已分配的所有资源。
- 非抢占:可以使用如下协议——如果一个进程占有资源并申请另一个不能立即分配的资源,那么其现已分配的资源都可被抢占。
- 循环等待:一个确保此条件不成立的方法是对所有资源类型进行完全排序,且要求每个进程按递增顺序来申请资源。
2.死锁避免
- 资源分配图算法
- 资源分配图:节点结合包括系统活动进程和系统所有资源类型,申请边和分配边;
- 如果分配图没有环,那么系统就没有进程死锁。如果分配图有环,那么可能存在死锁。
- 银行家算法:适用于每种资源类型有多个实例的资源分配系统。
3.死锁检测
- 当系统既不采用死锁预防也不采用死锁避免算法,那么可能会出现死锁,在这种环境下,系统应该提供:
- 一个用来检测系统状态从而确定是否出现了死锁的算法
- 一个用来从死锁状态恢复的算法
- 等待图:当且仅当等待图中有一个环,系统存在死锁
4.死锁恢复
- 进程终止:终止所有死锁进程或一次终止一个进程直到取消死锁循环为止;
- 资源抢占:逐步从进程抢占资源给其他进程使用,直到死锁环被打破为止,如果要求使用抢占来处理死锁,那么有三个问题需要处理:
- 选择一个牺牲品:抢占哪些资源和哪个进程
- 回滚:如果从一个进程那里抢占了一个资源,那么应对该进程回滚到某个安全状态
- 饥饿:如何保证资源不会总是从一个进程中被抢占