死锁---资源、检测和恢复、避免、预防

资源:需要排他性使用的对象怕;随着时间推移,必须获得、使用以及释放的任何东西

可抢占资源:可以从拥有的进程中抢占而不会产生任何副作用,例如、存储器(内存)

不可抢占资源:在不引起相关的计算失败的情况下,无法把它从占有它的进程处抢占过来

死锁与不可抢占资源有关,有关可抢占资源的潜在死锁通常可通过在进程之间重新分配资源而化解。

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

产生死锁的原因

(1)竞争不可抢占性资源。

(2)竞争可消耗资源。

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

(3)进程推进顺序不当

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

如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。一个线程也可引起死锁。

产生死锁的四个必要条件

(1) 互斥条件:一个资源每次只能被一个进程使用。

(2) 请求保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

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

(4) 循环等待条件:系统中若干进程组成环路,该环路中每个进程都在等待下一个进程所占有的资源。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

处理死锁的策略:

(1)忽略该问题。

(2)检测死锁并恢复。

(3)仔细对资源进行分配,动态地避免死锁。

(4)防止死锁:通过破坏引起死锁的四个必要条件。

1、死锁检测和死锁恢复

1.1 死锁检测

首先针对每种资源类型只有一个实例的情况。

构建资源分配图,采用深度优先遍历算法确定是否存在环路:依次将每一个节点作为一棵树的根节点,并进行深度优先搜索,如果再次碰到已经遇到过的节点,那么就算找到了一个环。如果从任何给定的节点出发的弧都被穷举了,那么就回溯到前面的节点。如果回溯到根并且不能再深入下去,那么从当前节点出发的子图中就不包含任何环。如果所有的节点都是如此,那么整个图就不存在环也就是说系统不存在死锁。

第二种情况是每种资源类型还有多个实例的情况

构建向量矩阵,利用向量矩阵算法模拟资源分配。这种算法的第一步是寻找可以运行完毕的进程Pi,该进程的特点是它有资源请求并且该请求可被当前的可用资源满足(R矩阵第i行向量小于A)。这一选中的进程随后就被运行完毕,在这段时间内它释放自己持有的所有资源并将它们返回到可用资源库中(将C矩阵的第i行向量加到A)。然后这一进程被标记为完成。如果所有的进程最终都能运行完毕的话,就不存在死锁的情况。

假设n个进程,m种资源:

E=(E1,E2,...,Em)现有资源向量,

A=(A1,A2,...,Am)可用资源向量,

Cn*m当前分配矩阵,Rn*m请求矩阵,C(ij)表示进程i所持有的资源j的数量,R(ij)表示进程i所需要的资源j的数量。

Ej=Aj+C11+C21+......+Cn1

1.2 死锁恢复

(1)抢占:不通知原进程的情况下,将某一资源从一个进程强行取走给另一个进程使用,接着送回。

(2)回滚:周期性对进程进行检查点检查,即将进程的状态写入一个文件以备以后重启,包括存储映象、资源状态,即哪些资源分配给了哪些进程。新的检查点不覆盖原有的文件,而是写到新文件中。检测到死锁时,从一个较早的检查点开始,将该进程复位到更早的状态。

(3)杀死进程:杀死环中的一个或多个进程;杀死一个环外的进程以释放该进程的资源。(最好杀死可以从头开始重新运行且不会带来副作用的进程)

2、避免死锁

安全状态:没有死锁,并且即使所有进程突然请求对资源的最大需求,页仍存在某种调度次序能使每一个进程运行完毕。

不安全状态并不是死锁。从安全状态出发,系统能保证所有进程都完成,从不安全状态出发没有这样的保证。

2.1 单个资源的银行家算法(能够避免死锁的调度算法)

判断对请求的满足是否会导致进入不安全状态,若是,就拒绝请求,否则,就予以分配。

2.2 多个资源的银行家算法

死锁避免本质上来说是不可能的,因为它需要获知未来的请求,而这些请求是不可知的。

3、死锁预防

3.1 破坏互斥条件

就是在系统里取消互斥。若资源不被一个进程独占使用,那么死锁是肯定不会发生的。但一般“互斥”条件是无法破坏的。因此,在死锁预防里主要是破坏其他个必要条件,而不去涉及破坏“互斥”条件。

3.2 破坏请求并保持条件

在系统中不允许进程在已获得某种资源的情况下,申请其他资源。即要想出一个办法,阻止进程在持有资源的同时申请其他资源。有两种方法:

方法一:所有进程在运行之前,必须一次性地申请在整个运行过程中所需的全部资源。这样,该进程在整个运行期间,便不会再提出资源请求,从而破坏了“请求”条件。系统在分配资源时,只要有一种资源不能满足进程的要求,即使其它所需的各资源都空闲也不分配给该进程,而让该进程等待。由于该进程在等待期间未占有任何资源,于是破坏了“保持”条件。

该方法优点:简单、易行且安全。

缺点:a.资源被严重浪费,严重恶化了资源的利用率。

          b.使进程经常会发生饥饿现象。

方法二:要求每个进程提出新的资源申请前,释放它所占有的资源,然后再尝试一次获得所需的全部资源。

3.3 破环不可抢占条件

允许对资源实行抢占。

方法一:如果占有某些资源的一个进程进行进一步资源请求被拒绝,则该进程必须释放它最初占有的资源,如果有必要,可再次请求这些资源和另外的资源。
方法二:如果一个进程请求当前被另一个进程占有的一个资源,则操作系统可以抢占另一个进程,要求它释放资源。只有在任意两个进程的优先级都不相同的条件下,方法才能预防死锁。

3.4 破坏环路等待条件

(1)保证每一个进程在任何时刻只能占用一个资源,若要请求另外一个资源,它必须先释放第一个资源。

(2)将系统中的所有资源统一编号,进程可在任何时刻提出资源申请,但所有申请必须按照资源的编号顺序(升序)提出。这样做就能保证系统不出现死锁。



猜你喜欢

转载自blog.csdn.net/qq_22238021/article/details/80225459