文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么预防和避免死锁

代码小侠客

代码小侠客

2024-04-18 00:06

关注

  前几天在网上看见现在有很多人还不知道“死锁的预防和避免”,那么今天编程学习网就来给大家说说,有需要的小伙伴可以参考一下。

死锁预防

  防止死锁的发生只需破坏死锁产生的四个必要条件之一即可。

  1)破坏互斥条件

  如果允许系统资源都能共享使用,则系统不会进入死锁状态。但有些资源根本不能同时访问,如打印机等临界资源只能互斥使用。所以,破坏互斥条件而预防死锁的方法不太可行,而且在有的场合应该保护这种互斥性。

  2)破坏不剥夺条件

  当一个已保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。这意味着,一个进程已占有的资源会被暂时释放,或者说是被剥夺了,或从而破坏了不可剥夺条件。

  该策略实现起来比较复杂,释放已获得的资源可能造成前一阶段工作的失效,反复地申请和释放资源会增加系统开销,降低系统吞吐量。这种方法常用于状态易于保存和恢复的资源,如CPU的寄存器及内存资源,一般不能用于打印机之类的资源。

  3)破坏请求和保持条件

  釆用预先静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不把它投入运行。一旦投入运行后,这些资源就一直归它所有,也不再提出其他资源请求,这样就可以保证系统不会发生死锁。

  这种方式实现简单,但缺点也显而易见,系统资源被严重浪费,其中有些资源可能仅在运行初期或运行快结束时才使用,甚至根本不使用。而且还会导致“饥饿”现象,当由于个别资源长期被其他进程占用时,将致使等待该资源的进程迟迟不能开始运行。

  4)破坏循环等待条件

  为了破坏循环等待条件,可釆用顺序资源分配法。首先给系统中的资源编号,规定每个进程,必须按编号递增的顺序请求资源,同类资源一次申请完。也就是说,只要进程提出申请分配资源Ri,则该进程在以后的资源申请中,只能申请编号大于Ri的资源。

  这种方法存在的问题是,编号必须相对稳定,这就限制了新类型设备的增加;尽管在为资源编号时已考虑到大多数作业实际使用这些资源的顺序,但也经常会发生作业使甩资源的顺序与系统规定顺序不同的情况,造成资源的浪费;此外,这种按规定次序申请资源的方法,也必然会给用户的编程带来麻烦。

  死锁避免

  避免死锁同样是属于事先预防的策略,但并不是事先釆取某种限制措施破坏死锁的必要条件,而是在资源动态分配过程中,防止系统进入不安全状态,以避免发生死锁。这种方法所施加的限制条件较弱,可以获得较好的系统性能。

  1.系统安全状态

  避免死锁的方法中,允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,让进程等待。

  所谓安全状态,是指系统能按某种进程推进顺序(P1,P2,...,Pn),为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺序地完成。此时称P1,P2,...,Pn为安全序列。如果系统无法找到一个安全序列,则称系统处于不安全状态。

  假设系统中有三个进程P1、P2和P3,共有12台磁带机。进程P1总共需要10台磁带机,P2和P3分别需要4台和9台。假设在T0时刻,进程P1、P2和P3已分别获得5合、2台和2台,尚有3台未分配,见表2-15。

