死锁的概念
两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
产生死锁的原因
1 | (1) '互斥条件': 一个资源每次只能被一个进程使用。 |
预防死锁
1 | 1) '破坏互斥条件' |
避免死锁(银行家算法)
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:
(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客; (2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量; (3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款; (4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.
1
2
3
4
5 > 操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,
> (1)如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
> (2)当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。
> (3)若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。
>
检测死锁(死锁定理)
通常分析描述死锁,可以用资源分配图。关于资源分配图,要仅仅抓住两点:
- 请求边
- 分配边
关键在找:空闲资源。如果空闲资源可以满足某个进程,这个进程就可以解脱了,把它摘除资源分配图,再看剩下的资源分配图,策略相同。
在资源分配图中,把分配的资源与进程连好,再看进程请求边。按照分配边分配好以后,剩余的资源就是空闲资源。此时再来分析进程Pi的请求边,如果空闲资源都能满足Pi的请求,也就意味着Pi可以从这个纠缠的图中得到解脱。删除Pi的所有相关的资源:已分配的+请求的。再递归处理剩下的资源分配图。
参看:https://blog.csdn.net/jgm20475/article/details/81297819
解除死锁
1、资源剥夺法
挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但应防止被挂起的进程长时间得不到资源,而处于资源匮乏的状态。
2、撤销进程法
强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源。撤销的原则可以按进程优先级和撤销进程代价的高低进行。
3、进程回退法
让一(多)个进程回退到足以回避死锁的地步,进程回退时自愿释放资源而不是被剥夺。要求系统保持进程的历史信息,设置还原点。