死锁 操作系统笔记整理系列

死锁

系统模型

  1. 资源类型有很多,如CPU周期、文件、I/O设备等。
  2. 每一个系统拥有有限数量的资源,需要分配到若干竞争进程,这些资源可以分为多种类型,每种类型具有一定数量的实例。
  3. 在正常操作模式下,进程只能按如下顺序使用资源:
    (1)申请:进程请求资源,如果申请不能立即被允许,例如申请的资源正在被其他进程使用,那么申请进程应等待,直到它能获得该资源为止。
    (2)使用:进程对资源进行操作。
    (3)释放:进程释放资源。

死锁问题

  1. 一组阻塞的进程,每个进程持有一个资源,并等待获得资源集中的另一个进程持有的资源。

另一种定义:一组进程每一个进程都在等待一个事件,等待事件只能由同组进程的另一个进程引起。

死锁特征

死锁的必要条件

  1. 如果在一个系统中以下四个条件同时成立,那么就能引起死锁:
    (1)互斥(mutual exclusion):对于资源访问,如果一个资源被一个进程访问,那么,这个资源不能被其他进程访问。
    (2)持有等待(hold and wait):一个进程应占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有。(另一种说法:一个进程在申请资源时,可能已经拥有其他资源,拥有的其他资源可能被其他进程申请)
    (3)非抢占(no preemption):资源不能被抢占,即资源只能在进程完成任务之后被进程自愿释放。
    (4)循环等待(circular wait):有一组等待进程{P0,P1,…,Pn},P0等待的资源被P1占有,P1等待的资源被P2占有,…,Pn等待的资源被P0占有。

资源分配图

  1. 进程节点和资源节点、申请边和分配边
  2. 一个资源节点有多个实例,进程节点申请资源,资源节点中的一个实例被分配给进程节点。
  3. 如果分配图没有环,那么系统就没有进程死锁;如果分配图有环,那么可能存在死锁。
  4. 如果每个资源类型刚好有一个实例,那么有环就意味着已经出现死锁。
  5. 如果每个资源类型有多个实例,那么有环并不意味着已经出现了死锁。

处理死锁的方法

一般来说,处理死锁问题有三种方法:
(1)不允许死锁发生。(死锁预防、死锁避免)
(2)允许系统进入死锁状态,然后恢复。(死锁检测、死锁恢复)
(3)忽略这个问题,假装系统从未发生死锁。被大多数操作系统使用,包括UNIX。

死锁预防(静态策略)

发生死锁有4个必要条件,只要确保至少一个必要条件不成立,就能预防死锁发生。

  1. 互斥:若能使所有资源可非互斥共享,则可以打破互斥条件。然而,通常不能通过否定互斥条件来预防死锁,因为有的资源本身就是非共享的。例如,一个互斥锁不能同时被多个进程所共享。
  2. 持有等待:必须保证当一个进程请求资源时,它本身不持有任何资源。
    (1)要求进程在开始执行之前请求并被分配到所有的资源。
    (2)只有当进程本身不持有任何资源时才允许进程请求资源。
    (3)缺点:资源利用率低,发生饥饿(一直申请不到资源)。
  3. 非抢占:
    (1)如果一个持有某些资源的进程请求另一个不能立即分配给它的资源,那么当前持有的所有资源都会被释放。例:进程A拥有资源R1,申请资源R2,R2没有办法分配给A,此时资源R1可以被抢占。
    (2)抢占资源被添加到进程正在等待的资源列表中。
    (3)只有当进程能够重新获得旧资源以及它正在请求的新资源时,进程才会重新启动。
  4. 循环等待:
    资源排序,只能按升序规则申请资源。例:P1可以申请R2,P2可以申请R3,P3不可以申请R1。
    在这里插入图片描述

死锁避免(动态策略)

安全序列与安全状态
  1. 安全序列就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成,只要存在一个安全序列,系统就是安全状态。(安全序列可能有多个)
  2. 安全序列里的每个进程所请求的资源,能被当前空闲的资源和其他进程所持有的资源所满足,这里的其他进程先执行,然后将资源分配给此进程。
  3. 如果系统处于安全状态,一定不会发生死锁;如果系统进入不安全状态,就可能发生死锁。
  4. 可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态。
