【死锁】

本文围绕以下四个部分展开:

一、死锁的概念
二、产生死锁的原因
三、产生死锁的必要条件
四、处理死锁的基本方法






一、死锁的概念

        指:多个进程在运行过程中,因争夺资源而造成的一种僵局(DeadlyEmbrace),当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。


二、产生死锁的原因

        1. 竞争资源。

        当系统中供多个进程共享的资源,如打印机、公用队列等,其数目不足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁。

        2. 进程间推进顺序非法。

        进程在运行过程中,请求和释放资源的顺序不当,也同样会导致产生进程死锁。


三、产生死锁的必要条件

        1. 互斥条件。

        指:进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求该资源,则请求者只能等待,直至占有该资源的进程用完释放。

        2. 请求和保持条件。

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

        3. 不剥夺条件。

        指:进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。

        4. 环路等待条件。

        指:在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,…,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源;……;Pn正在等待已被P0占用的资源。


四、处理死锁的基本方法

        1. 预防死锁

        通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个条件,来预防发生死锁。

        预防死锁是一种较易实现的方法,已被广泛使用。但由于所施加的限制条件往往太严格,因而可能会导致系统资源利用率和系统吞吐量降低。

        预防死锁的方法是使四个必要条件中的第2、3、4个条件之一不能成立,来避免发生死锁。至于必要条件1,因为它是由设备的固有特性所决定的,不仅不能改变,还应加以保证。

        (1)摒弃“请求和保持”条件

        采用这种方式时,系统规定所有进程在开始运行之前,都必须一次性地申请其在整个运行过程所需的全部资源。此时,若系统有足够的资源分配给某进程,便可把其需要的所有资源分配给该进程,这样,该进程在整个运行期间便不会再提出资源要求,从而摒弃了请求条件。

        但在分配资源时,只要有一种资源不能满足某进程的要求,即使其它所需的各个资源都空闲,也不分配给该进程,而让该进程等待。由于在该进程的等待期间,它并未占有任何资源,因而也摒弃了保持条件,从而可以避免发生死锁。

            1)优点:简单、易于实现、很安全。

            2)缺点:

                A. 资源被严重浪费。

                因为一个进程是一次性地获得其整个运行过程所需的全部资源的,且独占资源,其中可能有些资源很少使用,甚至在整个运行期间都未使用,这就严重地恶化了系统资源的利用率。

                B. 使进程延迟运行。

                仅当进程在获得了其所需的全部资源后,才能开始运行,但可能因有些资源已长期被其它进程占用而致使等待该资源的进程迟迟不能运行。

        (2)摒弃“不剥夺”条件

        采用这种方式时,进程是逐个地提出对资源的要求的。当一个已经保持了某些资源的进程,再提出新的资源请求而不能立即得到满足时,必须释放它已经保持了的所有资源,待以后需要时再重新申请。这意味着,某一进程已经占有的资源,在运行过程中会被暂时地释放掉,也可认为是被剥夺了,从而摒弃了“不剥夺”条件。

        1)缺点:

        实现比较复杂,且要付出很大的代价。因为一个资源在使用一段时间后,它的被迫释放可能会造成前段工作的失效,即使是采取了某些防范措施,也还会使进程前后两次运行的信息不连续;此外,还可能因为反复地申请和释放资源,致使进程的执行被无限地推迟,这不仅延长了进程的周转时间,而且也增加了系统开销,降低了系统吞吐量。

        (3)摒弃“环路等待”条件。

        采用这种方法时,系统将所有资源按类型进行线性排队,并赋予不同的序号。例如:输入机序号为1,打印机序号为2,磁带机为3,磁盘为4。所有进程堆资源的请求必须严格按照资源序号递增的次序提出,这样,在所形成的资源分配图中,不可能再出现环路,因而摒弃了“环路等待”条件。

        1)优点:与前两种方法相比,这种方法的资源利用率和系统吞吐量都有较明显的改善。

        2)缺点:

            A. 为系统中各类资源所分配(确定)的序号必须相对稳定,这就限制了新类型设备的增加。

            B. 尽管在为资源的类型分配序号时,已经考虑到大多数作业在实际使用这些资源时的顺序,但也经常发生这种情况:作业(进程)使用各类资源的顺序与系统规定的顺序不同,这就会造成对资源的浪费。

            例如:某进程先用磁带机,后用打印机,但按系统规定,该进程应先申请打印机后申请磁带机,致使先获得的打印机被长时间闲置。

            C. 为方便用户,系统对用户在编程时所施加的限制条件应尽量少。然而这种按规定次序申请的方法,必然会限制用户简单、自主地编程。


        2. 避免死锁。

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

        这种方法只需要事先施加较弱的限制条件,便可获得较高的资源利用率及系统吞吐量,但在实现上有一定的难度。

        最著名的避免死锁的算法:Dijkstra的银行家算法。


        3. 检测死锁。

        这种方法不需要事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,而是允许系统在运行过程中发送死锁。

        但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源;然后,采取适当措施,从系统中将已发生的死锁清除掉。


        4. 解除死锁。

        它是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,需将进程从死锁状态中解脱出来。

            方法(1):剥夺资源。从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态。

            方法(2):撤销进程。使全部死锁进程都夭折掉;或者,按照某种顺序逐个地撤销进程,直至有足够的资源可用,使死锁状态消除为止。

        死锁的检测和解除措施有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。




整理时重点参考:《计算机操作系统》(第三版) -- 汤小丹、梁红兵、哲凤屏、汤子瀛 编著

猜你喜欢

转载自xiangdonglee.iteye.com/blog/2237395