操作系统第三周——死锁

  死锁的概念与产生

    死锁的概念:在操作系统中当两个或以上进程独自占有某种资源并申请对方所独占的资源时发生的无期间的相互等待,若无外力作用这种情况将会一直僵持。换言之就像是我需要你的东西才能继续工作而你也需要我某样东西才能工作而双方互不谦让,导致谁也无法工作。

    产生死锁的条件有互斥,不剥夺,请求并保持,循环等待四个条件。

    互斥是对系统资源的限制,比如某种资源不允许多个进程共同使用,也就是如果有一个进程获得了该资源的使用权那么其他申请该资源的进程就需要等待直到该资源空闲才能使用。就像上厕所一样每次只能一个人使用,而其他人则需要排队等候。

    不剥夺是指当一个进程所拥有的资源只能由自己释放,而没有权限来剥夺进程对自己资源的使用权。就像只有房子的业主才有权力决定自己房子的买卖,其他人没有这个权力。

    请求并保持是指进程可以在自己拥有资源的同时申请其他的资源,也就是不用在申请资源之前释放掉已经有的资源。就好比有的地方政策要求居民只能在自己名下没有房产的情况下才能申请购买房产,而有的地区却没有这个政策要求。请求并保持和这个情况相似。

    循环等待是指产生一条进程等待链,并且第i个进程Pi等待进程Pi+1而最后一个进程则在等待第一个进程的资源形成的回环。举个例子,比如存在A,B,C三个进程,若A在等待B中的资源,同时B在等待C中的资源,而C此时在等待A的资源。这样形成的回环则是循环等待链。需要注意的是循环等待并不等同于死锁。需要保证等待资源都只有一个的同时循环等待才等于死锁。

对死锁的处理

    在知道了死锁是什么并且知道是如何产生的之后,就需要了解操作系统是如何解决死锁问题的。对死锁的处理存在预防,避免,检测和解决三种方法。

死锁的预防原理就在于破坏上面所述的死锁产生条件,这样就能从让死锁没有产生的基础,实现方法简单,不过这种方法会导致操作系统效率低下,毕竟简单的代价往往就会是低效。

死锁的避免是在操作系统运行时,系统对进程进行检测,判断当前是否是不安全状态,即会不会可能导致死锁发生,若当前是不安全状态则进行一系列的处理跳出不安全状态。死锁的避免对操作系统的限制没有死锁预防多,不过实现比较复杂。

死锁的检测和解除就是不对操作系统进行限制,等到死锁发生后操作系统使用算法检测到并作相应处理解除死锁。

三种方法对系统的限制预防>避免>检测和解除,需要区分死锁预防和避免的区别,二者并不相同。

实现死锁预防的四个方法(破坏四个死锁条件的方法)

  1. 破坏互斥条件:这种方法就是让所有资源都可以共享则破坏了死锁发生的条件,不过实际上是几乎不可能实现的,例如如果让打印机共享会发生什么情况,A进程打印一行之后再让B进程打印一行吗?最后打印出来的东西肯定是一团糟。

  2. 破坏不剥夺条件:这种方法就是让进程如果发生阻塞时释放自身资源,也就是剥夺了其自身资源,等到就绪时再恢复资源。不过实现方法比较复杂并且可能导致前一段工作成果丢失导致资源浪费,并且频繁的申请与释放资源会给系统造成压力。这种方法只适用于给易于恢复现场的进程使用,例如寄存器和CPU。

  3. 破坏申请拥有条件:这个方法一般使用静态资源分配实现,也就是在进程刚开始工作时就分配其所需要的所有资源,在之后不再进行分配。不过这个方法显然是会导致严重的资源浪费,导致“饥饿”。

  4. 破坏循环等待:使用顺序资源分配法,这个方法就是对每个资源都进行编号,其每个进程申请的资源的顺序都应该是编号从低到高。例如进程P申请资源的顺序可以是1,3,6,8但不能是3,6,1,8这样就违反了顺序分配资源原则。

死锁避免的实现方法

在实现死锁避免之前需要知道系统在什么情况下才能称之为处于安全状态,在死锁避免中系统允许资源的动态分配,当每次进行资源分配时系统会用算法计算此次分配的安全性,如果分配后系统会处于不安全状态,系统则会让该进程等待,否则允许分配该资源。用一个案例来解释在某一时刻A三个进程P1P2P3对资源R总需求量和已经占有数量分别为6,7,5和3,1,3,而总的资源数量为9,这就意味着现在空闲资源数量为2,但是我们仍然有一个合理的分配顺序即P3P1P2,说明A时刻处于安全状态,但是如果在接下来再给P1分配一个资源我让三个进程拥有资源变为4,1,3,空闲资源只有1个,此时无法在找出合理的分配方法则此时处于不安全状态。

需要注意的是不安全状态并不是等于死锁,只是说明当前状态可能导致死锁,而安全状态则是当前能避免进入死锁。

实现死锁的避免的重点是”银行家算法“,这个算法能检测系统当前是否有处于安全状态并且提供一个安全的资源分配顺序。其原理就是操作系统在分配资源时查看是否超出进程声明需要的资源最大数量,如果超出则拒绝分配,或者如果当前空闲资源不能满足该进程则推迟对该进程的资源分配。

死锁的检测和解除实现方法

    这个方式有检测和解除两个步骤,收首系统会定时使用算法先检测是否有死锁发生,一般使用资源分配图的方式,所谓资源分配图就是对资源和进程的关系数量进行绘制的有向图。如下

假设有进程P1,P2和资源R1,R2,资源中的圆点为资源所拥有的资源数,可见R1最大值为3,R2为2,资源指向进程的边是指已经分配给进程的一个资源。而进程指向资源的边是指进程正在向该资源申请一个资源。由图可知P2拥有R1R2资源各一个而P1拥有两个R1资源,那么我们如何通过该图判断当前是否出现死锁呢?首先找到一个非阻塞的并且非孤立的进程并撤销它的所有边,重复直至所有剩下的进程都阻塞或者全部边都被撤销。例如上图我们可以发现由于R1资源数量不足导致P2已经阻塞了而P1还没有阻塞,那么我们撤销P1所有边,在这之后可以发现由于P1资源的释放P2也变为就绪状态,撤销P2所有有向边,此时所有边都全部撤销,说明并不是阻塞状态。若最后无法撤销所有边说明此时处于阻塞态。

    在检测出死锁发生后,解除死锁的方法有资源剥夺,进程撤销和进程退回三个方法,实际上都是对所抢占资源的一种释放方法,资源剥夺是将一个或者多个进程挂起并剥夺其资源分配给其他死锁的进程,但要注意避免挂起的进程发生饥饿;进程撤销是直接撤销某个或者多个进程并释放其资源,可以根据进程优先级撤销进程;进程退回是将死锁的进程退回到一个足以避免死锁的地步,这是一种主动的资源释放过程。可见解除死锁的三个方法都是通过释放争夺的资源来实现的,而其中进程退回是主动的释放资源而资源剥夺和进程撤销都是被动的释放其资源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值