操作系统(10)进程--死锁概念;死锁处理方法:死锁预防、死锁避免、银行家算法、死锁检测

版权声明:版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/lililuni/article/details/83794902

1. 死锁概念

死锁是指:由于竞争资源或者通信关系,两个或更多线程在执行中出现,永远相互等待只能由其他进程引发的事件。

  1. 死锁示例
    ==1==
  2. 进程访问资源的流程
    在系统里,存在各种类型的资源R1,R2,…,Rm:比方说CPU执行时间、内存空间、I/O设备等。
    ==2==
  3. 资源分类
    ==3==
  4. 资源分配有向图
    描述资源和进程之间的分配和占用关系
    ==4==
  5. 出现死锁的必要条件
    下图4个条件都成立则可能出现死锁
    =5==

2. 死锁处理方法

==6==

1. 死锁预防

死锁预防是指采用某种策略,限制并发进程对资源的请求,使系统在任何时刻都不满足死锁的必要条件。也就是说上节中的四个必要条件,有任何一个不满足就可以。办法有:

互斥:把互斥的共享资源封装成可同时访问
持有并等待:进程请求资源时,要求它不占有任何其他资源,也就是它必须一次性申请到所有资源,这种方法会导致资源效率低。
非抢占:如进程不能立即分配资源,则释放已占有的资源。也就是只在能够同时获得所有需要资源时,才执行分配操作
循环等待:对资源进行排序,要求进程按顺序请求资源

==7==


2. 死锁避免

利用额外的先验信息,在分配资源时,判断是否会出现死锁,只在不会死锁时分配资源。
==8==

  1. 系统资源分配的安全状态
    ==9==
  2. 安全状态与死锁的关系
    ==10==

3. 银行家算法

  1. 背景
    银行家算法是实现死锁避免的一种方法,它的背景如下图
    ==11==

  2. 数据结构(需要维护的信息)
    ==12==

  3. 安全状态判断算法
    把现在可用的资源复制到work中,作为当前进行判断的场所,在这个情况下,去判断现有的这些资源是否能满足当前所有进程的总的需求,能满足,则说明是安全的。
    ==13==

  4. 算法详细步骤
    ==14==


  1. 算法实例
    假设初始状态如下图:
    在这里插入图片描述
    示例1:在上图的初始状态,如果T2请求R1和R3各一个资源,这个操作会允许么

    因为在上图中,request[2][1](1)<Need[2][1](1), request[2][3](1)<Need[2][3](2),就可以转到银行家算法的第2步,然后request[2][1]<work[1],request[2][3]<work[3]就进入银行家算法的第3步,然后进入下图状态
    ==15==

    在上图,依据安全状态判断算法第二步的寻找线程,Need[2][3]<=work[3],分配一个R3资源给T2,这样T2就可以正常执行完,然后将它的资源回收,进入下图

    ==16==

    在上图中,会发现任何一个Need[i][j]<=work[j],假设将资源分配给T1,然后执行完T1,再回收资源,进入下图

    ==17==

    然后按照安全判断算法执行下去就发现此时的系统状态是安全的。

    所以T2请求R1和R3各一个资源这个操作会允许。

    示例2:在上图的初始状态,如果T1请求R1和R3各一个资源,这个操作会允许么

    因为在上图中,request[1][1](1)<Need[1][1](1), request[1][3](1)<Need[1][3](2),就可以转到银行家算法的第2步,然后request[1][1]<work[1],request[1][3]<work[3]就进入银行家算法的第3步,然后进入下图状态

    ==19==

    依据安全判断算法,会发现四个线程的Need[i]>work,直接跳到第4步,判定系统不安全,也就是不允许这个操作


4. 死锁检测

  1. 死锁检测概念
    不同于前面的死锁预防和死锁避免,死锁检测允许系统进入死锁状态,它所做的工作如下图
    ==20==
  2. 死锁检测算法
    • 数据结构
      ==21==
    • 检测详细步骤
      ==22==

  1. 死锁检测算法实例
    示例1:
    初始状态如下
    ==23==

    由上图可以看出T0、T2线程没有资源请求了,那就先让这两个线程执行完(先执行T0),并回收资源,得下图

    ==24==

    在上图可以看到,当前可用资源是可以满足其他线程继续执行的,所以示例1没有死锁

    ==25==
    示例2
    初始状态
    ==26==

    由上图可以看出,T0没有资源请求,先执行完T0并回收资源,但这时就会发现只有B资源有一个实例,而剩余的4个线程或需要A资源、或需要C资源,无法正常运行,也就是死锁了


  1. 死锁恢复-进程终止选择
    ==27==
  2. 死锁恢复-进程终止方式
    ==28==

猜你喜欢

转载自blog.csdn.net/lililuni/article/details/83794902