操作系统---死锁
死锁问题
一组阻塞的进程持有一种资源等待获取另一个进程所占有的一个资源,进程相互等待
下图发生死锁
下面两个图没有发生死锁,未形成环,多个资源
如果图中包含循环:
如果每个资源类只有一个实例,那么死锁
如果每个资源类有几个实例,可能死锁
死锁特征
死锁出现一定会出现以下四个条件(必要条件),但是出现以下四个条件不一定死锁:
互斥: 在一个时间只能有一个进程使用资源
持有并等待: 进程保持至少一个资源正在等待获取其他进程持有的额外资源
无抢占: 一个资源只能被进程资源释放,进程已经完成了它的任务之后
循环等待: 存在等待进程集合{P0,P1,...,Pn},P0正在等待P1所占用的资源,P1正在等待P2占用的资源...Pn-1在等待Pn的资源,Pn正在等待P0所占用的资源
2注意:死锁是因,而四个条件是果
死锁处理方法
常见方法
确保系统永远不会进入死锁状态
运行系统进入死锁状态,然后恢复.
忽略这个问题,假装系统中从来没有发生死锁,用于大多数操作系统,包括UNIX
Deadlock Prevention 死锁预防
我们知道死锁会产生四个条件,那么死锁不会出现,只要打破其中一个
限制申请方式
互斥 - 共享资源不是必须的,必须占用非共享资源
占用并等待 - 必须保证当一个进程请求的资源,它不持有任何其他资源
1、需要进程请求并分配其所有资源,它开始执行之前或允许进程请求资源仅当进程没有资源
2、 资源利用率低,可能发生饥饿
无抢占 -
如果进程占有某些资源,并请求其他不能被立即分配的资源,则释放当前正占有的资源
被抢占资源添加到资源列表中
只有当它能够获得旧的资源以及它请求新的资源,进程可以得到执行
循环等待 - 对所有资源类型进行排序,并要求每个进程按照资源的顺序进行申请
Deadlock Avoidance 死锁避免
需要系统具有一些额外的先验信息提供
1、最简单和最有效的模式是要求每个进程声明它可能需要的每个类型资源的最大数目
2、资源的分配状态
是通过限定提供与分配的资源数量,和进程的最大需求
3、死锁避免算法动态检查的资源分配状态
,以确保永远不会有一个环形等待状态
当一个进程请求可用资源,系统必须判断立即分配是否
能使系统处于安全状态
系统处于安全状态指: 针对所有进程,存在安全序列
如果系统处于安全状态→无死锁
如果系统处于不安全状态→可能死锁
避免死锁: 确保系统永远不会进入不安全状态
经典死锁避免的方法:银行家算法
Deadlock Detection 死锁检测
定期调用检测算法来搜索图中是否存在循环
算法需要n^2次操作,n是图中顶点的数目
如果检测算法多次被调用,有可能是资源图有多个循环,所以我们无法分辨出多个可能死锁进程中的哪些"造成"死锁
Recovery from Deadlock 死锁恢复
1、终止所有的死锁进程
(过于暴力)
2、在一个时间内终止一个进程直到死锁消除
终止进程的顺序应该是:
进程的优先级
进程运行了多久以及需要多少时间才能完成
进程占用的资源
进程完成需要的资源
多少进程需要被终止
进程是交互还是批处理
选择一个受孩子 - 最小的成本
回滚 - 返回到一些安全状态,重启
进程到安全状态
饥饿 - 同一进程可能一直被选作受害者,包括回滚的数量