操作系统原理第七章 死锁

本科生操作系统原理学习记录
学习记录全家桶


死锁是发生在多个进程之间的现象,没有外力的话,死锁不可能解除。

死锁产生的原因:

  • 竞争互斥资源
  • 进程推进不当

7.1 死锁的特征

死锁的必要条件:

  • 互斥:一次只有一个进程可以使用一个资源

  • 占有并等待:一个至少持有一个资源的进程等待获得额外的由其他进程所持有的资源

  • 非抢占:资源不能被抢占,即资源只有在持有它的进程完成任务后自动释放

  • 循环等待:一组等待资源的进程之间存在循环等待现象

有环有死锁资源分配图:

没有环肯定没有死锁

如果有环:

  • 如果每一种资源类型只有一个实例,那么死锁发生
  • 如果一种资源类型有多个实例,可能死锁

7.2 处理死锁的方法

确保系统永远不会进入死锁状态

  • 死锁预防

  • 死锁避免

允许系统进入死锁状态,然后检测它,并加以恢复

  • 死锁检测
  • 死锁恢复

忽略这个问题,假装系统中从未出现过死锁。

  • 由开发人员自行处理死锁

7.3 死锁预防

死锁预防可以确保死锁不会发生

死锁预防是一组方法,确保至少一个必要

共享资源,不涉及死锁

非共享资源(互斥资源),必须要有互斥条件

现在操作系统中的虚拟化技术,将互斥资源改为共享资源

互斥:如果系统存在互斥资源,不能改变这个条件的互斥

占有并等待

静态资源分配策略

要求进程在执行前一次性申请全部的资源,只有没有占有资源时才可以分配资源

利用率低,可能出现饥饿

非抢占

  • 如果一个进程的申请没有实现,它要释放所有占有的资源

  • 先占的资源放入进程等待资源列表中

  • 进程在重新得到旧的资源的时候可以重新开始

代价也很大

循环等待

7.4 死锁避免

只要找出一个就可以说明安全

银行家算法的实例:判断系统是否安全

t0时刻是否安全

7.5 死锁检测和恢复

7.5.1 如何检测死锁

分配资源任意分配,不做任何检测,但是要在某个时间段,检测是否有死锁存在系统之中。

7.5.2 恢复策略

找到死锁,你要有策略去恢复这个死锁。这里的恢复是用最小代价来终止,(如找到关键进程)

慕课单元作业

1、‍某系统有同类资源m个,供n个进程共享。如果每个进程最多申请x个资源(其中1<=x<=m),请证明:当n(x-1)+1<=m时,系统不会发生死锁。

由于每个进程的最大需要申请资源个数为 X ,在最坏的情况下,每个进程都申请了 (X-1)个资源,并且都需要申请最后一个资源,系统剩余的资源个数为 m - n(x-1) ,这个时候如果系统剩余的资源个数大于等于 1 ,那么这个资源就可以被其中一个进程使用。当这个进程使用完毕之后归还所有资源,这样其他的进程也都能得到满足,从而使整个系统不会发生死锁状态。所以 m - n(x-1) >= 1,即 x <= (m+n-1)/n时,系统不会发生死锁。

2、什么是死锁?产生死锁的原因是什么?

‍死锁:在多道程序环境下,一组处于等待状态的进程,其中每一个进程都持有资源,并且等待着这组中其他进程所持有的资源,那么该组进程有可能再也无法改变其状态,这种情况下称为死锁。

原因:竞争互斥资源

​ 进程推进不当

3、假设一个系统有m个相同类型的资源被n个进程共享,进程每次只请求或释放一个资源。试证明只要符合下面两个条件,系统就不会发生死锁。

‌a. 每个进程需要资源的最大值在1~m之间。

‌b. 所有进程需要资源的最大值的和小于m+n

  1. 假设max(i)表示第i个进程的最大资源需求量,need(i)表示第i个进程还需要的资源量,alloc(i)表示第i个进程已分配的资源量。
  2. 根据题中条件可知: max(1)+…+max(n)=need(1)+…+need(n)+alloc(1)+…+alloc(n) < m+n说明如果这时系统发生死锁,那么这m个资源应该全部分配出去,即: alloc(1)+…+alloc(n) = m
  3. 另外,系统中所有进程将陷入无限等待状态。由上述两式可知,need(1)+…+need(n) < n。
  4. 这表示n个进程还需要的资源量之和小于n,意味着此刻至少存在一个进程i,need(i)=0,即它已获得了所需要的全部资源。那么它就能执行完成并释放它占有的资源,这与前面的假设矛盾。从而证明在这个系统中不可能发生死锁。

4、考虑一个系统在某一时刻的状态:

‎ Allocation Max Available

‎ A B C D A B C D A B C D

P0 0 0 1 2 0 0 1 2 1 5 2 0

P1 1 0 0 0 1 7 5 0

P2 1 3 5 4 2 3 5 6

P3 0 6 3 2 0 6 5 2

P4 0 0 1 4 0 6 5 6

‎使用银行家算法回答下列问题:

‎a. Need矩阵的内容是怎样的?

Need = Max - Allocation

​ A B C D

P0 0 0 0 0

P1 0 7 5 0

P2 1 0 0 2

P3 0 0 3 0

P4 0 6 4 2

‎b. 系统是否处于安全状态?

由Need矩阵可知,P0进程的需求已经得到满足,此时它的资源可以释放,则Available更新为

(1,5,2,0)+ (0,0,1,2)= (1,5,3,2)。所以接着P2和P3也能得到满足并释放资源,此时Available更新为

(1,5,3,2) + (1,0,02) + (0,0,3,0) = (2,5,6,4),但是接下来的P1和P4都无法满足最大需求,所以系统此时处于不安全的状态。

‎c. 如果从进程P1发来一个请求(0, 4, 2, 0),这个请求能否立刻被满足?

假设P1发来请求(0, 4, 2, 0),符合Need[1]的需求和Available的大小,则试着修改Need中P1的内容

为 (0,3,3,0),Available修改为(1,1,0,0)。此时运用银行家算法检测是否有安全序列,Available加上P0进程释放的资源变为(1,1,1,2),比较之后仍然不能满足所有需求,所以从进程P1发来的一个请求(0,4,2,0)不能立刻满足。

猜你喜欢

转载自blog.csdn.net/weixin_45788387/article/details/122323226