死锁的产生条件和预防处理[通俗易懂]

死锁的产生条件和预防处理

大家好,又见面了,我是全栈君。

       所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象。若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。因为资源占用是相互排斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续执行。这就产生了一种特殊现象死锁。


       尽管进程在执行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备下面四个必要条件

1)相互排斥条件:

       指进程对所分配到的资源进行排它性使用,即在一段时间内某资源仅仅由一个进程占用。假设此时还有其他进程请求资源,则请求者仅仅能等待,直至占有资源的进程用毕释放。

2)请求和保持条件:

       指进程已经保持至少一个资源。但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程堵塞,但又对自己已获得的其他资源保持不放。

3)不剥夺条件:

      指进程已获得的资源,在未使用完之前,不能被剥夺,仅仅能在使用完时由自己释放。

4)环路等待条件:

      指在发生死锁时,必定存在一个进程——资源的环形链。即进程集合{P0P1P2···Pn}中的P0正在等待一个P1占用的资源。P1正在等待P2占用的资源。……Pn正在等待已被P0占用的资源。


在系统中已经出现死锁后,应该及时检測到死锁的发生,并採取适当的措施来解除死锁。眼下处理死锁的方法可归结为下面四种:

1) 预防死锁。

  这是一种较简单和直观的事先预防的方法。

方法是通过设置某些限制条件。去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。可是因为所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量减少。

2) 避免死锁。

  该方法相同是属于事先预防的策略。但它并不须事先採取各种限制措施去破坏产生死锁的的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。

3)检測死锁。

  这样的方法并不须事先採取不论什么限制性措施。也不必检查系统是否已经进入不安全区,此方法同意系统在执行过程中发生死锁。

但可通过系统所设置的检測机构,及时地检測出死锁的发生,并精确地确定与死锁有关的进程和资源。然后採取适当措施,从系统中将已发生的死锁清除掉。

4)解除死锁。

  这是与检測死锁相配套的一种措施。当检測到系统中已发生死锁时。须将进程从死锁状态中解脱出来。

经常使用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于堵塞状态的进程。使之转为就绪状态,以继续执行。

死锁的检測和解除措施,有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116453.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python 贪吃蛇小游戏代码

    python 贪吃蛇小游戏代码#!/usr/bin/python#-*-coding:UTF-8-*-#作者:黄哥#链接:https://www.zhihu.com/question/55873159/answer/146647646#来源:知乎#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。importrandomimportpygameimportsysfromp

    2022年6月28日
    28
  • 【spring-kafka】@KafkaListener详解与使用

    【spring-kafka】@KafkaListener详解与使用说明从2.2.4版开始,您可以直接在注释上指定Kafka使用者属性,这些属性将覆盖在使用者工厂中配置的具有相同名称的所有属性。您不能通过这种方式指定group.id和client.id属性。他们将被忽略;可以使用#{…​}或属性占位符(${…​})在SpEL上配置注释上的大多数属性。比如:@KafkaListener(id=”consumer-id”,topics=”SHI_TOPIC1″,concurrency=”${listen.concurrency:3}”,

    2022年10月14日
    2
  • 第三章:activiti流程工具使用和学生请假流程实例

    第三章:activiti流程工具使用和学生请假流程实例第三章:activiti流程工具使用和学生请假流程实例

    2022年4月23日
    57
  • 并行计算简介_并行计算实验报告

    并行计算简介_并行计算实验报告1什么是并行计算?串行计算: 传统的软件通常被设计成为串行计算模式,具有如下特点:一个问题被分解成为一系列离散的指令;这些指令被顺次执行;所有指令均在一个处理器上被执行;一个问题

    2022年8月2日
    6
  • js代码中实现页面跳转的几种方式[通俗易懂]

    js代码中实现页面跳转的几种方式[通俗易懂]js代码中实现页面跳转的几种方式注:jquery的$.get(),$.post(),$.ajax()都不会使页面发送跳转,因为其本质都是ajax请求。第一种:window.location.href=”login.jsp?backurl=”+window.location.href;页面跳转最常用的是使用window.location.href=””;这个既可以

    2022年8月13日
    22
  • 计算机专业选Java和Python哪个前景好点?[通俗易懂]

    计算机专业选Java和Python哪个前景好点?[通俗易懂]对于学习计算机专业的小伙伴,面对大二选课,开始陷入Java和python的纠结中,从以后的发展来看,这两个编程语言肯定是要通吃的,但前期的学习,可以有一个侧重点,说一下我自己的观点。应很多小伙伴的要求,我们从就业应用前景和学习难易度来分析一下:一、Java1、就业应用前景从目前的招聘量上来看,Java在编程语言中可以说是常胜将军,经常有各种新出的编程语言向它发起挑战,但是Jav…

    2022年7月8日
    21

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号