操作系统(6)
6.1死锁的原理
- 定义
- 一组进程中每个进程都在等待某个事件(资源),而该事件(资源)在其他阻塞进程中才能触发(释放)
- 死锁涉及两个及多个进程之间的资源需求冲突
- 死锁的原因:竞争资源,进程推进顺序不当
- 利用联合进程图来推断是否会发生死锁
- 两类资源
- 可重用资源:可重复使用,互斥使用
- 可消耗资源
- 利用资源分配图来判断是否发生死锁
- 资源指向进程:占有(分配),进程指向资源(请求)
- 圆点表示进程,方框是资源
- 有向图,描述资源和进程的状态
- 死锁必有环,有环不一定死锁(要看是否所有进程都阻塞)
- 死锁的条件——四个必要条件同时成立才可能进入死锁
- 互斥:互斥访问的临界资源
- 占有且等待:进程申请资源阻塞时没有释放已分配资源
- 不可抢占:进程已占用资源使用完前不可抢占
- 循环等待:进程间形成等待资源的循环链
- 三种处理方法
- 死锁预防:破环四个必要条件之一
- 死锁避免:不破坏,但分配资源前会先判断检查资源分配状态
------------------------------保证系统不会进入死锁--------------------------------
-
- 死锁检测和恢复:检查是否死锁,并撤销死锁进程或剥夺资源
- 忽略死锁:假设死锁不发生
6.2死锁预防(利用率低)
- 破坏互斥——为了资源的互斥,不能破坏
- 破坏占有且等待
- 资源静态分配法:一次分配所有需要资源,若不能满足则全不分配,进程等待直至所有资源可用
- 可能引起饥饿,资源利用率低
- 进程可能事先不知道所需要的资源列表
- 资源静态分配法:一次分配所有需要资源,若不能满足则全不分配,进程等待直至所有资源可用
- 破环不可抢占
- 进程申请新资源被阻塞时,主动释放已占有资源
- os剥夺低优先级的资源给高优先级
- 破环循环等待
- 资源有序分配法:为每一个资源编号,进程严格按照编号递增顺序申请资源
6.3死锁避免(同样利用率低)
- 动态申请资源以及先计算安全性后决定是否分配
- 两种死锁避免方法
- 进程启动拒绝:若新进程资源最大需求总量会导致死锁,则不启动新进程
- 进程资源已分配量不能超过其事先声明的最大需求量(看看自己是不是过分了)
- 每一进程对一种资源的需求量不能大于该资源总量(可用是否足够)
- 所有进程最大需求量加上新进程Pn+1的最大需求量小于系统资源总量时才启动新进程(安不安全)
- 资源分配拒绝,某次资源请求会导致死锁,则不允许此次分配
- 银行家算法:分配前先计算是否会导致系统不安全
- 安全状态:能找到一个安全序列,使得所有进程都能运行完
- 不安全状态,不存在一个安全序列使得进程运行完
- 不安全状态≠死锁状态
- 先比较请求的资源加上已分配是否大于最大声称最大(自查)
- 比较请求是否小于剩余可用
- 试探性分配,是否存在安全序列
- 银行家算法:分配前先计算是否会导致系统不安全
- 进程启动拒绝:若新进程资源最大需求总量会导致死锁,则不启动新进程
6.4死锁检测(利用率高但安全性低)
- 只要请求资源可用则分配,定时检测是否有死锁
- 检测算法:类似银行家算法,若存在未标记进程则该进程为死锁进程(当allocation=0则结束)
- 资源分配图化简法检测死锁
- 当且仅当该状态的资源分配图不可完全简化时系统发生死锁
- 逐个找出既不阻塞又非孤立的进程节点,消去请求边和分配边
- 从死锁中恢复
- 解除死锁:代价最小的撤销进程,剥夺资源
- 终止所有死锁进程
- 死锁进程滚回安全状态检查点
- 每次终止一个死锁进程,直到死锁解除
- 每次剥夺一个资源
- 如何选择终止的进程或剥夺的资源
- 已运行时间最短,预计剩余最长
- 已产生输出少,已用资源最少
- 进程优先级最低
- 防止饥饿:避免总是选择同一个牺牲者
- 解除死锁:代价最小的撤销进程,剥夺资源
6.6哲学家就餐问题
- 基于信号量解决方案(5个哲学家)
- 至多允许4给哲学家同时拿起叉子(加多一个room=4的信号量)
- 奇数号先拿左叉,偶数先拿右叉(4个先左后右,1个先右后左)
- 利用管程