操作系统-死锁

来源:互联网 发布:json和jsonp的区别 编辑:程序博客网 时间:2024/05/29 10:09

  在多道程序系统中,由于多个进程并发执行,改善了系统资源的利用率并提高了系统的处理能力。然而,多个进程并发执行也带来了新的问题——死锁。所谓死锁(Deadlock)是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。

  例如:有资源R1,资源R2,进程P1,进程P2,进程P1,P2分别占用了资源R1,R2,而进程P1要申请资源R2,进程P2要申请资源R1,两者都因为所需资源被占用而阻塞,从而产生死锁。

死锁产生的原因

  1. 系统资源的竞争
    只有对不可剥夺资源的竞争才可能产生死锁。

  2. 进程推进顺序非法
    如上面的例子,进程并不是在竞争同一资源,而是在等待对方的资源导致死锁。

死锁产生的四个必要条件

互斥条件、不剥夺条件、请求和保持条件、循环等待条件

死锁的处理策略

预防死锁

破坏产生死锁的四个必要条件中的一个或几个条件即可

死锁避免

1、系统安全状态
  所谓安全状态,是指系统能按某种进程推进顺序(P1,P2,…,Pn),为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺序地完成。此时称P1,P2,…,Pn为安全序列。如果系统无法找到一个安全序列,则称系统处于不安全状态。

例:某时刻进程的资源使用情况如下表:
进程资源分配表
  先将资源分配给P2,满足最大需求,待P2执行完成后,此时可用资源为5,再分配给P1,待P1执行完成后,可用资源为10,最后分配给P3,满足需求,可执行完成。所以该时刻P2,P1,P3为安全序列。

2、银行家算法

  银行家算法是著名的死锁避免算法。它提出的思想是:操作系统按照规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则推迟分配。

银行家算法中的数据结构:

  • 可利用资源矢量 Available;
  • 最大需求矩阵 Max;
  • 分配矩阵 Allocation;
  • 需求矩阵 Need ;

    Need=Max-Allocation

举例:假定系统中有5个进程{P0,P1,P2,P3,P4}和三类资源{A,B,C},各种资源的数量分别为10,5,7,在T0时刻的资源分配情况如下表:

这里写图片描述

(1)、计算Need矩阵

Need=739245202332223023201001000212=716044201332011

(2)、用Available向量与Need矩阵各行比较,找出比Available向量小的行

(332)716044201332011

选择第二行即P1(或者P3)暂时加入安全序列

(3)、释放P1所占用的资源即把对应的Allocation矩阵中的一行加到Available向量上:

Available=(332)+(200)=(532)

此时需求矩阵应去掉第二行,再用更新的Available向量和Need矩阵重复步骤(2),最后可得到一个安全序列{P1,P3,P4,P2,P0}。