基本介绍
- 目的:避免死锁
- 死锁避免: 在系统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统可能发生死锁(不安全),则不予分配,否则予以分配
- 安全序列:如果系统按照这种序列分配资源,那么每个进程都能顺利完成,只要能找出一个安全序列,系统就是安全状态,并且,安全序列可能多不止一个
- 如果系统处于安全状态,就一定不会发生死锁,如果系统进入了不安全状态,那么就有可能发生死锁(处于不安全状态未必就是发生了死锁,但发生死锁时一定是不安全状态)
- 因此可以在资源分配前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应分配请求,这也是“银行家算法”的核心思想
名词解释
- 假设有n个进程,m种资源
- Max:最大需求矩阵[所有进程对各种资源的最大需求数]
- Allocation:分配矩阵[系统对所有进程的分配情况,已经分配的资源]
- Need:Need矩阵[表示各进程最多还需要多少资源]
- Available:一维数组[表示目前剩余可用资源]
- Request:数组[表示某次某进程向系统申请的资源量]
算法运行过程
进程 | 最大需求MAX | 已分配Allocation | 最多仍需Need | 剩余可用Available | 资源总数Resources |
---|---|---|---|---|---|
P0 | (7,5,3) | (0,1,0) | (7,4,3) | 初始值:(3,3,2) | (10,5,7) |
P1 | (3,2,2) | (2,0,0) | (1,2,2) | (5,3,2) | |
P2 | (9,0,2) | (3,0,2) | (6,0,0) | (7,4,3) | |
P3 | (2,2,2) | (2,1,1) | (0,1,1) | (7,5,3) | |
P4 | (4,3,3) | (0,0,2) | (4,3,1) | (7,5,5) |
-
Q1:尝试找出一个安全序列
-
A:
- 初始剩余可用Available值:(3,3,2)->在Need矩阵中寻找以比此向量小的一个作为可以划分的对象
- Available(3,3,2)->分配给P1
- P1进程完成后,收回已分配给P1的资源(2,0,0),Available变为(5,3,2)
- Available(5,3,2)->分配给P3
- P3进程完成后,收回已分配给P3的资源(2,1,1),Available变为(7,4,3)
- Available(7,4,3)->分配给P0
- P0进程完成后,收回已分配给P0的资源(0,1,0),Available变为(7,5,3)
- Available(7,5,3)->分配给P4
- P4进程完成后,收回已分配给P4的资源(0,0,2),Available变为(7,5,5)
- Available(7,5,5)->分配给P2
- P2进程完成后,收回已分配给P2的资源(3,0,2),Available变为(10,5,7)
-
得出结论:安全序列为P1->P3->P0->P2->P4
-
Q2:Request请求资源
-
如果Request满足小于等于Need,并小于等于Available,即符合申请的条件
-
那么需要在对应P1的Need和Available序列中做相关的加减法[在Need中减去Request,在Available中加上Request,如图所示]
-
且此刻Allocation也要减去Request
-
然后继续按照Q1的步骤寻找安全序列即可