在学习银行家算法的时候,我把 银行家算法 和 安全性算法 这两个概念搞混过,因此在这里做一个总结。
1.联系
银行家算法 = 检查进程的请求是否合理 + 试探性满足进程请求 + 用安全性算法检查此后系统是否处于安全状态
安全性算法 是 银行家算法 的核心。
2. work向量的作用
一开始看书的时候,我一直很疑惑为什么要有个和初值和 available 相等的向量?直接用 available不好么?
其实在这里,work就是用来作为available的副本,就是在寻找安全序列的过程中充当 available的角色(相当于用一个假假的available进行模拟试探)。
如果使用work的话,在寻找安全序列的过程中发现某个序列的一部分不满足条件时,可以停止该序列的构建,回退,还原work到之前的状态,并重新开始检查其他未完成的进程。可想而知,如果回退到序列的第一个进程之前,我们的work需要还原到最初的available值。
因此我们可以看到,work就像一个临时变量,如果直接用available的话,如果某一次尝试分配失败,你要从头开始重新尝试的时候,你的available已经不是原来的了(丢失原来的值)。
3. 一个错题的分享(25王道OS,P161 30.)
这一题我选的D。因为我看书上关于银行家算法的描述里面,只需要判断现存资源量available能满足本次的request量,并不需要让available与Need比较。所以我的理解是不需要满足尚需的最大资源量。
书上讲解如下:
但是事实上,我理解错误的地方在于题中所问是“检测到()时才分配资源”。
回忆一下开头所讲:
银行家算法 = 检查进程的请求是否合理 + 试探性满足进程请求 + 用安全性算法检查此后系统是否处于安全状态
题目这里问的已经是 安全性算法检查 时的步骤了,检查一通过就可以分配资源。而在安全性检查的过程中,我们要做的就是 不断寻找 Need < Work的行,即选项中所谓 能满足尚需的最大资源量。
以上所讲仅为帮助个人易于理解,很多地方缺乏严谨的表述。嗯,理解意思就行了,请多包涵。