银行家算法

            1965年Dijkstra根据“银行家为顾客贷款”的思想提出了另一种保证系统杜绝死锁的方法(被称为银行家算法)。银行家有一笔资金,n个顾客需要银行家提供贷款。顾客所需的资金可根据顾客的要求分期付给。如果顾客获得全部资金,肯定在一定时间内会将资金全部归还给银行家。由于n个顾客所需资金总数通常比银行家拥有的资金多(当然每个顾客要求的资金总数应小于等于银行家拥有的资金),因此给顾客提供资金时需要仔细斟酌,以免顾客得不到所要的全部资金而造成资源可能无法回收)。

           利用银行家算法来提供死锁避免,就是通过确保系统随时处于安全状态来防止死锁的!
           安全状态定义:设系统中有n个进程,若存在一个序列〈P1,P2…Pn〉使得Pi(i=1,2…n)以后还需要的资源可以通过系统现有资源加上所有Pj(j<i)占有的资源来满足 ,则称这个系统处于安全状态,序列〈P1, P2…Pn〉称为安全序列。
            举例描述:设银行家有10万贷款,P,Q,R分别需要8,3,9万元搞项目(假设任何人满足资金总额后都会归还所有贷款,以万元为单位申请)。如果P已申请到了4万,Q要申请2万,R要申请4万,显然,如果满足Q的申请,有安全<P,Q,R>  /<Q,P,R>。 然而,如果满足R的申请,则不存在安全序列。由此引导Q先被贷。
             扩展的银行家算法描述:
            n:系统中的进程个数。m:系统中的资源类型数
            Available(1:m):现有资源向量。Available(j)=k表示有k个未分配的j类资源。
            Max(1:n,1:m):资源最大申请量矩阵。Max(i,j)=k表示第i个进程对第j类资源的最大申请量为k.
            Allocation(1:n,1:m):资源分配矩阵。
            Allocation(i,j)=k表示进程i已占有k个j类资源。
            Need(1:n,1:m):进程以后还需要的资源矩阵。Need(i,j)=k表示第i个进程以后还需要k个第j类资源。显然Need=Max-     Allocation
            Request(1:n,1:m):进程当前申请资源矩阵。Request(i,j)=k表示进程i正申请k个第j类资源
            源分配程序的工作过程:
            当进程提出资源申请时,系统首先检查该进程对资源的申请量是否超过其最大需求量及系统现有资源能否满足进程需要。若能则进一步检查:若把资源分给该进程系统能否处于安全状态。若安全则分配,否则置该进程为等待资源状态。为简单起见,记Ai为A(i,1),A(i,2)…A(i,m)。其中A为n×m矩阵。
            定义长度为m的向量 X、Y间的关系为:
                                                         X≤Y当且仅当X(i)≤Y(i)(i=1,2…m)
            设进程i申请资源,申请资源向量为Requesti,则有如下的资源分配过程:
                1、如果Requesti>Needi则报错返回。
                2、如果Requesti >Available,则进程i进入等待资源状态,返回。
                3、假设进程i的申请已获准,于是修改系统状态:
                         Available =Available - Requesti
                         Allocationi= Allocationi + Requesti
                         Needi = Needi - Requesti
                4、调用安全状态检查算法。
                5、若系统处于安全状态,则将进程i申请的资源分配给进程i,返回。
                6、若系统处于不安全状态,则进程i进入等待资源状态,并恢复系统状态后返回:
                         Available =Available+ Requesti
                            Allocationi = Allocationi - Requesti  Needi = Needi + Requesti
       安全状态检查算法:
            设Work(1:m)为临时工作向量。初始时Work=Available.令N={1,2…n}
            1、寻找j∈N使其满足Needj≤Work,若不存在这样的j则转(3)
            2、Work =Work+Allocationj  N =N-{j},转(1)
            3、如果N为空则返回(系统安全);如果N 不为空则返回(系统不安全)。
           
             死锁检测算法:
             设Work(1:m)为临时工作向量。初始时Work=Available.令N={1,2…n}
             (1)寻找j∈N使其满足Requestj≤Work,若不存在这样的j则转(3)
             (2) Work =Work+Allocationj  N =N-{j},转(1)
             (3)如果N为空则无死锁;如果N不为空则有死锁,N就是处于死锁状态的进程集合






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值