死锁避免算法
资源分配图算法(每一个资源有一个实例)
  1. 需求边(虚线)->申请边->分配边
  2. 只有当将申请边转换为分配边不会导致资源分配图中形成一个环时(此时的环包括需求边),申请才能被授予。
银行家算法(每一个资源有多个实例)
  1. 核心思想:在进程提出资源申请时,先预判此次分配是否会导致系统进入不安全状态,如果会进入不安全状态,就暂时不答应此次请求,让该进程先阻塞等待。
  2. 安全性算法(找序列):每次都找出还没有完成的进程,且这个进程所需要的资源小于等于当前空闲资源,将所需的资源分配给这个进程,进程结束后,空闲资源为分配给这个进程的资源和原先剩下的空闲资源,直到所有的进程结束。
  3. 资源分配算法:请求的资源可以小于进程所需的资源,请求资源在满足分配条件时,被分配给请求进程,此时进程所需资源为原所需资源减去分配给进程的资源。
    在这里插入图片描述

死锁检测

如果系统中既不采取预防死锁的措施,也不采取避免死锁的措施,系统很可能发生死锁。

  1. 保持等待图(每个资源只有一个实例):周期性检测等待图看有无环,n^2时间复杂度。
  2. 类银行家算法(每个资源有多个实例):m*(n^2)时间复杂度,m表示资源种类数

死锁恢复

并不是系统中的所有进程都是死锁状态,用死锁检测算法化简资源分配图后,还连着边的那些进程就是死锁进程。

  1. 进程终止
    (1)终止所有死锁进程。
    (2)每次中止一个进程,直到回退到足以避免死锁的地步。
  2. 资源抢占(需要解决选择牺牲进程、回滚和饥饿的问题)
    在这里插入图片描述
银行家算法=-- - 1. 安全状态: 在某时刻系统中所有进程可以排列一个安全序列:{P1,P2,`````Pn},刚称此时,系统是安全的. 所谓安全序列{P1,P2,`````Pn}是指对于P2,都有它所需要剩余资源数量不大于系统掌握的剩余的空间资源与所有Pi(j<i)所占的资源之和. 2.不安全状态可能产生死锁. 目前状态 最大需 尚需 P1 3 9 6 P2 5 10 5 P3 2 4 2 在每一次进程中申请的资源,判定一下,若实际分配的话,之后系统是否安全. 3.银行家算法的思路: 1),进程一开始向系统提出最大需量. 2),进程每次提出新的需(分期贷款)都统计是否超出它事先提出的最大需量. 3),若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的 剩余资源量,若不超出,则分配,否则等待. 4.银行家算法的数据结构. 1),系统剩余资源量A[n],其中A[n]表示第I类资源剩余量. 2),各进程最大需量,B[m][n],其中B[j][i]表示进程j对i 类资源最大需. 3),已分配资源量C[m][n],其中C[j][i]表示系统j程已得到的第i资源的数量. 4),剩余需量.D[m][n],其中D[j][i]对第i资源尚需的数目. 5.银行家算法流程:当某时刻,某进程时,提出新的资源申请,系统作以下操作: 1),判定E[n]是否大于D[j][n],若大于,表示出错. 2),判定E[n]是否大于系统剩余量A[n],若大于,则该进程等待. 3),若以上两步没有问题,尝试分配,即各变量作调整. 4),按照安全性推测算法,判断,分配过后,系统是否安全,若安全,则实际分配,否则,撤消分配,让进程等待. 6."安全性检测"算法 1),先定义两个变量,用来表示推算过程的数据. F[n]=A[n],表示推算过程中,系统中剩余资源量的变化. J[n]=False表示推算过程中各进程是否假设"已完成" 2),流程: 在"剩余"的进程中(在推算)过程中,一些进程假设已完成,查找D[j][n]<=F[n]的进程,找到后令J[j]=True (假设该进程完成),F[n]+D[j][n](该进程所占资源释放),如此循环执行. 若最后,所有的F[n]=True(在推算过程中,所有进程均可以完成),则表示(分配过后)系统是安全的,否则系统是不安全的.
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值