背景与设定
一个银行家手握一定数量的钱,有三个人来借。但是这些钱不够一次性全部满足借贷者,所以需要合理安排借贷顺序,按顺序满足借贷者,且最终收回的钱数和开始拥有的钱相同。(每名借贷者只有总需求全部满足时,才会一次性把这些钱都还给银行家;没有利息)
将这种设定平移到OS给各进程分配资源。值得注意的是,钱只是一种资源,但OS中有多种种类的资源,将单个的数字改为向量(数组)表示各资源数量,如(1,2,3)表示三类资源的数目分别是1,2,3:
Max数组:各进程所需要的最大资源数目。这个数目在整道题目中不变
Allocation数组:各进程分配到的资源数目。在初始时刻,各资源已分配到一定的资源。在OS分配资源的过程中,Allocation的值会随新分配资源而变化
Max数组:,即系统仍需要的最大资源数目。
Available数组:初始时刻时,OS的可用资源数目。初始时刻可用资源数目。OS可用资源总数目的初始值和成功分配给全部进程并收回资源后的值是相等的,可用于检查计算对错。
Work数组:除了初始时刻外的每一时刻,OS的可用资源数目。在安全检查算法中,只出现Work,不出现Available。事实上,有些课本认为每一时刻的OS可用资源数目都为Available,本文按照汤小丹《计算机操作系统》书写这部分内容,认为只有初始时刻的OS可用资源数目为Available。
Request数组:有时候,进程并非只是等待Need被满足,而是会提出对各资源的新申请。
Finishi数组:布尔变量,成功分配到全部资源的进程的Finish置为true,各进程的Finish初值都为false
题型与细节
补充一下上述向量大小的判断:一个小就都小,有分量大有分量相等但没有小于就是大于,各分量都相等才相等。如(4,2,0)>(1,1,0),(5,8,1)<(4,3,9)
判断初始时刻系统是否处于安全状态: 检查是否存在一个安全序列,即按照该顺序可依次满足各进程的需求。安全序列一般不唯一,找到一个就行。判断步骤:
银行家算法是一种用于避免死锁的资源分配算法。它通过安全性检查来确定系统是否处于安全状态,以确保分配资源不会导致死锁的发生。下面是银行家算法中的安全性检查步骤:
- 找到一个未完成的进程P,满足以下条件:P的需求量Need[i] <= Available[i],对于所有的资源类型i。 如果满足上述条件,则假设P执行完毕并释放它所占有的资源。
- 将P释放的资源添加到Available中。
- 重复步骤1和2,直到找不到满足条件的进程。
图中用下标k表示序号为k的进程的相关向量
如果所有进程都能够找到满足条件的执行顺序,则系统处于安全状态;否则,系统处于不安全状态。
Request申请可能合理也可能不合理,分两步判断:先判断是否成立,即进程申请的资源数目不能大于进程所需的最大资源数目;若成立,再判断是否成立,即进程申请的最大资源数目不能大于系统该时刻的可用资源数目(认为分配那一刻为初始时刻)。
Request合理也不一定能分配,因为分配后的系统可能处于不安全状态。先假装分配(即进行预分配),将分配后这一刻作为初始状态,利用安全性算法进行检查发,若能找到一个安全序列,说明系统处于安全状态,可以立即分配。
例题与解析
OS中三类资源总量为(10,5,7),T0时刻资源分配情况如表:
Max | Allocation | Need | Available | |
P0 | (7,5,3) | (0,1,0) | (7,4,3) | (3,3,2) |
P1 | (3,2,2) | (2,0,0) | (1,2,2) | |
P2 | (9,0,2) | (3,0,2) | (6,0,0) | |
P3 | (2,2,2) | (2,1,1) | (0,1,1) | |
P4 | (4,3,3) | (0,0,2) | (4,3,1) |
Available=总量-Allocation=(10,5,7)-[(0,1,0)+(2,0,0)+(3,0,2)+(2,1,1)+(0,0,2)]=(3,3,2),将计算结果填入表中。
(1)判断T0时刻的安全性
分析:(3,3,,2)<(1,2,2),先分(1,2,2)给P1,P1用完了把自身占用的全部资源还给OS,OS有(3,3,2)+(2,0,0)=(5,3,2)新分出去的又还回来,一减一加不变,进程还回后的OS资源持有量=新分前的资源持有量+新分前的进程资源持有量即work=work(available)+allocation。(5,3,2)>(0,1,1),给P3,P3用完还给OS,OS有(5,3,2)+(2,1,1)=(7,4,3);(7,4,3)=(7,4,3),全给P0,P0用完还给OS,OS有(7,4,3)+(0,1,0)=(7,5,3);(7,5,3)>(6,0,0),给P2,P2用完还OS,OS有(7,5,3)+(3,0,2)=(10,5,5);(10,5,5)>(4,3,1),给P4,P4用完还OS,OS有(10,5,5)+(0,0,2)=(10,5,7),与题干所给值相等,计算正确,存在安全序列{P1,P3,P0,P2,P4},系统安全。
解题过程:利用安全性算法对系统资源分配情况进行检查:
Work | Need | Allocation | Work+Allocation | Finish | |
P1 | (3,3,2) | (1,2,2) | (2,0,0) | (5,3,2) | true |
P3 | (5,3,2) | (0,1,1) | (2,1,1) | (7,4,3) | true |
P0 | (7,4,3) | (7,4,3) | (0,1,0) | (7,5,3) | true |
P2 | (7,5,3) | (6,0,0) | (3,0,2) | (10,5,5) | true |
P4 | (10,5,5) | (4,3,1) | (0,0,2) | (10,5,7) | true |
存在安全序列{P1,P3,P0,P2,P4},故系统安全
(2) 若P1请求资源(1,0,2),能否分配?
(1,0,2)<(1,2,2)且(1,0,2)<(3,3,2),可进行预分配
预分配后初始时刻变为:
Max | Allocation | Need | Available | |
P0 | (7,5,3) | (0,1,0) | (7,4,3) | (2,3,0) |
P1 | (3,2,2) | (3,0,2) | (0,2,0) | |
P2 | (9,0,2) | (3,0,2) | (6,0,0) | |
P3 | (2,2,2) | (2,1,1) | (0,1,1) | |
P4 | (4,3,3) | (0,0,2) | (4,3,1) |
同(1)中的安全性算法检查如下
Work | Need | Allocation | Work+Allocation | Finish | |
P1 | (2,3,0) | (0,2,0) | (3,0,2) | (5,3,2) | true |
P3 | (5,3,2) | (0,1,1) | (2,1,1) | (7,4,3) | true |
P4 | (7,4,3) | (4,3,1) | (0,0,2) | (7,4,5) | true |
P2 | (7,4,5) | (6,0,0) | (3,0,2) | (10,4,7) | true |
P1 | (10,4,7) | (7,4,3) | (0,1,0) | (10,5,7) | true |
存在安全序列{P1,P3,P4,P2,P1},系统安全,可以立即将资源(1,0,2)分配给P1
(3)在(2)的基础上,P4请求资源(3,3,0),能否分配?
(3,3,0)<(4,3,1)但(2,3,0)<(3,3,0),不能分配
本题节选自课本例题,原文没有红字但通过其步骤,显然是在上一问的基础上进行的。在各小问中,若某一问的判断结果是按申请分配后系统处于安全状态,则后续小问默认在此基础上进行。在正式考试中,每个关于申请资源的小问前一般会注明“在上一问的基础上”
还有一种常见的不能进行分配的情况是: 预分配后,Available不能满足任何进程的Need