什么是死锁,死锁的原因及解决办法(含四个必要条件)(透明度)
什么是死锁,死锁的原因及解决办法(含四个必要条件)
在多道程序环境中,多个进程可以竞争有限数量的资源。当一个进程申请资源时,如果这时没有可用资源,那么这个进程进入等待状态。有时,如果所申请的资源被其他等待进程占有,那么该等待进程有可能再也无法改变状态。这种情况称为。或许,死锁的最好例证是 Kansas 立法机构在 20 世纪初通过的一项法律,其中说到“当两列列车在十字路口逼近时,它们应完全停下来,并且在一列列车开走之前另一列列车不能再次启动。”p开头的英文单词
系统模型
有一个系统拥有有限数量的资源,需要分配到若干竞争进程。这些资源可以分成多种类型,每种类型有一定数量的实例。资源类型有很多,如 CPU 周期、文件、I/O 设备(打印机和 DVD 驱动器)等。如果一个系统有两个 CPU,那么资源类型 CPU 就有两个实例。类似地,资源类型打印机可能有 5 个实例。如果一个进程申请某个资源类型的一个实例,那么分配这种类型的任何实例都可满足申请。否则,这些实例就不相同,并且资源分类没有定义正确。例如,一个系统有两台打印机。如果没有人关心哪台打印机打印哪些输出,那么这两台打印机可定义为属于同样的资源类型。然而,如果一台打印机在九楼,而另一台在底楼,那么九楼的用户就不会认为这两台打印机是相同的,这样每个打印机就可能需要定义成属于单独的类型。各种同步工具如互斥锁和信号量,也应作为系统资源,它们是常见的死锁源。然而,一个锁通常与保护某个特定的数据结构相关联,即一个锁可用于保护队列的访问,另一个锁保护访问链接列表的访问,等等。由于这个原因,每个锁通常有自己的资源类型,并且这种定义不是一个问题。进程在使用资源前应申请资源,在使用资源之后应释放资源。一个进程可能要申请许多资源,以便完成指定任务。显然,申请的资源数量不能超过系统所有资源的总和。换言之,如果系统只有两台打印机,那么进程就不能申请三台打印机。在正常操作模式下,进程只能按如下顺序使用资源:- :进程请求资源。如果申请不能立即被允许(例如,申请的资源正在被其他进程使用),那么申请进程应等待,直到它能获得该资源为止。
- :进程对资源进行操作(例如,如果资源是打印机,那么进程就可以在打印机上打印了)。
- :进程释放资源。
死锁特征
发生死锁时,进程永远不能完成,系统资源被阻碍使用,以致于阻止了其他作业开始执行。在讨论处理死锁问题的各种方法之前,我们首先深入讨论一下死锁特点。必要条件
如果在一个系统中以下四个条件同时成立,那么就能引起死锁:- :至少有一个资源必须处于非共享模式,即一次只有一个进程可使用。如果另一进程申请该资源,那么申请进程应等到该资源释放为止。
- :—个进程应占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有。
- :资源不能被抢占,即资源只能被进程在完成任务后自愿释放。
- :有一组等待进程 {P0,P1,…,Pn},P0等待的资源为 P1占有,P1等待的资源为 P2占有,……,Pn-1等待的资源为 Pn占有,Pn等待的资源为 P0占有。
资源分配图
通过称为系统资源分配图的有向图可以更精确地描述死锁。该图包括一个节点集合 V 和一个边集合 E。节点集合 V 可分成两种类型:P={P1,p2,…,Pn}(系统所有活动进程的集合)和 R={R1,R2,…,Rm}(系统所有资源类型的集合)。从进程 Pi到资源类型 Rj的有向边记为Pi->Rj
,它表示进程 Pi已经申请了资源类型 Rj的一个实例,并且正在等待这个资源。从资源类型 Rj到进程 Pi的有向边记为Rj->Pi
,它表示资源类型 Rj的一个实例已经分配给了进程 Pi。有向边Pi->Rj
称为,有向边Rj->Pi
称为。在图形上,用圆表示进程 Pi,用矩形表示资源类型 Rj。由于资源类型 Rj可能有多个实例,所以矩形内的点的数量表示实例数量。注意申请边只指向矩形 Rj,而分配边应指定矩形内的某个圆点。当进程 Pi申请资源类型 Rj的一个实例时,就在资源分配图中加入一条申请边。当该申请可以得到满足时,那么申请边就立即转换成分配边。当进程不再需要访问资源时,它就释放资源,因此就删除了分配边。图 1 资源分配图图 1 的资源分配图表示了如下情况:- 集合 P、R 和 E:
- P={P1,P2,P3}
- R={R1,R2,R3,R4}
- E={P1-> R1,P2-> R3,R1-> P2,R2-> P2,R2-> P1,R3-> P3}
- 资源实例:
- 资源类型 R1有 1 个实例;
- 资源类型 R2有 2 个实例;
- 资源类型 R3有 1 个实例;
- 资源类型 R4有 3 个实例;
- 进程状态:
- 进程 P1占有资源类型 R2的 1 个实例,等待资源类型 R1的 1 个实例。
- 进程 P2占有资源类型 R1的 1 个实例和资源类型 R2的 1 个实例,等待资源类型 R3的 1 个实例。
- 进程 P3占有资源类型 R3的 1 个实例。
P3-> R2
(图 2)。图 2 存在死锁的资源分配图这时,系统有两个最小环:P1—> R1—> P2一> R3—> P3—> R2—> P1P2—> R3—> P3—> R2—> P2
进程 P1、P2 和 P3 死锁了。进程 P2 等待资源类型 R3,而它又被进程 R3 占有。进程 P3 等待进程 P1 或进程 P2 以释放资源类型 R2。另外,进程 P1 等待进程 P2 释放资源 R1。图 3 具有环的并未死锁的资源分配图现在考虑图 3 所示的资源分配图。在这个例子中,也有一个环:P1—> R1—> P3—> R2—> P1
然而,并没有死锁。注意,进程 P4可能释放资源类型 R2的实例。这个资源可分配给进程 P3,从而打破环。总而言之,如果资源分配图没有环,那么系统就不处于死锁状态。如果有环,那么系统可能会也可能不会处于死锁状态。在处理死锁问题时,这点是很重要的。死锁处理方法
一般来说,处理死锁问题有三种方法:- 通过协议来预防或避免死锁,确保系统不会进入死锁状态。
- 可以允许系统进入死锁状态,然后检测它,并加以恢复。
- 可以忽视这个问题,认为死锁不可能在系统内发生。
版权声明:
本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。