美文网首页
死锁的条件,如何解决

死锁的条件,如何解决

作者: 尘埃里的玄 | 来源:发表于2021-10-09 16:44 被阅读0次

死锁的概念

1、死锁的概念:死锁是指两个或两个以上的进程或线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法向前推进。这些永远在互相等待的进程称为死锁进程.

我们举个例子:在笑傲江湖中,岳不群拿着武功秘籍《辟邪剑谱》,任我行拿着武功秘籍《吸心大法》,此时岳不群想要修炼《吸心大法》,而任我行却想修炼《辟邪剑谱》,但是他们都不想交换,此时他们只能修炼自己的武功秘籍了


image.png

死锁产生的条件

1、互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。
2、占有且等待:一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。
3、不可抢占:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。
4、循环等待:存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。
当以上四个条件均满足,必然会造成死锁,发生死锁的进程无法进行下去,它们所持有的资源也无法释放。

解决死锁的方法

一、破坏“占有且等待”条件
方法1:所有的进程在开始运行之前,必须一次性地申请其在整个运行过程中所需要的全部资源。
优点:简单易实施且安全。
缺点:因为某项资源不满足,进程无法启动,而其他已经满足了的资源也不会得到利用,严重降低了资源的利用率,造成资源浪费。使进程经常发生饥饿现象。

方法2:该方法是对第一种方法的改进,允许进程只获得运行初期需要的资源,便开始运行,在运行过程中逐步释放掉分配到的已经使用完毕的资源,然后再去请求新的资源。这样的话,资源的利用率会得到提高,也会减少进程的饥饿问题。

二、破坏“不可抢占”条件
当一个已经持有了一些资源的进程在提出新的资源请求没有得到满足时,它必须释放已经保持的所有资源,待以后需要使用的时候再重新申请。这就意味着进程已占有的资源会被短暂地释放或者说是被抢占了。该种方法实现起来比较复杂,且代价也比较大。释放已经保持的资源很有可能会导致进程之前的工作实效等,反复的申请和释放资源会导致进程的执行被无限的推迟,这不仅会延长进程的周转周期,还会影响系统的吞吐量。

三、破坏“循环等待”条件
可以通过定义资源类型的线性顺序来预防,可将每个资源编号,当一个进程占有编号为i的资源时,那么它下一次申请资源只能申请编号大于i的资源。

相关文章

  • 死锁的条件,如何解决

    死锁的概念 1、死锁的概念:死锁是指两个或两个以上的进程或线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一...

  • 解决死锁的4种基本方法(值得收藏)

    解决死锁的4种基本方法(文末有惊喜) 1、预防死锁:通过设置一些限制条件,去破坏产生死锁的必要条件 2、避免死锁:...

  • mysql 死锁排查

    一、show ENGINE INNODB status查看死锁位置,分析。 二、首先解决死锁可以从死锁发生的条件入...

  • 面试整理2

    请问死锁原因如何打破?如何查看死锁进程状态?回答死锁的四个条件没回答完,但是我觉得不必要背住这四个条件1、死锁是指...

  • java并发--java死锁

    本篇结构: 前言 什么是死锁 产生死锁的必要条件 死锁的代码示例 死锁排查 如何避免死锁 总结 一、前言 今天被问...

  • Linux多线程服务端编程笔记 第二章

    本文解决如下问题: 使用锁时要注意哪些问题。 死锁常见的两个例子以及如何避免死锁的两个简单方法。 条件变量的使用注...

  • Java死锁

    什么是死锁 死锁检测 产生死锁的四个必要条件 如何避免死锁 死锁 死锁,指两个或多个线程之间,由于互相持有对方需要...

  • jstack命令:教你如何排查多线程问题

    这是之前的一个死锁案例: 一个多线程死锁案例,如何避免及解决死锁问题? 如程序中发生这样的死锁问题该如何排查呢?我...

  • 线程死锁,死锁条件,如何避免死锁

    死锁:有两个或两个以上线程相互持有对方所需要的资源,而使得这些线程无法往下执行下去。在Java中程序执行进入对象的...

  • 死锁

    死锁四个条件: 死锁例子: 解读上述代码: 1.synchronized 就是满足死锁条件----互斥条件----...

网友评论

      本文标题:死锁的条件,如何解决

      本文链接:https://www.haomeiwen.com/subject/fniqoltx.html