死锁的预防和避免_死锁的预防_操作系统_网络工程师_编程学习网教育

  则在T0时刻是安全的,因为存在一个安全序列P2、Pl、P3,即只要系统按此进程序列分配资源,则每个进程都能顺利完成。若在T0时刻后,系统分配1台磁带机给P3,则此时系统便进入不安全状态,因为此时已无法再找到一个安全序列。

  并非所有的不安全状态都是死锁状态,但当系统进入不安全状态后,便可能进入死锁状态;反之,只要系统处于安全状态,系统便可以避免进入死锁状态。

  2.银行家算法

  银行家算法是最著名的死锁避免算法。它提出的思想是:把操作系统看做是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。

  如何避免死锁

  1使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务;

  2设置死锁超时参数为合理范围,如:3分钟-10分种;超过时间,自动放弃本次操作,避免进程悬挂;

  3优化程序,检查并避免死锁现象出现;

  4.对所有的脚本和SP都要仔细测试,在正式版本之前。

  5所有的SP都要有错误处理(通过@error)

  6一般不要修改SQLSERVER事务的默认级别。不推荐强行加锁

  1)数据结构描述

  可利用资源矢量Available:含有m个元素的歎组,其中的每一个元素代表一类可用的资源数目。Available[j]=K,则表示系统中现有Rj类资源K个。

  最大需求矩阵Max:为n*m矩阵,定义了系统中n个进程中的每一个进程对m类资源的最大需求。Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。

  分配矩阵Allocation:为n*m矩阵,定义了系统中每一类资源当前已分配给每一进程的资源数。All0Cati0n[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。

  需求矩阵Need:为n*m矩阵,表示每个进程尚需的各类资源数。Need[i,j]=K,则表示进程i还需要Rj类资源的数目为K。

  上述三个矩阵间存在下述关系:

  Need[i,j]=Max[i,j]-Allocation[i,j]

  死锁的原因预防和避免

  一、构成死锁的必要条件是什么,如何检测死锁,解除死锁

  操作系统中的死锁被定义为系统中两个或者多个进程无限期

  地等待永远不会发生的条件,系统处于停滞状态,这就是死锁。

  产生死锁的原因主要是:

  (1)因为系统资源不足。

  (2)进程运行推进的顺序不合适。

  (3)资源分配不当等。

  如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则

  就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

  产生死锁的四个必要条件:

  (1)互斥条件:一个资源每次只能被一个进程使用。

  (2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

  (3)不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

  (4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

  这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

  死锁的解除与预防:

  理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源。因此,对资源的分配要给予合理的规划。

  3.银行家算法的思路:

  1),进程一开始向系统提出最大需求量.

  2),进程每次提出新的需求(分期贷款)都统计是否超出它事先提出的最大需求量.

  3),若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的剩余资源量,若不超出,则分配,否则等待.

  死锁避免的基本思想是:系统对进程发出每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配.这是一种保证系统不进入死锁状态的动态策略

  死锁避免和死锁预防的区别在于,死锁预防是设法至少破坏产生死锁的四个必要条件之一,严格的防止死锁的出现,而死锁避免则不那么严格的限制产生死锁的必要条件的存在,因为即使死锁的必要条件存在,也不一定发生死锁.死锁避免是在系统运行过程中注意避免死锁的最终发生.

  预防死锁

  该策略旨在创造条件预防死锁。对7.3节中讨论的Coffman4个条件的研究表明如果任一条件不满足,就不会出现死锁。Havender最先推荐使用这种策略。本小节将讨论实现该策略的方法以及实现中遇到的问题。

  1.互斥条件

  如果系统中的资源可以由多个进程共享,那么就永远不会发生死锁。然而,这种共享不切实际。例如,磁带机、绘图仪或打印机就不能在多个进程之间共享使用。这其中最好的情形就是对打印机使用假脱机技术,即所有打印请求都由一个单独的程序处理。这样可以消除共享请求。当假脱机程序占用打印机时,其他任何进程都不能发送打印机请求,也不能管理打印机。他们可以做的工作就是将数据提交给假脱机程序,以便以后打印。

  不幸的是,并非所有的设备都可以使用相同的技术。而且,死锁涉及的除外部I/O设备之外,还包括各种操作系统表、磁盘区和记录等大量资源。此外,不是所有资源都可以采用假脱机这样简单的应用程序进行处理。因此,很难保证避免该条件。

  2.等待条件

  禁止进程在已经占用某些资源时等待更多资源,这样可以预防死锁。

  这要求进程一开始就声明它期望使用的全部资源。操作系统会检查这些资源是否全部可用,只有可用的时候,才允许该进程开始执行。这种情况下,显然操作系统在分配完资源之后必须更新自己的空闲及可用资源链表。该解决方案很吸引人,但显而易见的是,它不能达到预期效果而且很浪费。如果进程为了更新某些文件需要用8个小时时间,而最后只使用磁带机一分钟以更新控制记录,在整个过程中磁带机都要分配给那个进程。因此,磁带机会空闲8个小时。这期间没有其他的进程可以使用该磁带机。

  可以采用该方法的另一种形式。操作系统必须让请求某些资源的进程先放弃已经占用的资源,然后再尝试请求所有要用的资源。如果尝试成功,被放弃的资源才可以重新分配给该进程,这样该进程才可以继续运行。如果失败,被放弃的资源恢复空闲,而进程则必须一直等到那些资源可用为止。每次检查后,进程都放弃已占用的资源,这样就永远不会出现死锁。

  该方案也存在很多问题。当进程放弃现有资源之后,也许会有其他一些进程长时间占用一个或多个资源。很容易想象,该策略会导致长时间的延迟、无限期的推迟以及其他不可预测的问题。同样地,这种技术可用于表、信号量等共享资源,但不适用于打印机和磁带机这类资源。想象一下,某个进程在打印到一半的时候放弃使用打印机,而某个其他进程占用该打印机将产生什么样的后果。

  2)银行家算法描述

  设Requesti是进程Pi的请求矢量,如果Requesti[j]K,表示进程Pi需要Rj类资源K个。当Pi发出资源请求后,系统按下述步骤进行检查:

  ①如果Requesti[j]<=Need[i,j],便转向步骤②;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。

  ②如果Requesti[j]<=Available[j],便转向步骤③;否则,表示尚无足够资源,Pi须等待。

  ③系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:

  Available[j]=Available[j]-Requesti[j];

  Allocation[i,j]=Allocation[i,j]+Requesti[j];

  Need[i,j]=Need[i,j]-Requesti[j];

  ④系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。

  3)安全性算法

  ①设置两个矢量。工作矢量Work;它表示系统可提供给进程继续运行所需的各类资源数目,它含有所个元素,在执行安全算法开始时,Work=Available;Finish:它表示系统是否有足够的资源分配给进程,使之运行完成。开始时Finish[i]=false;当有足够资源分配给进程Pi时,再令Finish[i]=true。

  ②从进程集合中找到一个能满足下述条件的进程:Finish[i]=false;Need[i,j]<=Work[j];若找到,执行下一步骤,否则,执行步骤4。

  ③当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:

  Work[j]=Work[j]+Allocation[i,j];

  Finish[i]=true;

  gotostep<2>;

  ④如果所有进程的Finish[i]=tme都满足,则表示系统处于安全状态;否则,系统处于不安全状态。

  3.银行家算法举例

  假定系统中有5个进程{P0,P1,P2,P3,P4}和三类资源{A,B,C},各种资源的数量分别为10、5、7,在T0时刻的资源分配情况见表2-16。

  1)T0时刻的安全性。

  利用安全性算法对T0时刻的资源分配进行分析,由表2-17可知,在T0时刻存在着一个安全序列{P1,P3,P4,P2,P0},故系统是安全的。

