zoukankan      html  css  js  c++  java
  • 调度与死锁2

    8.3 死锁的基本概念

    一、定义

    多个进程因为竞争资源而产生的一种僵死状态,若无外力推动,这些进程将无法继续执行。

    在一组进程发生死锁的情况下,这组死锁进程中的每一个进程,都在等待另一个死锁 进程所占有的资源。或者说每个进程所等待的事件是该组中其它进程释放所占有的资源。 但由于所有这些进程己都无法运行,因此它们准也不能释放资源,致使没有任何一个进程 可被唤醒。这样这组进程只能无限期地等待下去。由此可以给死锁做出如下的定义:如一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那么该组进程是死锁的(Deadlock)。

    二、原因

    1. 资源不足
    2. 进程推进顺序非法

    三、必要条件

    (1) 互斥条件。进程对所分配到的资源进行排它性使用,即在一段时间内,某资源只能被一个进程占用。如果此时还有其它进程请求该资源,则请求进程只能等待,直至占有该资源的进程用毕释放。

    (2) 请求和保持条件。进程己经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

    (3) 不可抢占条件。进程已获得的资源在未使用完之前不能被抢占,只能在进程使用完时由自己释放。

    (4) 循环等待条件。在发生死锁时,必然存在一个进程一资源的循环链,即进程集合 {P0,P1,P2 , ...,Pn}中的P0正在等待一个P1占用的资源,P1正在等待P2占用的资源,……, Pn正在等待已被P0占用的资源。

    四、处理方法

    (1) 预防死锁。这是一种较简单和直观的事先预防方法。该方法是通过设置某些限制 条件,去破坏产生死锁四个必要条件中的一个或几个来预防产生死锁。预防死锁是一种较 易实现的方法,已被广泛使用。

    (2) 避免死锁。同样是属于事先预防策略,但它并不是事先采取各种限制措施,去破 坏产生死锁的四个必要条件,而是在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而可以避免发生死锁。

    (3) 检测死锁。这种方法无须事先采取任何限制性措施,允许进程在运行过程中发生 死锁。但可通过检测机构及时地检测出死锁的发生,然后采取适当的措施,把进程从死锁 中解脱出来。

    (4) 解除死锁。当检测到系统中已发生死锁时,就采取相应措施,将进程从死锁状态 中解脱出来。常用的方法是撤消一些进程,回收它们的资源,将它们分配给己处千阻寒状 态的进程,使其能继续运行。

     

    8.4 死锁的预防和避免

    一、预防(破坏必要条件)

    1.互斥条件(很难破坏)

    2.破坏请求和保持条件(静态分配)

    3.破坏不可抢占条件(抢占)

    4.破坏循环等待条件(层次分配)

    二、避免

    1.安全状态

    所谓安全状态,是指系统能按某种进程推进顺序(p,,p2 , •••,pn)为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成。此时称上面的序列为安全序列。如果系统中无法找到这样一个安全序列,称系统处于不安全状态。

     

    2.银行家算法

    为实现银行家算法,每一个新进程在进入系统时,它必须申明在运行过程中,可能需要每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量 当进程请求一组资源时,系统必须首先确定是否有足够的资源分配给该进程。若有,再进一步计算在将 这些资源分配给进程后,是否会使系统处于不安全状态。如果不会,才将资源分配给它,否则让进程等待。

    举例:

    现有五个进程四类资源,系统目前资源情况如下:

    进程

    MAX

    Allocation

    Available

    p0

    0,7,4,2

    0,2,3,1

    4.3.5.0

    P1

    1,3,8,1

    0,3,2,0

     

    P2

    0,0,3,1

    0,0,1,1

     

    P3

    5,5,4,3

    1,0,1,1

     

    P4

    6,1,1,0

    1,1,1,0

     

    说明当前是否是安全状态,如果是请列出安全序列(列表)

    进程

    Work(free)

    need

    Allocation

    W+A

    P2

    4.3.5.0

    0,0,2,0

    0,0,1,1

    4,3,6,1

    P1

    4,3,6,1

    1,0,6,0

    0,3,2,0

    4,6,8,1

    P0

    4,6,8,1

    0,5,1,1

    0,2,3,1

    4,8,11,2

    P3

    4,8,11,2

    4,5,3,2

    1,0,1,1

    5,8,12,3

    P4

    5,8,12,3

    5,0,0,0

    1,1,1,0

    6,9,13,3

    安全序列为P2->P1->P0->P3->P4

     

    8.4死锁的检测与解除

    一、检测

    1. 资源分配图

     

     我们用圆圈代表一个进程,用方框代表一类资源。由于一种类型的资源吋能有多个, 我们用方框中的一个点代表一类资源中的一个资源。此时,请求边是由进程指向方框中的 Rj,而分配边则应始于方框中的一个点。图中示出了一个资源分配图。图中,P1进程己 经分得了两个R1资源,并又请求一个R2资源:P2进程分得了一个R1和一个R2资源,并又请求R1资源。

    1. 死锁定理

    ①查询非孤立也阻塞的点,去掉所有边;

    ②直到去掉所有边。

     

    二、解除

    1. 抢占资源
    2. 撤销进程
  • 相关阅读:
    常用地市
    UML 类图总结
    什么是线程和进程
    一切皆是对象
    反射、Attribute
    js 面试题
    委托
    使用NPOI导出Excel引发异常(IsReadOnly = “book.IsReadOnly”引发了类型“System.NotImplementedException”的异常)
    lambda表达式封装对数据库的查询
    lambda表达式Expression<Func<Person, bool>> 、Func<Person, bool>区别
  • 原文地址:https://www.cnblogs.com/giaogiaogiao/p/12888496.html
Copyright © 2011-2022 走看看