文章目录
死锁
1、什么是死锁?
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去
2、死锁的产生
死锁通常源于多个进车鞥对于资源的抢夺,不仅对不可抢占资源进行争夺时会产生死锁,而且对可消耗性资源进行抢夺时,也会引起死锁
2.1、竞争不可抢占资源引起死锁
现在有A,B两个进程并发执行;每个进程都需要消耗甲,乙两种资源(甲,乙为不可抢占资源),则会产生下面几种情况:
-
一方先获得所有资源
- 进程A先获得了甲资源,又获得了乙资源 则进程B由于没有可分配资源而进入了阻塞,待进程A执行完后,进程B将由阻塞态变为就绪态,这种情况下将不会产生死锁
- 或者进程B先获得了甲资源,又获得了乙资源,进程A进入阻塞,同样能一直运行下去,也不会产生死锁现象
-
一方获得一半的资源
- 进程A先获得甲资源,进程B获得了乙资源,此时,进程A想要获得乙资源,进程B想要获得甲资源,由于此时甲,乙资源都被占有,将会进入阻塞状态,进程A,B都希望对方释放自己的资源,而导致谁也无法运行,陷入僵持状态,形成死锁
2.2、竞争可消耗资源引起死锁
现在有A,B,C三个进程并发执行;甲,乙,丙为三种可消耗资源
进程A能消耗甲资源,也能产生乙资源
进程B能消耗乙资源,也能产生丙资源
进程C能消耗乙资源,也能产生甲资源
-
如果进程A,B,C都先产生资源,然后再消耗资源,则能正常运行
-
进程A,B,C都同时先消耗资源,则每一个进程都需要其他进程产生资源,将永远地阻塞下去,进入僵持状态,产生死锁
2.3、进程推进顺序不当引起死锁
现在有A,B两个进程;甲,乙两种资源,进程A,B都接收甲乙两种资源,并释放,才算是完成了整个流程。
- 合法的顺序
进程A请求甲资源——>进程A请求乙资源——>进程A释放甲资源——>进程A释放乙资源——>进程B请求乙资源——>进程B请求甲资源——>进程B释放乙资源——>进程B释放甲资源 - 不合法的顺序
进程A请求甲资源——>进程B请求乙资源,此时系统便处于了一种不安全状态,继续向前推荐,就可能发生死锁。
3、死锁的必要条件,以及预防
3.1、死锁的必要条件
产生死锁必须同时达到四个必要条件,只要其中一个不成立,死锁就不会发生。
-
1. 互斥:在一段时间内,某资源只能被一个进程占用,如果有其他进程请求该资源,该进程只能等待占有该资源的进程释放该资源。
-
2. 请求和保持: 一个进程已经有了一个资源,还想要新的的资源,新的资源被其他人占有,该进程阻塞,但对自己获得的资源保持不放。
-
3. 不可抢占条件:进程获得的资源在未使用之前不能被抢占,只能进程自己释放
-
4. 循环等待:各个进程都在的等待其它进程所占有的资源
3.2、死锁的预防
死锁的预防是破坏产生死锁的必要条件中的一个。互斥是非共享设备必须的,不能进行破坏。
1. 破坏“请求和保持”条件
-
第一协议:所有进程在运行之前,一次性地申请整个运行过程中的所需的所有资源
- 优点:简单,易行,且安全
- 缺点:1、资源被严重浪费;2、进程延迟运行(饥饿现象)
-
第二协议:一个进程只获得运行初期所需的资源后,开始运行,运行中,释放已分配的,且已用毕的资源,请求新的资源。
2、破坏“不可抢占”条件
当一个进程提出了新的资源的请求而不被满足时,释放自己已经保持的所有资源
- 实现复杂;使进程前后两次运行的信息不连续;反复地申请和释放资源导致进程被无限地拖迟。
3、破坏“循环等待”条件
对系统所有资源进行线性排序,规定每个进程必须按序号递增的顺序请求资源。
4、死锁的避免(银行家算法)
在资源的动态过程中,用某种方法防治系统进入不安全状态,从而避免死锁
5、死锁的解除
- 抢占资源
- 终止(撤销)进程
- 利用回滚恢复