死锁的处理
死锁预防
条件 | 解决方法 | 缺点 | |
---|---|---|---|
破坏互斥条件 | 只有对必须互斥使用的资源的争夺才会导致死锁 | 采用某种技术(如SPOOLing技术)将资源改造成逻辑上共享的资源 | 1.并不是所有资源都可以改造成共享的 2.为了系统安全,要保障资源的互斥性 3.因此大多数时候无法打破互斥条件 |
破坏不剥夺条件 | 进程所获得的资源只能主动释放,无法被剥夺 | 1.当想要请求的资源无法满足时,立刻释放自己占有的所有资源,之后再重新申请(容易饥饿) 2.通过操作系统从其他进程处抢夺资源 |
1.实现复杂 2.剥夺别人的资源时会让对方前功尽弃 3.反复申请和释放会增加系统开销,降低吞吐量 |
破坏请求和保持条件 | 进程已经持有了一个资源,但又提出申请新的资源,但该资源被其他进程占据,因此会阻塞,但又不打算释放自己的资源 | 1.静态分配法:在进程运行前一次性给他分配完他要用的所有资源 |
资源利用率低,可能导致某些进程饥饿 |
破坏循环等待条件 | 存在一个进程资源的循环等待链,链中的每一个进程所占有的资源都是他上一个相邻的进程所渴望的资源 | 顺序资源分配法:给资源编号,按编号递增的方法一次请求资源 | 1.不方便增加设备,要改变编号 2.进程实际使用资源的顺序可能和编号顺序不一致,导致资源浪费 3.用户编程麻烦,不同系统可能编号顺序不同 |
死锁避免
- 什么是安全序列
- 什么是系统的不安全状态,与死锁有啥关系
- 如何避免系统进入不安全状态(银行家算法)
安全序列:指一条进程分配资源的顺序队列,按照此顺序分配资源,则每个进程都能得到执行,不会死锁
安全态:只要能找出一条安全序列,则系统就是安全状态的,安全序列可以有多条,如果一条都找不到,则就是不安全状态
安全状态一定不会发生死锁
不安全状态可能会发生死锁,也可能不会
银行家算法:
在分配资源前,判断此次分配是否会让系统进入不安全状态,以此决定是否分配该资源。
将剩余的资源先分配给能分配的进程,待该进程运行完之后获取他的所有资源,然后再分配要求更高的进程
银行家算法步骤:
- 检查此次申请是否超过之前声明的最大需求数
- 检查剩余资源数是否能满足该请求
- 试探着分配,调整各资源数据结构
- 用安全性算法检查是否会进入不安全状态
安全性算法
- 检查当前剩余的资源是否满足某进程的最大资源需求数,如果满足,则将该进程已有的资源合并到剩余资源中
- 不断重复上述过程,以检查更高级的进程需求
死锁的检测和解除
死锁检测算法:
- 用某种数据结构来保存资源的请求和分配信息
- 提供一种算法,利用上诉信息进行检测是否进入死锁状态
若最终能消除所有的边,则称为可简化,此时一定没有死锁
若不能消除,则就是发生了死锁
最终还连着边的进程就是死锁进程
死锁解除
- 资源剥夺法:挂起某些死锁进程,抢占他的资源,将这些资源分配给其他死锁进程。要防止挂起的进程长时间得不到资源而饥饿。
- 撤销进程法:强制撤销部分甚至全部的死锁进程,并剥夺这些进程所占有的资源。实现简单但代价大,好不容易执行到某一步的进程不得不重来
- 进程回退法:让一个或多个死锁进程回退到足以避免死锁的地步,这要求系统记录进程的历史信息,设置还原点。
如何决定对谁下手?
- 进程优先级低的
- 已执行时间少的
- 离执行结束相差较远的
- 占有大量资源的进程
- 进程是交互式的还是批处理式的