操作系统6-死锁的预防和避免

6.1 死锁的预防

  • 具体的做法是破坏产生死锁的四个必要条件之一。
  • 原理为:设计不同的资源分配算法,来保证不发生死锁。
6.1.1 破坏互斥条件
  • 如果资源不需要互斥访问,就可以破坏互斥条件。
  • 对于某些硬件资源,可以采用特殊技术实现允许同时访问;
  • 对于软件资源,无法实现。
6.1.2 破坏请求和保持条件
  • 在执行时不再提出资源请求
    系统要求所有进程要一次性地申请在整个运行过程中所需的全部资源。若系统有足够资源则完全分配。
    在等待时不保持任何资源
  • 只要有一个请求的资源不可用,就其它可用资源都不分配给它。

优点:简单、易于实现且安全。
缺点:

  • 一个用户在作业运行之前可能提不出它的作业将要使用的全部资源。
  • 延迟运行 用户作业必须等待,直到所有资源满足才能运行。
  • 一个作业运行期间,对某些设备的使用时间很短,甚至不会用到。如:当用户作业出错时才需要打印机输出错误信息,但采用静态分配法必须把打印机分配给该作业,并长期占用。采用该方法对系统来说是非常浪费的。
6.1.3 破坏不可剥夺条件
  • 一个已拥有资源的进程,若它再提出新资源要求而不能立即得到满足时,它必须释放已经拥有的所有资源。以后需要时再重新申请。

  • 实现复杂且要付出很大的代价(以前工作的失效,执行的推迟)

6.1.4 破坏环路条件

系统将所有资源按类型进行线性排序,并赋予不同的序号,所有进程对资源的请求必须严格按照资源序号递增的次序提出。

例如:系统中有下列设备:输入机(1),打印机(2),穿孔机(3),磁带机(4),磁盘(5)。有一进程要先后使用输入机、磁盘、打印机,则它申请设备时要按输入机、打印机、磁盘的顺序申请。

优点:同前两法相比,其资源利用率和系统吞吐量有较明显的改善。

缺点:进程实际需要资源的顺序不一定与资源的编号一致,因此仍会造成资源浪费;资源的序号必须相对稳定,从而限制了新设备的增加。

小结:

  • 预防死锁的原理为设计不同的资源分配算法,来保证不发生死锁。
  • 破坏请求和保持条件的资源分配算法是一种静态资源分配;
  • 而破坏不可剥夺条件和环路条件是动态分配资源算法;
  • 破坏环路条件是相对优异的一种预防死锁算法。

6.2 系统的安全状态

6.2.1 死锁避免
  • 在系统运行过程中,对进程提出的每一个(系统能够满足的)资源申请进行动态检查(安全性检查);
  • 根据检查结果决定是否分配资源,若分配后系统可能发生死锁,则不予分配,否则予以分配。
6.2.2 安全状态
  • 如果系统能按某种顺序为每个进程依次分配其所需的资源,直至所有进程都能运行完成,称此时系统处于安全状态
  • 这种进程的顺序,如P4,P1,…,Pn, 称为安全序列
  • 若不存在这样一个安全序列称此时系统处于不安全状态
  • 如果不按安全序列分配资源,则系统可能会由安全状态进入不安全状态。

安全状态举例:

系统有三个进程P1、P2、P3,12台打印机
P1共要求10台,P2共要求4台,P3共要求9台
在T0时刻,P1、P2、P3分别获得5、2、2台,尚有3台空闲
安全状态

注意:

  • 不安全状态≠死锁
    • 处于不安全状态的系统不一定会发生死锁
    • 处于安全状态的系统一定不会发生死锁
  • 系统处于安全与不安全状态都是对静态进行的评价

6.3 利用银行家算法避免死锁

6.3.1 银行家算法描述
  • 可利用资源向量Available
    是一个含有m个元素的数组,其中每个元素代表一类资源的可利用的数目
  • 最大需求矩阵Max
    n×m矩阵,n为当前系统进程的数目,m为系统资源种类数。Max[i,j]为第i个进程对j类资源的最大需求
  • 分配矩阵Allocation
    n×m矩阵,表示每个进程已分配的每类资源数
  • 需求矩阵Need
    n×m矩阵,表示每个进程还需要各类资源数
6.3.2 银行家算法的步骤

步骤

当进程Pi提出资源申请时Requesti[j] ,系统执行下列步骤:

1.若Requesti[j]≤Need[i,j],转2);否则错误返回。
2.若Requesti[j] ≤Available[j], 转3);否则进程等待。
3.假设系统给它分配资源,则有:
Available [j] :=Available [j] -Requesti[j];
Allocation[i,j]:=Allocation[i,j]+Requesti[j];
Need[i,j]:=Need[i,j]-Requesti[j]
4.执行安全性算法,若系统新状态是安全状态,则分配完成,若系统新状态是不安全状态,则恢复原状态,进程等待。

6.3.3 安全性算法

为进行安全性检查,定义数据结构:
Work:ARRAY[0..m-1] of integer;
Finish:ARRAY[0..n-1] of Boolean;

  • m代表资源种类数,n代表进程的数量;
  • Work表示系统可提供给进程继续运行的各类资源的数目;
  • Finish表示系统是否有足够的资源分配给该进程。

步骤:
安全性

例:
设系统有五个进程和三类资源,每类资源分别共有10、5、7。在T0时刻资源分配情况如图
例

1.T0时刻可以找到一个安全序列<P1, P3, P4, P2, P0>,系统是安全的。
例

2.P1发出请求Request(1,0,2)
执行银行家算法

  • Request(1,0,2)≤Need(1,2,2)
  • Request(1,0,2)≤Available(3,3,2)
    例

  • 可以找到一个安全序列<P1,P3,P4,P0,P2>,系统是安全的,可以将P1请求资源分配给它。

3.P4发出请求Request(3,3,0)
执行银行家算法
Available=(2,3,0),不能通过算法第2步( Requesti[j]≤ Available[j] ),所以P4等待。

猜你喜欢

转载自blog.csdn.net/maniacxx/article/details/81154239
今日推荐