文章目录

  • 一、相关知识
  • 1.可重用性资源和消耗性资源
  • 2.可抢占性资源和不可抢占性资源
  • 3.死锁定义
  • 二、死锁产生的原因和必要条件
  • 1.死锁产生的原因
  • 2.死锁产生的必要条件
  • 三、预防死锁的方法
  • 1.破坏“请求和保持”条件
  • 2.破环“不可抢占”条件
  • 3.破坏“循环等待”条件



一、相关知识

1.可重用性资源和消耗性资源

1)可重用性资源
可重用性资源是一种可供用户重复使用多次的资源。具有如下性质:
(1)每一个可重用性资源中的单元只能分配给一个进程使用,不允许多个进程共享。
(2)进程使用可重性资源的顺序:①请求资源。如果请求失败,请求进程将会被阻塞或者循环等待。②使用资源③释放资源
(3)系统中每一类可重用性资源中的单元数目都是相对固定的,进程在运行期间既不能创建也不能删除它。
对资源的请求和释放通常都是利用系统调用完成的。
2)可消耗性资源
可消耗性资源又被称为临时资源。是在进程运行期间由进程动态的创建和消耗的。具有如下性质:
(1)每一类可消耗性资源的单元数目在进程运行期间是可以不断变化的,有时可以有许多,有时可以为0。
(2)进程在运行过程中,可以不断的创造可消耗性资源的单元,将它们放入该资源类的缓冲区中,以增加该资源类的单元数目。
(3)进程在运行过程中,可以请求若干个可消耗性资源单元,用于进程自己的消耗,不再将它们返回给该资源类中。

2.可抢占性资源和不可抢占性资源

1)可抢占性资源
对于可抢占性资源,进程在获得这类资源后,该资源可以再被其它进程或者系统抢占。CPU和主存都属于可抢占性资源,对于这类资源是不会引起死锁的。
2)不可抢占性资源
对于不可抢占性资源,一旦系统把资源分配给该进程后,就不能将它强行进行回收,只能在进程用完后自行释放。

3.死锁定义

如果一组进程中的每一个进程都在等待仅由改组进程中的其他进程才能引发的事件,那么改组进程是死锁的。

二、死锁产生的原因和必要条件

1.死锁产生的原因

死锁的起因主要是因为多个进程对资源的抢占,对不可抢占资源进行争夺会引起死锁,对可消耗性资源进行争夺时,也会引起死锁。
(1)竞争不可抢占性资源引起死锁
如果有两个进程P1和P2,和两个不可抢占性资源val1和val2,如果此时P1和P2分别拥有val1和val2而此时P1和P2在拥有现有资源情况下,又要去获取对方拥有的资源,那么就会产生死锁。
(2)竞争可消耗资源引起死锁
信号量本身就可以当作一个可消耗资源。对于可消耗资源的竞争一般来说都会伴随着生产者和消费者,如果可消耗资源没有办法生产了,而进程去抢占这个可消耗资源就会引起死锁。
此外进程推进顺序不当也引起死锁。而顺序推进不当会造成以上所说的两种结果。

2.死锁产生的必要条件

(1)互斥条件。即一个资源在某一段时间内只能被一个进程占用,如果此时有其他进程请求该资源,则请求只能进程只能等待,直至占有该资源的进程用完释放。
(2)请求和保持。进程已经拥有了至少一个资源,但是又提出新的资源请求,而该资源已经被其他资源占用,此时请求被阻塞,但是对自己已经获得的资源保持不放。
(3)不可抢占条件。进程已经获得的资源在未使用完之前不能被抢占,只能在进程使用完时由自己释放。
(4)循环和等待条件。发生死锁时,一定存在着一个进程——资源的循环链。

三、预防死锁的方法

互斥条件是非共享设备所必须的,不仅不能改变,还应该加以保证。因此预防死锁的三种方法就是破坏产生死锁的必要条件中的后三个,即请求与保持、不可抢占、循环等待。

1.破坏“请求和保持”条件

破坏该条件必须要满足:当一个进程在请求资源时,它不能持有不可抢占资源。达到该行为可以采用以下两种方法中的任意一个:
(1)所有进程在开始之前,一次性申请其在整个运行过程中所需要的全部资源。也就是进程运行期间,不会再申请资源,破坏了请求条件。只要有一种资源不满足进程的要求,即使其他所需要的各资源都空闲也不分配给该进程,而是让该进程等待。也就是说该进程在等待期间未占有任何资源,破坏了保持条件。
优点: 简单、安全。
缺点:
资源被严重浪费。进程在一开始时就一次性占用整个运行过程中所需要的资源,其中有些资源可能仅在运行快结束时才使用,而这个进程却在整个运行期间都在占用。
进程经常会发生饥饿现象。因为仅当进程在获得了其所需的全部资源后才能开始运行,这样就可能由于个别资源长期被其他进程占用,而导致等待该资源的进程迟迟不能开始运行。
(2)允许一个进程只获得运行初期所需要的资源后便开始运行,进程运行过程中再逐步释放已分配给自己的、且已用完的全部资源,然后再请求新的所需资源。
这个方法比第一种方法好。因为这个主要点在于申请其他资源时,首先将自己已经用完的资源给释放掉。但是这个还有一点就是,没有提及自己占用但是没有使用完的资源。自己占用但是还没用完的资源不释放的话,仍然有可能造成死锁。这个可以用下面的“破坏不可抢占条件”解决。

2.破环“不可抢占”条件

当一个已经保持了某些不可被抢占资源的进程,提出新的资源请求而不能得到满足时,它必须释放已经保持的所有资源。等以后需要时再重新申请。这意味着进程所占有的资源会被暂时的释放或者被抢占。从而破坏不可抢占条件。
缺点:方法实现复杂,代价大。因为一个资源的释放可能意味着之前利用该资源做的事情可能会失效,后面需要重新做。

3.破坏“循环等待”条件

对系统所有资源类型进行线性排序,并且赋予不同的序号。即规定程序必须按照一定的顺序来请求资源。假设给每个资源设定一个序号,规定每个进程必须按照序号递增的顺序来请求资源,假设进程a现在拥有序号3的资源,那么该进程可以请求序号在3以后的资源,如果需要多个同类资源单元,则必须一起请求。如果该进程想请求一个低序号的资源,必须先释放所有具有相同或者更高序号的资源后,才能申请低序号的资源。
所以重点都在如何确定资源的序号。一般都是根据进程需要的资源的先后顺序来确定资源的序号。