死锁
死锁的定义
一组进程中,每个进程都无限等待被该组进程中另一进程所占有的资源,因而永远无法得到的资源,这种现象称为进程死锁,这一组进程就称为死锁进程。
如果死锁发生,会浪费大量系统资源,甚至导致系统崩溃。
为什么会出现死锁?
资源数量有限、锁和信号量错误使用
资源的使用方式:
“申请—分配—使用—释放”模式
可重用资源:可被多个进程多次使用
可抢占资源与与不可抢占资源
处理器、IO部件、内存、文件、数据库、信号量
可消耗资源:只可使用一次、可创建和销毁的资源
-
信号、中断、消息
活锁——》就绪
产生死锁的必要条件
互斥使用(资源独占)
占有且等待(请求和保持,部分分配)
不可抢占(不可剥夺)
循环等待
死锁定理:
如果资源分配图中没有环路,则系统中没有死锁
如果图中存在环路则系统中可能存在死锁
环路是死锁存在的必要条件
如果每个资源类中只包含一个资源实例,则环路是死锁存在的充分必要条件
解决死锁的方法:
不考虑此问题(鸵鸟算法)
不让死锁发生
死锁预防
静态策略:设计核实的资源分配算法,不让死锁发生
死锁避免
动态策略:以不让死锁发生为目标,跟踪并评估资源分配过程,根据评估结果决策是否分配
让死锁发生
死锁检测与接触
死锁预防
定义:
在设计系统时,通过确定资源分配算法,排除发生死锁的可能性
具体的做法是:防止产生死锁的四个必要条件中任何一个条件发生
银行家算法
Dijkstra提出(1965)
仿照银行发放贷款时采取的控制方式而设计的一种死锁避免算法
死锁的解除:
重要的是以最小的代价恢复系统的运行
方法如下:
撤销所有死锁进程
进程回退(Roll back)在启动
按照某种原则逐一撤销死锁进程,直到....
按照某种原则逐一抢占资源(资源被抢占的进程必须回退到之前的对应状态),直到....
哲学家就餐问题第一种解决方案
为防止死锁发生可采取的措施
最多允许4个哲学家同时坐在桌子周围
仅当一个哲学家左右两边的筷子都客用时,才允许他拿筷子
给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之
哲学家就餐问题第二种解决方案
哲学家就餐问题第三种解决方案
使用管程解决哲学家就餐问题
哲学家就餐问题第四种解决方案
本讲重点