死锁的原因,避免及预防

来源:互联网 发布:通达信ssrp指标源码 编辑:程序博客网 时间:2024/04/28 14:35
1、死锁:
什么是死锁?
死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。
2、死锁产生的原因:
(1)竞争不可抢占性资源;
竞争可消耗资源;
进程推进顺序不当;
(2)其根本原因是:系统资源不够 
(3)产生死锁的四个必要条件:

# 互斥条件:一个资源每次只能被一个进程使用。
# 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
# 不可抢占条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
# 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
3、处理死锁的办法
预防死锁;
避免死锁;
检测死锁;
解除死锁;
预防死锁:预防死锁的办法是通过产生破坏产生死锁的四个必要条件的一个或几个。其中互斥条件是非共享设备所必须的,不能够改变,还用加以保证,因此 主要破坏产生死锁的后三个条件。
(1)请求与保持条件:两个协议保证;
(2)不可抢占条件:该进程已占有的资源再次请求时不能够满足必须释放当前已有的资源,即被抢占了,破坏“不可抢占”条件;
(3)循环等待条件:
避免死锁:同是属于事先预防策略,破坏产生死锁的必要条件,而是在资源动态分配过程中,防止系统进入不安全状态,以避免发生死锁,主要方法是银行家算法来避免发生死锁;
银行家算法:(Dijkstra算法)

我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:
(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
(2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量;
(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.

银行家算法数据结构

1)可利用资源向量Available   

是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目。如果Available[j]=K,则表示系统中现有Rj类资源K个。   

2)最大需求矩阵Max   

这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。   

3)分配矩阵Allocation   

这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的 数目为K。   

4)需求矩阵Need。   

这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。   

Need[i,j]=Max[i,j]-Allocation[i,j] 

 

算法 的实现

一、初始化

由用户输入数据,分别对可利用资源向量矩阵AVAILABLE 、 最大需求矩阵MAX 、分配矩阵ALLOCATION、 需求矩阵NEED 赋值。

二、银行家算法

在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。

银行家算法的基本思想是分配资源之前, 判断系统是否是安全的; 若是, 才分配。它是最具有 代表性的避免死锁的算法。

设进程cusneed 提出请求REQUEST [i] ,则银行家算法按如下规则进行判断。

(1) 如果REQUEST [cusneed] [i]<= NEED[cusneed][i] ,则转(2) ;否则,出错。

(2) 如果REQUEST [cusneed] [i]<= AVAILABLE[cusneed][i] ,则转(3) ;否则,出错。

(3) 系统试探分配资源,修改相关数据:

         AVAILABLE[i]-=REQUEST[cusneed][i];

         ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];

         NEED[cusneed][i]-=REQUEST[cusneed][i];

(4) 系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复 原状, 进程等待。

三、安全性检查算法

(1) 设置两个工作向量Work=AVAILABLE;FINISH

(2) 从进程集合中找到一个满足下述条件的进 程,

FINISH==false;

NEED<=Work;

如找到,执行(3) ; 否则,执行(4)

(3) 设进程获得资源,可顺利执行,直至完 成,从而释放资源。

Work+=ALLOCATION;

Finish=true;

GOTO 2

(4) 如所有的进程Finish= true ,则表 示安全;否则系统不安全。

操作系统安全状态和不安全状态:   

安全序列是指一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源

量之和。
如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。
不存在一个安全序列。不安全状态不一定导致死锁。

 

各算法流程图

初始化算法流程图:

银行家算法流程图:

安全性算法流程 图:

 


解除死锁:方法有:人工方法和死锁解除算法(抢占资源、终止或撤销进程);
0 0