5.1 死锁的概念
死锁的定义
两个或多个进程无限期地等待永远不会发生的条件的一种系统状态.(结果:每个进程都永远阻塞)
死锁的另一种定义: 在两个或多个进程种,每个进程都持有某种资源,但又申请其它进程已持有的某种资源.此时每个进程都拥有其运行所需的一部分资源,但是又都不够,从而每个进程都不能向前推进,陷于阻塞状态.这种状态称死锁.
如哲学家吃饭问题:有5个哲学家围在一个圆桌吃饭,每人左右两边各有1只筷子,用2只筷子才能吃饭,而每个人只能用自己左右两边的筷子.
5.2 死锁起因
死锁产生的起因往往有以下几种:
系统资源有限: 资源数目不足,进程对资源的竞争而产生死锁.
并发进程的推进顺序不当: 进程请求资源和释放资源的顺序不当,导致死锁.
死锁的一些结论
- 参与死锁的进程至少是2个
- 参与死锁的进程至少有2个已经占有资源
- 参与死锁的所有进程都在等待资源
- 参与死锁的进程是当前系统中所有进程的子集
- 死锁会浪费大量系统资源,甚至导致系统崩溃
5.3 死锁预防策略
死锁的必要条件
互斥条件: 进程互斥使用资源,资源具有独占性
不剥夺条件: 进程在访问完资源前不能被其它进程强行剥夺
部分分配条件: 进程边运动边申请资源,临时需要临时分配
环路条件: 多个进程构成环路:环中每个进程已占用的而资源被前一个进程申请,而自己所申请资源又被环中后一进程占用着.
预防死锁
通过设置某些限制条件,破坏死锁四个必要条件中的一个或多个,来预防死锁
破坏互斥条件..........................(难)
破坏不剥夺条件..........................(代价大)
破坏部分分配条件..........................(预先静态分配)
破坏环路条件..........................(有序资源分配)
预防死锁较易实现, 缺点: 由于限制太严格,导致资源利用率和吞吐量降低
避免死锁
不事先采取限制取破坏产生死锁的条件,而是在资源分配过程中,用某种方法取评估分配资源是否会让系统进入死锁状态,若是,则拒绝此次分配资源,从而避免死锁的发生.
只需要较弱的限制条件,可获得较高的资源利用率和系统吞吐量. 缺点:实现较难
检测和恢复死锁
允许死锁发生,但可通过检测机制及时检测出死锁状态,并精确确定与死锁有关的进程和资源,然后采取适当措施,当系统中已发生的死锁清除,将进程从死锁状态解脱出来.
缺点1: 检测方法复杂,实现难度大
缺点2: 恢复方法靠人工.撤销一些进程,回收资源再分配
预先静态分配法
特点
- 执行可能被延迟: 所需资源不能全部满足时.
- 应用开销增大: 运行前估算资源需求
- 资源利用率低: 资源被占而不用
改进
资源分配的单位由进程改为程序步.
有序资源分配法
目的: 破坏环路条件,使得环路无法构成.
策略
- 系统中的每个资源分配有一个唯一序号;
- 进程每次申请资源时只能申请序号更大的资源
现有的windows或者linux对死锁没有采取策略, 因为代价较大,死锁的问题交给了用户解决.