(资源)死锁的四个必要条件:
- 互斥条件:至少有一个资源必须处于非共享模式,即一次只有一个进程使用,如果另一个进程申请该资源,那么申请进程必须等到该资源被释放
- 占有并等待:一个进程必须战友至少一个资源,并等待另一个资源,而该资源为其他进程所占有
- 不可抢占条件:已分配给一个进程的资源不能强制性地被抢占,它只能在进程完成任务后自动释放。
- 环路等待条件:死锁发生时,系统中一定有由两个或两个以上的进程组成的一条环路,该环路中每一个进程都在等待着下一个进程所占有的资源。
死锁预防(防止上述四种情况的出现)
- 互斥:
- 一般不能保证一个系统内没有互斥条件,有的资源本身就是非共享的
- 占有并等待:
- 必须保证,当一个进程申请一个资源时,他不能占有其他资源。
- 1.每个进程在执行前申请并获得所有资源
- 2.一个进程在申请更多资源之前,必须释放现已分配给他的所有资源
- 非抢占:
- 如果一个进程申请一些资源,那么首先检查他们是否可用。如果可用,那么就分配他们。
- 如果不可用,那么检查这些资源是否已分配给其他等待额外资源的进程
- 如果是,那么就从等待进程中抢占这些资源,并分配给申请进程
- 如果资源不可用且也不被其他等待进程占有,那么申请进程必须等待
- 当一个进程处于等待时,如果其他进程申请其用偶遇资源,那么该进程的部分资源可以被抢占
- 一个进程要重新执行,它必须分配其所申请的资源,炳辉符其在等待时被抢占的资源
- 循环等待
- 对所有资源类型进行完全排序,且要求每个进程按照递增顺序来申请资源
- 换句话说就是,当一个进程申请某资源A时,就必须先把顺序比A大的资源先释放
- 缺点:低设备使用率和吞吐率
死锁避免
安全状态
- 如果系统能按照某个顺序为每一个进程分配资源并能避免死锁,那么系统状态就是安全的
- 更准确的说,如果存在一个安全序列,那么系统处于安全状态
- 如下例:总共12,用去了5+2+2=9,还剩3。只满足 P1的需求。
- P1最多需要4个,因此剩余的3和本身有的2,就可以满足。其任务完成后,资源释放。则现有资源变成5
- P0最大需求是10,现有5,而 P1释放后,剩余资源也是5,可以满足其最大需求。任务完成后释放,资源剩余10
- P2最大需求是9,现有2,剩余10,可以满足任务需求。
银行家算法
- 就是只有当分配了资源,系统也还是安全的情况下,才会对请求的资源进行分配
- 否则就等待,直到安全才分配
死锁恢复
进程终止
- 1.终止所有死锁的进程:这种方法代价很大
- 2.一次只终止一个进程知道取消死锁循环为止:
- 这种代价也相当大,因为每次都要调用一次死锁检测算法。
- 并且取消的时候,应该终止代价最小的进程。但是什么是代价最小呢?
- 比如:优先级?进程运行了多久?距离完成还有哦多久?进程用了多少资源?等
资源抢占
- 选择一个牺牲品:和进程取消一样,必须确定抢占顺序,以使代价最小化
- 回滚:如果一个进程的资源被抢占了,那么他就应该回滚到某个安全的状态重启进程。确定这个状态不容易,因此最简单的就是终止程序,重新执行
- 饥饿:如何保证资源不会总是从同一个进程中被抢占?如果一个系统是基于代价来选择牺牲进程,那么可能代价最小的哪个进程,永远也完成不了。最常用的是:代价加上回滚次数