死锁的产生,预防,避免,解除

死锁

1、什么是死锁?

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去

2、死锁的产生

死锁通常源于多个进车鞥对于资源的抢夺,不仅对不可抢占资源进行争夺时会产生死锁,而且对可消耗性资源进行抢夺时,也会引起死锁

2.1、竞争不可抢占资源引起死锁

现在有A,B两个进程并发执行;每个进程都需要消耗甲,乙两种资源(甲,乙为不可抢占资源),则会产生下面几种情况:

  1. 一方先获得所有资源

    • 进程A先获得了甲资源,又获得了乙资源 则进程B由于没有可分配资源而进入了阻塞,待进程A执行完后,进程B将由阻塞态变为就绪态,这种情况下将不会产生死锁
    • 或者进程B先获得了甲资源,又获得了乙资源,进程A进入阻塞,同样能一直运行下去,也不会产生死锁现象
  2. 一方获得一半的资源

    • 进程A先获得甲资源,进程B获得了乙资源,此时,进程A想要获得乙资源,进程B想要获得甲资源,由于此时甲,乙资源都被占有,将会进入阻塞状态,进程A,B都希望对方释放自己的资源,而导致谁也无法运行,陷入僵持状态,形成死锁

2.2、竞争可消耗资源引起死锁

现在有A,B,C三个进程并发执行;甲,乙,丙为三种可消耗资源
进程A能消耗甲资源,也能产生乙资源
进程B能消耗乙资源,也能产生丙资源
进程C能消耗乙资源,也能产生甲资源

  1. 如果进程A,B,C都先产生资源,然后再消耗资源,则能正常运行

  2. 进程A,B,C都同时先消耗资源,则每一个进程都需要其他进程产生资源,将永远地阻塞下去,进入僵持状态,产生死锁

2.3、进程推进顺序不当引起死锁

现在有A,B两个进程;甲,乙两种资源,进程A,B都接收甲乙两种资源,并释放,才算是完成了整个流程。

  1. 合法的顺序
    进程A请求甲资源——>进程A请求乙资源——>进程A释放甲资源——>进程A释放乙资源——>进程B请求乙资源——>进程B请求甲资源——>进程B释放乙资源——>进程B释放甲资源
  2. 不合法的顺序
    进程A请求甲资源——>进程B请求乙资源,此时系统便处于了一种不安全状态,继续向前推荐,就可能发生死锁。

3、死锁的必要条件,以及预防

3.1、死锁的必要条件

产生死锁必须同时达到四个必要条件,只要其中一个不成立,死锁就不会发生。

  • 1. 互斥:在一段时间内,某资源只能被一个进程占用,如果有其他进程请求该资源,该进程只能等待占有该资源的进程释放该资源。

  • 2. 请求和保持: 一个进程已经有了一个资源,还想要新的的资源,新的资源被其他人占有,该进程阻塞,但对自己获得的资源保持不放。

  • 3. 不可抢占条件:进程获得的资源在未使用之前不能被抢占,只能进程自己释放

  • 4. 循环等待:各个进程都在的等待其它进程所占有的资源

3.2、死锁的预防

死锁的预防是破坏产生死锁的必要条件中的一个。互斥是非共享设备必须的,不能进行破坏。
1. 破坏“请求和保持”条件

  1. 第一协议:所有进程在运行之前,一次性地申请整个运行过程中的所需的所有资源

    • 优点:简单,易行,且安全
    • 缺点:1、资源被严重浪费;2、进程延迟运行(饥饿现象)
  2. 第二协议:一个进程只获得运行初期所需的资源后,开始运行,运行中,释放已分配的,且已用毕的资源,请求新的资源。

2、破坏“不可抢占”条件
当一个进程提出了新的资源的请求而不被满足时,释放自己已经保持的所有资源

  • 实现复杂;使进程前后两次运行的信息不连续;反复地申请和释放资源导致进程被无限地拖迟。

3、破坏“循环等待”条件
对系统所有资源进行线性排序,规定每个进程必须按序号递增的顺序请求资源。

4、死锁的避免(银行家算法)

在资源的动态过程中,用某种方法防治系统进入不安全状态,从而避免死锁

银行家算法思路实现(死锁避免)

5、死锁的解除

  • 抢占资源
  • 终止(撤销)进程
  • 利用回滚恢复

猜你喜欢

转载自blog.csdn.net/qq_43532386/article/details/113102299
今日推荐