第二章.6节 死锁

版权声明:就是开个版权玩一下 https://blog.csdn.net/qq_41997479/article/details/86321684

(PS:个人课下整理的操作系统笔记,OneNote直接拷贝过来的,图片看不了就将就一下,配合张伟老师的PPT看效果更好)

一、死锁状态

一组进程每个进程都在等待一个事件,而该事件只能由同组进程的另一个进程所引起,那么这组进程就处于死锁状态

 

二、系统模式(System model)

1.系统有一定数量的资源,分布在若干进程之间。资源有多种类型(CPU周期,IO设备,内存空间),每类资源有相同数量的实例

2.进程使用资源按  申请——使用——释放  顺序

 

三、死锁特征

1.死锁发生的四个必要条件:互斥(mutual exclusion),占有并等待(hold and wait),非抢占(no preemption)、循环等待(circular wait),四个条件同时满足才死锁

2.资源分配图:节点结合(进程结点集和资源类别结点集)+边集合(申请边和分配边)

  • 如果图没有环,一定没有死锁,有环可能会有死锁
  • 如果每类资源只有一个实例,有环一定死锁
  • 如果每类资源有多个实例,有环可能死锁
  • 死锁一定有环,有环不一定死锁(看每类资源的实例个数情况而定)

 

四、处理死锁的方法

有3种方式可以处理死锁

  1. 确保系统不会进入死锁状态
    1. 死锁预防(deadlock prevention)
      • 从死锁发生的四个必要条件去预防,打破其中一个条件不满足即可
        1. 互斥:非共享资源必须要互斥条件
        2. 占有并等待:每个进程只能占有一个资源
          1. 一次性申请完所有资源
          2. 手里没有资源才能申请资源
          • 以上两种方法缺点是资源利用率低,容易发生饥饿
        3. 非抢占:如果一个进程占有资源并去申请一个立即分配的资源,那么该进程的所有资源都可以被抢占
        4. 循环等待:对所有资源进行排序(为每一个资源分配一个号),要求每个进程按递增顺序来申请资源(升序申请,即进程先申请序号高的资源)
      • 对于死锁的四个条件中,互斥和非抢占由进程本身的性质决定的,不允许进程同时共享和抢占,因此只能从另外两个条件去打破,则有了静态资源分配法(避免使不满足占有并等待)和有序资源分配法(避免使不满足循环等待
    2. 死锁避免(deadlock avoidance)
      • 安全状态(safe state):如果系统能按某个顺序为每个进程分配资源并且不会引起死锁,那么系统状态就是安全的。
      • 如果系统没有处于安全状态,则可能会引起死锁
      • 为什么引入安全状态?开始系统处于安全状态,当一个进程要申请资源时,系统必须确定这一资源是可以立即分配还是等待,如果分配该资源后,系统仍然处于安全状态,才允许申请。
      • 死锁避免算法:
        1. 资源分配图法(RAG)——每类资源一个实例时

  1. 银行家算法(BA)——每类资源多个实例时
  • 数据结构:

 

  • 实例操作:

P0的max:我一开始告诉操作系统需要ABC各多少个

  1. 算need矩阵=max-allocation矩阵
  2. 安全检测算法,看谁的need<available,小于就分配给Pi,
  3. 新的available=旧的+Pi的allocation
  • 如果有一个进程的request来了,先看是否<need,再看是否<allocation,如果都满足则假装分配,看最后能不能得出一个安全序列
  1. 允许系统的死锁,能够检测并恢复
    1. 死锁检测(deadlock detection)
      • 等待图(wait-for graph)——RAG图的变种(每个资源只有一个实例时)
      • 当等待图中出现一个环,则出现死锁
      • 类似于银行家算法的死锁检测(每个资源多个实例时)
      • 何时调用死锁检测算法?取决于死锁发生的频率和死锁进程的数量,解决方法比如一个小时检测一次
    2. 死锁恢复(deadlock recovery)
      • 终止一个或多个进程以打破循环等待
      • 从一个或多个死锁进程那抢占资源
  2. 忽视死锁问题,认为死锁不会发生——重启

猜你喜欢

转载自blog.csdn.net/qq_41997479/article/details/86321684