admin 管理员组文章数量: 887017
资源分类
- 可抢占资源
指某进程在获得这类资源后,该资源可以再被其他进程或系统抢占。对于这类资源是不会引起死锁的。 CPU和主存均属于可抢占性资源。 - 不可抢占资源
一旦系统把某资源分配给该进程后,就不能将它强行收回,只能在进程用完后自行释放。
磁带机、刻录机、打印机、共享变量等也都属于不可抢占性资源。 - 可消耗资源
又称为临时性资源,它是在进程运行期间,由进程动态的创建和消耗的,如进程间通信的消息、信号量等。 - 不可抢占资源和可消耗资源会导致死锁问题
死锁产生的原因
- 死锁的起因,通常是源于多个进程对不可抢占资源和可消耗资源的争夺,而根本原因就在于系统资源不足
- 通常原因有:
1、进程推进顺序不当产生死锁
场景一(争夺不可抢占资源):设系统有打印机、读卡机各一台,它们被进程P和Q共享。两个进程并发执行,它们按下列次序请求和释放资源:
进程P 进程Q
请求读卡机 请求打印机
请求打印机 请求读卡机
释放读卡机 释放读卡机
释放打印机 释放打印机
死锁场景:若进程P、Q几乎同时分别请求读卡机、打印机,并获得成功,然后再分别请求打印机与读卡机时,因已无用可用资源而双双陷入等待状态。
场景二(争夺消耗性资源) :进程Q1和Q2共享两个可再用资源R1和R2。s1和s2分别代表资源R1和R2能否被使用的信号量,由于R1和R2是共享的,必须使用互斥。因而s1和s2的初值为1。假定两个进程都要求使用两个资源,它们的程序如下:
死锁场景:若进程Q1 、 Q2几乎同时分别执行P(s1)、P(s2)请求资源R1、R2,并获得成功,然后再分别P(s2)、P(s1)请求资源R2、R1,因两个资源已经分别分配出去,进程Q1 、 Q2双双陷入等待状态
2、所有进程在等待并不存在的消耗性资源
- 在进程通讯时使用的信件可以看作是一种临时性资源,如果系统中初始条件没有信件,但都一开始都要求接收信件,则可能引起死锁
死锁和资源数量的关系
- 一般情况下,某系统同类资源m个,供n个进程共享。如果每个进程至少申请k个资源,m、n、k满足什么条件,系统就不会发生死锁?
解:每个人进程先分配k-1个资源,就会先分配掉(k-1)*n个资源,最后再分配一个资源给其中一个进程,这样进程结束释放资源就不会导致死锁。所以有表达式:(k-1)*n+1<=m
,只要满足这样的条件,系统就不会发生死锁。
死锁的定义
-
死锁的定义
一组进程中的每一个进程,均无限期地等待此组进程中某个其他进程占有的,因而永远无法得到的资源,这种现象称为进程死锁。 -
产生死锁的必要条件
-
互斥条件( mutual exclusion ):一个资源在同一时刻只能分配给一个进程。任何时刻一个资源仅为一个进程独占,若另一进程请求一个已被占用的资源时,必须等到占用者释放资源。
-
请求和保持条件(hold-while-applying) :进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有。
-
不可抢占条件(non preemption):进程已获得的资源,在未使用完之前不能被抢占,只能在进程使用完时由自己释放。
-
循环等待条件(circular wait):叫环路等待条件,存在一个循环等待链,其中,每一个进程分别等待它前一个进程所持有的资源,造成永远等待
-
-
处理死锁的方法
-
预防死锁(deadlock prevention):该方法是通过设置某些限制条件,去破坏产生死锁四个必要条件中的一个或几个来预防产生死锁。这种方法是最容易实现的
-
避免死锁(deadlock avoidance) :不事先采取各种限制措施,去破坏产生死锁必要条件,而是在资源的动态分配过程中,用某种方法防止系统进入不安全状态,避免发生死锁。
-
检测死锁(deadlock detection) :事先不采取任何限制性措施,允许进程在运行过程中发生死锁。但通过检测机构,及时地检测出死锁的发生,并解除死锁。
-
解除死锁(deadlock recovery) :当检测到系统中已发生死锁时,就采取相应措施,将进程从死锁状态中解脱出来。常用的方法是撤消一些进程,回收它们的资源,分配给已处于阻塞状态的进程,使其能继续运行。这种方法并发程度最高,资源利用率最高
-
预防死锁
一、破坏“请求和保持”条件
- 第一种协议
一次性申请完在整个运行过程中需要的所有的资源 - 第二种协议
先申请初期需要的资源,在运行的时候再逐步释放已经用完的资源,并且申请需要的资源
二、破坏“不可抢占”的条件
- 要求已经保持了某些不可被抢占资源的进程,提出新的资源请求而不能得到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。从而破坏了“不可抢占”条件。
三、破坏“循环等待”的条件
- 有序的资源分配法:在这种方法中规定,系统将所有的资源按其类型进行线性排队,并赋予不同的序号。所有进程对资源的请求必须严格按资源序号递增的次序提出,如果出现已经获得高次序的资源但是想要申请低序号的资源的时候,就要先释放掉所有高次序资源和同等级资源,才能重新申请资源。这样,在所形成的资源分配图中,不可能再出现环路,因而摒弃了“循环等待”条件
避免死锁——银行家算法
一、安全状态
-
安全状态:如果系统中存在一种执行路径,使可用的系统资源能满足所有进程的资源请求得到满足,从而顺利结束,称系统处于安全状态,这个执行路径中,各进程依次顺利结束的顺序<p1,p2,…,pn>称为安全序列。
-
处于安全状态的系统一定是不会发生死锁的
二、银行家算法
当一个进程提出资源请求时,银行家算法要做的工作其要点是:
①判断有无实施资源分配的可能。如果系统有能力,则实施预分配。
②预分配。
③判断分配后系统是否安全,若安全,则真正实施分配。
举例说明:
假定系统有五个进程p0-p4,和三类资源A\B\C,各类资源的数量分别是10、5、7,在t0时刻的时候资源分配的情况如下:
(1)t0时刻的安全性:利用安全性算法对t0时刻的资源分配进行分析,看是否安全
解:由题,存在一个安全序列{p1,p3,p4,p2,p0},所以系统是安全的(看图)
(2)p1请求资源{1,0,2}
假设给p1分配资源,用银行家算法进行检查:
- p1请求资源{1,0,2}<需要的资源{1,2,2}——因为不能超过总量max
- p1请求资源{1,0,2}<可用资源{3,3,2}——如果多于这个量就不应该分配资源,而是p1进入等待。
- 假定系统给p1分配资源,使用银行家算法实现:
这个时候的资源分配图如下:
这个时候的安全性检查如下:
所以这个系统是安全的,可以立即给p1分配资源
死锁检测
- 资源分配图
该图是由一组结点N,和一组边E所组成的一个对偶G=(N,E),它具有下述形式的定义和限制: - 死锁定理
我们可以利用把资源分配图加以简化的方法(删去与死锁无关的进程、资源及资源分配请求关系),来检测当系统处于S状态时,是否为死锁状态。(s状态:所有耳朵节点都是孤立的) - 简化方法
- 在资源分配图中,找出一个既不阻塞又非独立的进程结点Pi。在顺利的情况下,Pi可获得所需资源而继续运行,直至运行完毕,再释放其所占有的全部资源,这相当于消去pi的请求边和分配边,使之成为孤立的结点。在图(a)中,将p1的两个分配边和一个请求边消去,便形成图(b)所示的情况。
- p1释放资源后,便可使p2获得资源而继续运行,直至p2完成后又释放出它所占有的全部资源,形成图(c)所示的情况。
- 在进行一系列的简化后,若能消去图中所有的边,使所有的进程结点都成为孤立结点,则称该图是可完全简化的;若不能通过任何过程使该图完全简化,则称该图是不可完全简化的。
S为死锁状态的充分条件是: 当且仅当S状态的资源分配图是不可完全简化的。该充分条件被称为死锁定理。
版权声明:本文标题:操作系统 死锁问题 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1729849584h1360889.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论