操作系统---死锁
文章目录
一、死锁的定义
如果一组进程中的每一个进程
都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程是死锁的。
二、产生死锁的四个必要条件
- 互斥:在一个时间只能有一个进程使用资源。
- 请求和保持(持有并等待):进程保持至少一个资源正在等待获取其他进程持有的额外资源。
- 不可抢占:一个资源只能在进程已经完成了它的任务之后,被自愿释放。
- 循环等待:存在n个进程,进行循环等待所占资源。
值得注意的是,死锁出现后,必须满足这四个条件;但是如果出现这四个条件,不一定出现死锁。
对于死锁处理的办法有死锁预防,死锁避免,死锁检测,死锁恢复。
三、死锁预防
预防死锁的思想就是设计一种方法,一定不会出现死锁,即破坏死锁出现的四个必要条件。
1、破坏互斥
让共享资源不是必须的,必须占用非共享资源。
缺点:
扼杀了共享资源,系统有了很大的局限性。
2、破坏请求和保持
必须保证当一个进程请求的资源,它不持有任何其他资源。
缺点:
需要进程请求并分配其所有资源,它开始执行之前或允许进程请求资源仅当进程没有资源;资源利用率很低,可能引发饥饿。
改进后的方法:
允许一个进程只获得运行初期所需资源,便开始运行,运行的过程中再逐步释放不用的资源,请求新的资源。能够提高设备的利用率,减少进程发生饥饿的几率。
3、破坏不可抢占
如果进程占有某些资源,并请求其他不能被立即分配的资源,则释放当前正占有的资源。
实现细节:
1.被抢占资源添加到资源列表中。
2.只有当它能够获得旧的资源并且请求新的资源存在,进程可以得到执行。
缺点:
实现复杂,代价高。
4、破坏循环等待
对所有资源类型进行排序并赋上序号,要求每个进程按照资源的顺序进行申请。如果需要多种资源,必须先请求序号低的资源,再请求序号高的。如果占有序号高的又想请求序号低的,必须释放所有序号大于低序号的资源。采用这种线性的方式,能够打破循环等待的条件。
缺点:
1.资源的序号必须相对稳定,限制新设备的增加。
2.作业使用各类资源的顺序与系统规定顺序不同,造成浪费。
3.增加用户程序编程时的代价,必须按照规定次序申请资源。
四、死锁的避免
既然死锁的预防策略都显得特别的极端,就看看有哪些避免策略。避免死锁抓住了进程请求资源的这一契机,进程请求资源时先判断会不会产生死锁,如果会就不给。而不是基于破坏死锁必要条件的考虑。
1、主要思路
1.最简单和最有效的模式是要求每个进程声明它可能需要的每个类型资源的最大数目。
2.资源的分配状态是通过限定与分配的资源数量,和进程的最大需求。
3.死锁避免算法动态检查的资源分配状态,以确保永远不会有一个环形等待状态。
2、银行家算法
银行家算法是用于避免死锁的算法。
前提条件
1)多个实例
2)每个进程都必须能最大限度地利用资源
3)当一个进程请求一个资源,就不得不等待
4)当一个进程获得所有的资源就必须在一段有限的时间释放他们