面试题答案
一键面试银行家算法基本原理
银行家算法是一种资源分配与死锁预防算法,其原理基于资源分配的安全性检查。将系统资源比作银行家的资金,进程请求资源类似客户贷款。银行家在满足客户贷款请求前,会先检查这笔贷款是否能使系统仍处于安全状态(即能找到一个安全序列,使所有进程都能顺利完成),若能则分配,否则拒绝。
在给定系统中判断安全状态的具体步骤
- 数据结构初始化:
- 假设有5个进程
P0
,P1
,P2
,P3
,P4
,3种资源R0
,R1
,R2
。 - 定义以下数据结构:
Available
:长度为3的数组,表示当前每种资源的可用数量。Max
:5×3的二维数组,表示每个进程对每种资源的最大需求。Allocation
:5×3的二维数组,表示当前每个进程已分配到的每种资源数量。Need
:5×3的二维数组,Need[i][j]=Max[i][j] - Allocation[i][j]
,表示每个进程还需要的每种资源数量。
- 假设有5个进程
- 标记进程:
- 定义一个长度为5的布尔数组
Finish
,初始值都为false
,表示每个进程是否已完成。 - 找到一个
Finish[i]
为false
且Need[i][j] <= Available[j]
(对所有j = 0, 1, 2
)的进程Pi
。
- 定义一个长度为5的布尔数组
- 资源分配与更新:
- 如果找到这样的进程
Pi
,则假设将资源分配给它,即Available[j]=Available[j]+Allocation[i][j]
(对所有j = 0, 1, 2
),并将Finish[i]
设为true
。 - 重复步骤2,继续寻找下一个满足条件的进程。
- 如果找到这样的进程
- 判断安全状态:
- 如果所有进程的
Finish
值最终都能变为true
,则系统处于安全状态,存在一个安全序列;否则,系统处于不安全状态。例如,可能存在某个进程一直无法满足其资源需求(即找不到满足Need[i][j] <= Available[j]
条件的进程),此时系统不安全。
- 如果所有进程的