死锁 原因、必要条件及解决方法的分析

定义

简单的理解:程序当中有一个执行流没有释放资源,导致其他执行流(线程)无法获取锁的情况即死锁

举例来说:死锁是由于两个或以上的线程互相持有对方需要的资源,导致这些线程处于等待状态,无法执行,我们将线程任务定为写字,写字需要的纸和笔为当前进程所需要获取的资源,线程 A 获得了纸,线程 B 获得了笔,但线程 A 依旧申请笔资源,线程 B 申请纸资源,纸笔都被锁死,即全部阻塞,这种情况就是死锁

必要条件

1.互斥条件:线程对资源的占有是排他性的,一个资源只能被一个线程占有,直到释放

2.请求和保持条件:一个线程对请求被占有资源发生阻塞时,对已经获得的资源不释放

3.不可剥夺:一个线程在释放资源之前,其他的线程无法剥夺占用

4.循环等待:若干个执行流请求资源的情况形成了一个闭环,发生死锁时,线程进入死循环,永久阻塞

原因

1.竞争不可抢占性资源

线程 A 已经获得资源 1,还想去获得资源 2,进程 B 已经获得资源 2,想去获得资源 1,但是1和 2 都是不可抢占的,发生死锁

2.竞争可消耗资源引起死锁

进程间通信,如果顺序不当,会产生死锁,比如线程 A 发消息 m1 给线程 B,接收 线程 C 的消息 m3 ,线程 B 接收线程 A 的 m1,发m2 给线程 C,以此类推,如果进程之间是先发信息的那么可以完成通信,但是如果是先发信息就会产生死锁

3.进程推进顺序不当

进程在运行过程中,请求和释放资源的顺序不当,也同样会导致产生进程死锁

避免方法

破坏必要条件

1.破坏“请求和保持”条件
资源一次性分配,避免锁未释放的场景
方法一:让进程在申请资源时,一次性申请所有需要用到的资源,当申请的资源有一些没空,那就让线程等待,这个方法比较浪费资源,进程可能经常处于饥饿状态
方法二:要求进程在申请资源前,要释放自己拥有的资源

2.破坏“不可抢占”条件
允许进程进行抢占
方法一:如果去抢资源,被拒绝,就释放自己的资源
方法二:设置优先级,操作系统允许抢,只要优先级大,可以抢到

3.破坏“循环等待”条件
加锁顺序一致
将系统中的所有资源统一编号,进程可在任何时刻提出资源申请,但所有申请必须按照资源的编号顺序(升序)提出

解决方法

  1. 给死锁线程分配足够多的资源
  2. 终止系统中的一个或多个死锁进程,直至打破循环环路,使系统从死锁状态解脱出来
发布了50 篇原创文章 · 获赞 112 · 访问量 5330

猜你喜欢

转载自blog.csdn.net/qq_44759710/article/details/104475579