操作系统概念笔记——第七章:死锁

Posted 叶卡捷琳堡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统概念笔记——第七章:死锁相关的知识,希望对你有一定的参考价值。

第七章:死锁

在多程序环境下,多个进程竞争一定数量的资源

某个进程申请一个资源,如果这个进程所申请的资源被其它进程所占有,那么该等待进程有可能再也无法改变其状态,这周情况被称为死锁

这章主要介绍一些方法,用于处理或预防死锁

7.1 系统模型

一个系统拥有一定数量的资源,这些资源可以被分为多种类型
这些资源类型的例子有

  • 内存空间
  • CPU周期
  • 文件
  • IO设备(打印机)

正常情况下,进程只能按如下顺序使用资源

  1. 申请:如果申请不能被立即允许,那么申请进程必须等待
  2. 使用:进程对资源进行操作
  3. 释放:进程释放资源

7.2 死锁特征

1.死锁的必要条件

如果在一个系统中下面4个条件同时满足,会引起死锁

  1. 互斥:至少有一个资源必须处于非共享模式,一次只能由一个进程使用
  2. 占有并等待:一个进程必须占有至少一个资源,并等待另一资源,而该资源为其它进程所占有
  3. 非抢占:资源不能被抢占,资源只能在进程完成任务后自动释放
  4. 循环等待:一组进程{P0,P1,…,Pn},P0等待的资源被P1所占有,P1等待的资源被P2占有,以此类推,Pn等待的资源被P0所占有

只有四个条件同时满足时,才会出现死锁

2.资源分配图

死锁问题可以用系统资源分配图的有向图进行更为精确的描述
资源分配图的构成

  • 节点集合V:P = {P1,P2…Pn}(进程活动集合),R = {R1,R2,…,Rm}(系统所有资源类型的集合)
  • 边集合E:其中Pi->Rj表示资源类型Rj的一个实例已经分配给进程Pi,Pi->Rj被称为申请边,Rj->Pi被称为分配边

资源分配图的实例
在这里插入图片描述
存在死锁的资源分配图

该系统中有两个最小环
P1->R1->P2->R3->P3->R2->P1
P2->R3->P3->R2->P2
在这里插入图片描述
要注意的是环的存在只是构成死锁的一个条件,不是说有环就一定会死锁

死锁必有环,有环不一定死锁

存在环但是没有死锁的资源分配图
在这里插入图片描述

7.3 死锁处理

有三种处理死锁问题的方法

  1. 预防死锁,确保系统不会进入死锁状态
  2. 允许系统进入死锁状态,加入检测机制,并加以恢复
  3. 忽视死锁

接下来几节将会讲到死锁预防和死锁避免等

7.4 死锁预防

由于产生死锁有四个必要条件,因此只要确保一个必要条件不成立,就能预防死锁发生

7.4.1 互斥

对于非共享资源,必须有互斥条件
但是对于一些可共享的数据,可以不要求互斥访问以避免死锁
但是通常不能通过否定互斥条件来预防死锁,因为有的资源就是共享的

7.4.2 占有并等待

为了确保占有并等待不会在系统内出现,必须保证一个进程在申请资源时,不能占有其它资源

有两种协议可以实现这个功能

  1. 每个进程在执行前申请并获得所有资源
  2. 仅允许进程在没有资源时才可申请资源

这两种协议的缺点

  1. 资源利用率较低,许多资源可能已经被分配,但是却长时间没有被使用
  2. 可能会发生饥饿。如果一个进程需要多个常用资源,则可能永久等待,因为它所需的资源中至少有一个已分配给其它进程

7.4.3 非抢占

为了使资源能被抢占,可以使用以下这个协议
如果一个进程占有资源并申请另一个不能被立即分配的资源,那么现已分配的资源都可被抢占

如果一个进程申请资源,首先检查它们是否可用,如果可用,就分配资源,如果不可用,就检查这些资源是否已经分配给其它正在等待的进程,如果是,就从等待进程中抢占这些资源

7.4.4 循环等待

确保循环等待不成立的条件是对所有资源类型进行排序,并且要求每个进程按递增顺序来申请资源

