面试临近,最近复习操作系统中,银行家算法是面试常考点。
银行家算法是为了避免死锁。
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。为保证资金的安全,银行家规定:
- 当一个顾客对资金的最大需求量不超过银行家现有的资金就可以接纳该顾客
- 顾客可以分期贷款,但贷款总数不能超过最大的需求量
- 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款
- 当顾客得到所需的全部资金后,一定能在规定时间里归还所有的资金
银行家算法中的数据结构
- 可利用资源向量Available
这是一个含有m个元素的数组,其中每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态的改变。如果Available[j]=K,则表示系统中现有Rj类资源K个。
- 最大需求矩阵Max
- 分配矩阵Allocation
这是一 个nxm的矩阵,它定义了系统中每一类资源当前已分配给每一个进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K
- 需求矩阵Need
上述三个矩阵之间存在下述关系:Need[i,j]=Max[i,j]-Allocation[i,j]
银行家算法的设计
设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:
1.如果Requesti[j]<=Need[i,j],便转向步骤(2);否则认为出错,因为它所需要的资源数已经超过它所宣布的最大值。
2.如果Requesti[j]<=Available[j],便转向步骤(3);否则,表示尚无足够资源,Pi须等待。
3.系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:
Available[j]=Available[j] - Requesti[j]
Allocation[i,j]=Allocation[i,j] + Requesti[j]
Need[i,j]=Need[i,j]-Requesti[j]
4.系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态。
安全性算法
系统所执行的安全性算法可描述如下:
1.设置两个向量:
- 工作向量Work,它表示系统可提供给进程继续运行所需的各类资源的数目,它含有m个元素,在执行安全算法开始时,Work=Available
- Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]=flase 当有足够资源分配给进程时,再令Finish[i]=true
- Finish[i]=false
- Need[i,j]<=Work[j] 若找到,执行步骤(3),否则,执行步骤(4)
- Work[j]=Work[j]+Allocation[i,j]
- Finish[i]=true
- go to step 2
4.如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。
程序流程图
1.初始化算法流程图
2.银行家算法流程图
3.安全性算法流程图