死锁 订阅
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 [1] 展开全文
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 [1]
信息
涉及领域
编程、计算机资源调度
学    科
操作系统
外文名
Deadlock
词    性
名词
中文名
死锁
死锁产生条件
死锁的规范定义:集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,那么该组进程是死锁的。一种情形,此时执行程序中两个或多个进程发生永久堵塞(等待),每个进程都在等待被 其他进程占用并堵塞了的资源。例如,如果进程A锁住了记录1并等待记录2,而进程B锁住了记录2并等待记录1,这样两个进程就发生了死锁现象。计算机系统中,如果系统的资源分配策略不当,更常见的可能是程序员写的程序有错误等,则会导致进程因竞争资源不当而产生死锁的现象。在两个或多个任务中,如果每个任务锁定了其他任务试图锁定的资源,此时会造成这些任务永久阻塞,从而出现死锁。例如:事务A 获取了行 1 的共享锁。事务 B 获取了行 2 的共享锁。排他锁,等待事务 B 完成并释放其对行 2 持有的共享锁之前被阻塞。排他锁,等待事务 A 完成并释放其对行 1 持有的共享锁之前被阻塞。事务 B 完成之后事务 A 才能完成,但是事务 B 由事务 A 阻塞。该条件也称为循环依赖关系:事务 A 依赖于事务 B,事务 B 通过对事务 A 的依赖关系关闭循环。除非某个外部进程断开死锁,否则死锁中的两个事务都将无限期等待下去。Microsoft SQL Server 数据库引擎死锁监视器定期检查陷入死锁的任务。如果监视器检测到循环依赖关系,将选择其中一个任务作为牺牲品,然后终止其事务并提示错误。这样,其他任务就可以完成其事务。对于事务以 错误终止的应用程序,它还可以重试该事务,但通常要等到与它一起陷入死锁的其他事务完成后执行。在应用程序中使用特定编码约定可以减少应用程序导致死锁的机会。有关详细信息,请参阅将死锁减至最少。死锁经常与正常阻塞混淆。事务请求被其他事务锁定的资源的锁时,发出请求的事务一直等到该锁被释放。默认情况下,除非设置了 LOCK_TIMEOUT,否则 SQL Server 事务不会超时。因为发出请求的事务未执行任何操作来阻塞拥有锁的事务,所以该事务是被阻塞,而不是陷入了死锁。最后,拥有锁的事务将完成并释放锁,然后发出请求底事务将获取锁并继续执行。不只是关系数据库管理系统,任何多进程系统上都会发生死锁,并且对于数据库对象的锁之外的资源也会发生死锁。例如,多进程操作系统中的一个进程要获取一个或多个资源(例如,内存块)。如果要获取的资源当前为另一进程所拥有,则第一个进程可能必须等待拥有进程释放目标资源。这就是 说,对于该特定资源,等待进程依赖于拥有进程。在数据库引擎实例中,当获取非数据库资源(例如,内存或进程)时,会话会死锁。在示例中,对于 Part表锁资源,事务 T1 依赖于事务 T2。同样,对于 Supplier表锁资源,事务 T2 依赖于事务 T1。因为这些依赖关系形成了一个循环,所以在事务 T1 和事务 T2 之间存在死锁。当表进行了分区并且 ALTER TABLE 的 LOCK_ESCALATION 设置设为 AUTO 时也会发生死锁。当 LOCK_ESCALATION 设为 AUTO 时,通过允许数据库引擎在 HoBT 级别而不是 TABLE 级别锁定表分区会增加并发情况。但是,当单独的事务在某个表中持有分区锁并希望在其他事务分区上的某处持有锁时,会导致发生死锁。通过将 LOCK_ESCALATION 设为 TABLE 可以避免这种类型的死锁,但此设置会因强制某个分区的大量更新以等待某个表锁而减少并发情况。虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四个必要条件。 [2]  1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
收起全文
精华内容
下载资源
问答
  • 死锁

    千次阅读 2015-09-26 23:46:43
    死锁

    一.死锁

        死锁的规范定义如下:
        如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么,该进程集合就是死锁的。

    二.资源死锁的条件

    1.互斥条件。每个资源要么已经分配给了一个进程,要么就是可用的。
    2.占有和等待条件。已经得到了某个资源的进程可以再请求新的资源。
    3.不可占有条件。已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。
    4.环路等待条件。死锁发生时,系统中一定有两个或两个以上的进程组成的一条环路,该环路中的每个进程都在等待着下一个进程所占有的资源。
        死锁发生时,以上四个条件一定是同时满足的。如果其中任何一个条件不成立,死锁就不会发生。

    三.死锁判断

        死锁的判断最直接的方式是使用资源分配图。资源分配图是一个有向图,图中有两种节点:用圆形表示进程,用矩形表示资源。从资源节点到进程节点的有向边代表该资源已被该进程占用,有进程节点到资源节点的有向边表明当前进程正在请求该资源。
        资源分配图中能够形成环的节点表示这些节点出现了死锁。


    四.处理死锁的策略

    处理死锁主要有下面四种策略:
    1.忽略该问题--鸵鸟算法,
    2.检测死锁并恢复。让死锁发生,检测它们是否发生,一旦发生死锁,采取行动解决问题;
    3.仔细对资源进行分配,动态的避免死锁;
    4.通过破坏引起死锁的四个必要条件之一,防止死锁的产生。

    4.1 死锁的检测与恢复

    1.对于死锁的检测
    1).对于每种类型的资源只有一个的死锁检测,可以采用资源分配图进行检测,图中能形成环的进程就是会出现死锁的进程。
    2).对于每种类型的资源有多个的死锁检测,可以用下面的方式进行



    2.从死锁中恢复
    1).利用抢占恢复;
    2).利用回滚恢复;
    3).通过啥事进程恢复。


    4.2 死锁避免

    1.安全状态
        如果没有死锁发生,并且即使所有进程突然请求对资源的最大需求,也仍然存在某种调度次序能够使得每一个进程运行完毕,则称该状态是安全的。
        不安全状态并不是死锁。安全状态与不安全状态的区别是,从安全状态出发,系统能够保证所有进程都能完成,而从不安全状态出发,就没有这种保证。

    2.银行家算法






    4.3 死锁预防

       死锁预防主要是通过破坏死锁形成的条件来预防死锁的发生。
    1.破坏互斥条件;
    2.破坏占有和等待条件;一种方式是进行在开始执行前请求所需的全部资源;2.要求当一个进程请求资源时,先暂时释放其当前占用的所有资源,然后再尝试一次获得所需的全部资源。
    3.破坏不可抢占条件;
    4.破坏环路等待条件:a.保证灭一个进程在任何时刻只能占用一个资源,如果要请求另外一个资源,它必须先释放第一个资源;b.将所有资源统一编号,进程可以在任何时刻提出资源请求,但是所有请求必须按照资源编号的顺序(升序)提出;c.摒弃必须按升序请求资源的限制,而仅仅要求不允许进程请求比当前所占有资源编号低的资源。


    五.其他

    5.1 活锁

      活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。 活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。

    5.2 饥饿

       出现饥饿是因为某个进程优先级比较低,一直没有机会被CPU执行,由于长时间的处于就绪状态但无法执行,该进程最终而“饥饿而死”。饥饿一般科研通过先来先服务资源分配策略来避免。在这种机制下,等待最久的进程会是下一个被调度的进程。




    参考文献
    现代操作系统,第三版

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 285,785
精华内容 114,314
关键字:

死锁