设R={R1,R2,R3…,Rm} 为资源的集合,需要为一个资源分配唯一的整数来比较两个资源的先后顺序
定义函数F

比如:

  • R1对应5,即F(R1) = 5
  • R2对应7,即F(R2) = 7
  • R3对应10,即F(R3) = 10

采用如下的协议预防死锁,每个进程只按递增顺序申请资源,即一个进程开始时可以申请任意资源类型Ri的实例。之后,当且仅当F(Rj) > F(Ri)时,该进程才能申请Rj
换句话说,如果一个进程需要申请一个名为Rj的资源时,必须释放所有的资源Ri(F(Ri) > F(Rj))
根据上述协议,循环等待就无法实现了

7.5 死锁避免

虽然7.4节介绍了很多预防死锁的方法,但是上面介绍的这四种方法可能产生的副作用更大
老师上课说,举个例子就像为了预防灰指甲,而选择截肢
上面这种预防死锁的办法会导致低设备使用率和低系统吞吐率

避免死锁的另一种方法是,根据进程申请资源后的情况来决定是否应该分配这些资源
根据这种方法,需要每个进程给出它所需要的各种资源的最大需求,之后构造一个算法,以确保系统绝不会进入死锁状态

这种算法定义了死锁避免方法,死锁避免算法动态地检测资源分配状态以确保循环等待条件不可能成立。

7.5.1 安全状态

如果能让系统按某个顺序为进程分配资源,并保证不会死锁,那就说明这个系统状态是安全的

安全状态不是死锁状态,死锁状态是不安全状态
在这里插入图片描述
对于进程<P1,P2,…,Pn>,如果对于每个Pi,Pi可以申请的资源数小于当前可用资源加上所有进程Pj(其中j<i) 所占有的资源,则这一顺序为安全序列。在这个时候,如果Pi所需要的资源不能被立刻使用,那么Pi可等待所有Pj释放其资源

7.5.2 资源分配图算法

在资源分配图中,除了申请边和分配边外,引入一条新类型的边,称为需求边
需求边Pi->Rj表示进程Pi可能在将来某个时候申请Rj
如果用虚线表示Pi->Rj,则该边变为了申请边

7.5.3 银行家算法

对于每种资源类型有多个实例的资源分配系统,资源分配图算法就不适用了。需要使用“银行家算法”

当新进程进入系统时,必须说明它所需要的每种资源的实例的最大数量,这一数量不能超过系统资源的总和,当用户申请资源时,系统必须确定这些资源的分配是否会使系统仍处于安全状态。如果是,就分配资源,如果不是,该进程必须等待其它进程释放足够资源才可

银行家算法中的变量和实例

  • n:系统进程的个数
  • m:共有m中资源
  • Available[j] = k:资源Rj有k个实例
  • MAX[n][m]:MAX[i][j] = k,进程Pi最多可申请k个Rj实例
  • Allocation[n][m]:表示进程已分配的资源实例
  • Need[n][m]:Need = Max - Allocation,表示还需要多少资源
  • Allocation i表示分配给进程Pi的资源
  • Need i表示进程Pi为完成其任务还需要的资源

1.安全性算法

该算法用于检测当前系统是否处于安全状态
在这里插入图片描述
2.资源请求算法
在这里插入图片描述

7.6 死锁检测

这一部分内容和上一部分内容有点难,等到期末的时候再来整理

7.7 死锁恢复

打破死锁有两个方法,一种方法是简单地终止一个或多个进程以打破循环等待。另一个方法是从一个或多个死锁进程中抢占一个或多个资源

7.7.1 进程终止

有两种方法通过终止进程以停止死锁

  1. 一次终止所有死锁进程
  2. 一次只终止一个进程,知道取消死循环为止

7.7.2 资源抢占

使用资源抢占以取消死锁,逐步从进程中抢占资源以供其它资源使用,直到死锁被打破为止

以上是关于操作系统概念笔记——第七章:死锁的主要内容,如果未能解决你的问题,请参考以下文章

王道操作系统笔记——— 死锁的处理策略

操作系统学习笔记 死锁

Python笔记·第七章—— IO(文件)处理

数据库系统概念笔记——第7章:数据库设计和E-R模型

Python第七周 学习笔记

读书笔记之《操作系统概念》