死锁产生的条件和预防方法
1. 资源问题
- 在系统中有许多不同类型的资源,其中可以引起死锁的主要是
需要采用互斥访问方法的、不可以被抢占的资源[临界资源]
。如打印机、数据文件、队列、信号量等- 根据是否可重用分为:可重用资源和消耗性资源
- 根据是否可抢占分为:可抢占性资源和不可抢占性资源
2. 计算机系统中的死锁
- 死锁的起因通常是源于多个进程对资源的争夺,对不可抢占性资源和可消耗性资源的争夺都可能会引起死锁。
- 竞争不可抢占性资源引起死锁
- 竞争可消耗性资源引起死锁
- 进程推进顺序不当引起死锁
3. 死锁的定义、必要条件和处理方法
3.1 死锁的定义
如果一组进程都在等待仅能由改组进程才能引发的事件,那么该组进程是死锁的
3.2 产生死锁的必要条件
产生死锁必须同时满足以下四个条件:
- 互斥条件:某资源在一段时间内,仅能被一个进程使用,具有排他性。
- 请求和保持条件:进程已经获得了至少一个资源,但是继续请求的资源被其他进程持有,则请求阻塞,此时该进程并不释放已经持有的资源
- 不可抢占条件:进程已经持有的资源不可以被其他资源抢占
- 循环等待条件:发生死锁时,必然会形成一个进程的循环等待链
3.3 处理死锁的方法
目前处理死锁的方法可以归结为四种:
- 预防死锁:事先设置限制,破坏产生死锁的必要条件
- 避免死锁:在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免发生死锁
- 检测死锁:允许发生死锁,但可以通过检测机制发现死锁并采取适当措施,把进程从死锁中解脱
- 解除死锁:当检测到系统发生死锁,就采用相应措施,将进程从死锁状态解除。
3.3.1 预防死锁
预防死锁的方法是通过破坏产生死锁的四个必要条件中的一个或几个,以避免死锁。由于互斥条件是非共享设备所必须的,不仅不能破坏,还应该加以保证。因此,主要是破坏产生死锁的后三个条件
- 破坏请求和保持条件:
- 保证进程在请求资源时,不能持有不可抢占资源。
- 具体方法是,在获得进程运行初期所需资源后就开始运行,运行过程中逐步释放已持有且已用完的资源,然后再请求新的所需资源
- 破坏不可抢占条件:当一个进程已经保持了一个不可抢占资源且需要请求新的资源被阻塞时,必须释放已持有的所有资源。不建议使用
- 破坏循环等待条件:对系统所有资源进行编号排序,规定进程必须按照递增的顺序请求资源,若持有高序号资源而需要请求低序号资源,则必须先释放高序号资源。若需要请求多各同序号资源,则必须一起请求。
3.3.2 避免死锁
在资源动态分配的过程中,防止系统进入不安全状态,以避免发生死锁。此方法所施加的限制比较弱,可以获得较好的系统性能,目前常用此方法来避免发生死锁。
- 系统的安全状态与不安全状态
- 利用银行家算法避免死锁
3.3.3 死锁的检测与解除
死锁的检测:为了能对系统中是否已发生了死锁进行检测,在系统中必须:
- 保存有关资源的请求和分配消息
- 提供一种算法,利用这些信息来检测系统是否已进入死锁状态
死锁的解除:若已经发生死锁,最简单的方法是以人工方式解除死锁;另外一种措施是利用死锁解除算法:
- 抢占资源:从一个或多个进程中抢占足够数量的资源,分配给死锁,以解除死锁状态。
- 终止【撤销】进程:终止【撤销】系统中一个或多个死锁进程,直至打破循环环路,使系统从死锁中解脱
终止进程的方法:
- 终止所有死锁进程
- 逐个终止进程