一、死锁概念
定义:两个或多个进程无限期地等待永远不会发生的条件的一种系统状态。(每个进程都永远阻塞)
另一定义:在两个或多个进程中,每个进程都持有某种资源,但又继续申请其他进程已持有的某种资源。此时每个进程都拥有其运行所需的一部分资源,但是又都不够,从而每个进程都不能向前进行,陷入阻塞状态。
二、死锁起因
系统资源有限
资源数目不足,进程对资源的竞争二产生死锁
并发进程的推进顺序不当
进程请求资源和释放资源的顺序不当,导致死锁
不正确的P-V操作也可能带来死锁
三、死锁预防策略
1、死锁的必要条件
互斥条件
- 进程互斥使用资源,资源具有独占性
不剥夺条件
- 进程在访问完资源前不能被其他进程强行剥夺
部分分配条件
- 进程边运行便申请资源,临时需要临时分配(区别于全部分配)
环路条件
- 多个进程构成环路(每个进程已占有的资源被后一个进程申请,而自己所申请的资源被前一个进程所占用)
2、解决死锁的策略
预防死锁
- 通过设置某些限制条件,破坏死锁四个必要条件中的一个或多个来防止死锁。
破坏互斥条件(难)、破坏不剥夺条件(代价大)
破坏部分分配条件(预先静态分配)、破坏环路条件(有序资源分配)
较易实现,(早期)广泛使用
缺点:由于限制太严格,导致资源利用率和吞吐量降低
避免死锁
不事先采取限制区破坏产生死锁条件,而是在资源分配过程中,用某种方法(可以是算法)去评估若分配资源是否会让系统进入死锁状态,若是,则拒绝此次分配资源,从而避免死锁发生。
只需要较弱的限制条件,可获得较高的资源利用率和系统吞吐量。缺点:实现较难。
检测和恢复死锁
允许死锁发生,但可通过检测机制及时检测出死锁状态,并精确确定与死锁有关的进程和资源,然后采取适当措施,将系统中已发生的死锁清除,将进程从死锁状态解脱出来。
缺点:
- 检测方法复杂,实现难度大
- 恢复方法靠人工。撤销一些进程,回收资源再分配
预先静态分配法
目的:破坏部分分配条件
策略:
进程运行前将所需资源一次性全部分配给它。
特点:
- 执行可能被延迟:所需资源不能全部满足时。
- 应用开销增大:运行前估计资源需求。
- 资源利用率低:资源被占用而不用。
改进
资源分配的单位由进程改为程序步。
有序资源分配法
目的:破坏环路条件,使环路无法构成
策略:
- 系统中的每个资源分配有一个唯一序号
- 进程每次申请资源时只能申请序号更大的资源
windows和Linux没有解决死锁,需要用户自行处理