利用安全性算法对T0时刻的资源分配进行分析,由表2-17可知,在T0时刻存在着一个安全序列{P1,P3,P4,P2,P0},故系统是安全的

利用安全性算法对T0时刻的资源分配进行分析,由表2-17可知,在T0时刻存在着一个安全序列{P1,P3,P4,P2,P0},故系统是安全的

  2)P1请求资源

  P1发出请求矢量Request1(l,,0,2),系统按银行家算法进行检查:

  Request1(1,0,2)<=Need1(l,2,2)。

  Request1(1,0,2)<=Available1(3,3,2)。

  系统先假定可为P1分配资源,并修改Available、Allocation1和Need1矢量,由此形成的资源变化情况见表2-18。

  再利用安全性算法检查此时系统是否安全。

系统先假定可为P1分配资源,并修改Available、Allocation1和Need1矢量,由此形成的资源变化情况见表2-18

  3)P4请求资源

  P4发出请求矢量Request4(3,3,0),系统按银行家算法进行检查:

  Request4(3,3,0)<=Need4(4,3,1)。

  Request4(3,3,0)>Available(2,3,0),让P4等待。

  4)P0请求资源

  P0发出请求矢量Request0(0,2,0),系统按银行家算法进行检查:

  Request0(0,2,0)<=Need0(7,4,3)。

  Request0(0,2,0)<=Available(2,3,0)。

  系统暂时先假定可为P0分配资源,并修改有关数据,见表2-19。

系统暂时先假定可为P0分配资源,并修改有关数据,见表2-19

  5)进行安全性检测

  可用资源Available(2,1,0)已不能满足任何进程的需要,故系统进入不安全状态,此时系统不分配资源。

      结束语:文章结束了,各位小伙伴们学会了怎么预防和避免死锁了吗?如果有什么地方不懂或者有疑问,可以到编程学习网提问,还想学习更多关于这方面知识随时可以登陆编程学习网哟~ 我随时在等着你。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-考试认证-考试信息-考试报考
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