进程死锁与银行家算法
目录
前言
工作中遇到的问题。
一、死锁是什么?
1. 官方解释
进程管理是操作系统的核心,但如果设计不当,就会出现死锁的问题。如果一个进程在等待一件不可能发生的事。则进程就死锁了。而如果一个或多个进程产生了死锁,就会造成系统死锁。
2. 通俗的来讲
系统当中有一系列的资源,有一系列需要用到这些资源的进程,这些进程需要系统给它们分配资源来能够运行。如果说系统在某一时刻发现所有的可用资源都已经分配出去了,而所有进程都没有完成它本身的职责任务,从而释放它已经占有的资源,所有的进程都在等待其他进程给它释放资源,这就会产生死锁,导致系统无法正常的完成任务。
二、死锁的条件与避免
1. 举例
例:系统有3个进程:A、B、C。这3个进程都需要5个系统资源。如果系统至少有多少个资源,则不可能发生死锁。
至少需要资源数 = 进程数 * (每个进程所需的资源数-1)+ 1
答:系统至少需要13个资源,则不可能发生死锁。
2. 死锁的条件与避免
2.1 死锁的条件
四大条件缺一不可,缺一个则不会产生死锁。
- 互斥:不可以同时使用一个资源。
- 保持与等待:各种进程会保持自己的资源,并且等待别人释放更多的资源。
- 不剥夺:系统不会把一个系统的资源剥夺掉,分配给其他进程。
- 环路等待:A等待B释放资源,B等待C释放资源,C等待A释放资源。
死锁的预防就是去打破这四大条件。
2.2 银行家算法(Banker's Algorithm)
银行家算法可以避免死锁。
- 介绍: 就是用银行家放贷的思路来解决。对银行家而言,所谓的资源就是钱。他分配这些资源出去,也就是放贷出去,他需要考虑:“我能不能按时收得回来”。如果说一评估发现收不回来,银行家就不会放这笔贷款出去。
- 分配资源的原则:
- 当一个进程对资源的最大需求量不超过系统中的资源数时可以接纳该进程;
- 进程可以分期请求资源,但请求的总数不能超过最大需求量;
- 当系统现有的资源不能满足进程尚需资源数时,对进程的请求可以推迟分配,但总能时进程在有限的时间里得到资源;
2.3 银行家算法的数据结构
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]
2.4 银行家算法的算法原理
我们可以把系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:
(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
(2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量;
(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.
系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。
2.5 算法实现
初始化
由用户输入数据,分别对可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED赋值。
银行家算法
在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。
设进程cusneed提出请求REQUEST [i],则银行家算法按如下规则进行判断。
(1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],则转(2);否则,出错。
(2)如果REQUEST [cusneed] [i]<= AVAILABLE[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=Work+ALLOCATION;
Finish=true;
GOTO 2
(4)如所有的进程Finish= true,则表示安全;否则系统不安全。
银行家算法流程图
总结