目录

1.引子

2.安全序列,安全状态与不安全状态

安全序列

安全状态

不安全状态

3.银行家算法


1.引子

你是一位成功的银行家,手里掌握着100个亿的资金…
有三个企业想找你贷款,分别是企业B、企业A、企业T,为描述方便,简称BAT。

B表示:“大哥,我最多会跟你借70亿..”

A表示:“大哥,我最多会跟你借40亿....”  

T表示:“大哥,我最多会跟你借50亿..”


然而...江湖中有个不成文的规矩:如果你借给企业的钱总数达不到企业提出的最大要求,那么不管你之前给企业借了多少钱,那些钱都拿不回来了.刚开始,BAT三个企业分别从你这儿借了20、10、30亿....

此时,再借30亿你B还想敢借给他吗?

如果借给他后,会产生如下情况:

此时的你只剩下10亿的资金,无论借给谁都有可能令钱拿不回来。所以是不安全的。

此时,我们的要求改变了:

此时,A想再借20亿:

起初的情况:

A还想借20亿后:

这时候我们还剩20亿,无论是再借给A,还是T都是安全的,所以无论是T->A->B还是A->T->B的顺序,他们借钱都是可行的。而这个序列就叫做安全序列。


2.安全序列,安全状态与不安全状态

安全序列

安全序列是指在银行家算法中,一种满足系统安全性要求的进程执行顺序。它是一种进程执行的序列,使得每个进程都能在其所需资源得到满足时执行,并在执行完毕后释放资源,而不会发生死锁。

在安全序列中,每个进程按照其所需资源的顺序依次执行,并在执行完毕后释放所占用的资源,这样其他进程才能获取到所需的资源。在执行过程中,系统会动态地检查资源的分配情况,以确保没有进程因为资源不足而被阻塞。

通过找到安全序列,可以保证系统在执行过程中不会陷入死锁状态。安全序列的存在意味着系统中的资源分配是合理的,并且可以满足所有进程的需求,从而确保系统的可靠性和稳定性。

银行家算法的主要目标之一就是找到安全序列,以保证系统的安全状态。如果系统存在安全序列,那么可以按照该序列执行进程并满足资源需求。如果系统不存在安全序列,则需要采取相应的措施,如等待或拒绝新的资源请求,直到系统重新进入安全状态或有其他安全的资源分配方案可用。

总结来说,安全序列是指满足系统安全性要求的进程执行顺序,其中每个进程都能在其所需资源得到满足时执行,并在执行完毕后释放资源,而不会发生死锁。银行家算法的目标之一是找到安全序列,以保证系统的安全状态。

安全状态

安全状态是指在银行家算法中,系统可以找到一种执行顺序(安全序列),使得每个进程都能在其所需资源得到满足时执行,并在执行完毕后释放资源,而不会发生死锁。

当系统处于安全状态时,系统可以有效地分配和管理资源,保证每个进程都能完成执行,并且没有进程因为资源不足而被阻塞。也就是说,存在一种资源分配的顺序,使得每个进程都能按照其最大需求量顺利执行,然后释放占用的资源,同时满足其他进程的需求。

安全状态的特征是存在一个安全序列,即一个进程执行序列,使得系统中的每个进程都能按照其需求得到满足,并在最终释放资源后结束执行。在安全序列中,系统能够满足每个进程对资源的需求,且没有进程会被阻塞或陷入死锁。

通过检查系统的安全性,银行家算法可以确定是否可以安全地分配资源,并避免系统陷入死锁状态。如果系统处于安全状态,新的资源请求可以被满足;如果系统处于不安全状态,则会拒绝新的资源请求,直到系统重新进入安全状态或有其他安全的资源分配方案可用。

总结来说,安全状态是指系统能够找到一种执行顺序,使得每个进程都能在其所需资源得到满足时执行,并在执行完毕后释放资源,而不会发生死锁。银行家算法通过检查系统的安全性来保证资源的有效分配和避免死锁的发生。

不安全状态

不安全状态是指在银行家算法中,系统无法找到一种执行顺序(安全序列),使得每个进程都能在其所需资源得到满足时执行,并在执行完毕后释放资源,可能导致死锁的发生。

不安全状态下,不一定会产生死锁,比如有进程提前归还了一些资源,那么系统可能会重新回到安全状态。

不安全状态下的系统可能陷入死锁,即多个进程互相等待对方所占用的资源,导致它们都无法继续执行。因此,银行家算法的目标是通过检查系统的安全性,确保系统始终处于安全状态,避免死锁的发生。

当系统处于不安全状态时,银行家算法会拒绝新的资源请求,直到系统重新进入安全状态或者有其他安全的资源分配方案可用。

总结来说,不安全状态指的是系统无法找到一种执行顺序,使得每个进程都能在其所需资源得到满足时执行,并在执行完毕后释放资源,可能导致死锁的发生。银行家算法的目标是确保系统始终处于安全状态,避免死锁的发生。


3.银行家算法

银行家算法是荷兰学者Dijkstra为银行系统设计的,以确保银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。后来该算法被用在操作系统中,用于避免死锁。
核心思想:在进程提出资源申请时,先预判此次分配是否会导致系统进入不安全状态。如果会进入不安全状态,就暂时不答应这次请求,让该进程先阻塞等待。


思考:BAT的例子中,只有一种类型的资源――钱,但是在计算机系统中会有多种多样的资源,应该怎么把算法拓展为多种资源的情况呢?
可以把单维的数字拓展为多维的向量。比如:系统中有5个进程 P0~P4,3种资源 R0~R2,初始数量为(10,5,7),则某一时刻的情况可表示如下:、

此时总共已分配(7,2,5),还剩余(3,3,2)可把最大需求、已分配的数据看作矩阵,两矩阵相减,就可算出各进程最多还需要多少资源了。

可以得到最多还需要资源的矩阵:

通过上面的分析,我们可以了解下面的几个概念:

  1. 最大需求矩阵:表示每个进程对各种资源的最大需求量。
  2. 分配矩阵:表示当前已分配给每个进程的资源数量。
  3. 需求矩阵:表示每个进程还需要的资源数量。

 我们现在已知这三个矩阵以后,再用剩余资源与最多还需要资源来进行比较:

思路:我们要尝试找出一个安全序列.......

依次检查剩余可用资源(3,3,2)是否能满足各进程的需求
可满足P1需求,将P1加入安全序列,并更新剩余可用资源值为(5,3,2)
依次检查剩余可用资源(5,3,2)是否能满足剩余进程(不包括已加入安全序列的进程)的需求

 依次检查剩余可用资源(5,3,2)是否能满足剩余进程(不包括已加入安全序列的进程)的需求可满足P3需求,将P3加入安全序列,并更新剩余可用资源值为(7,4,3)。
依次检查剩余可用资源(7,4,3)是否能满足剩余进程(不包括已加入安全序列的进程)的需求.
以此类推,共五次循环检查即可将5个进程都加入安全序列中,最终可得一个安全序列。该算法称为安全性算法。可以很方便地用代码实现以上流程,每一轮检查都从编号较小的进程开始检查。实际做题时可以更快速的得到安全序列。(当剩余可用资源大于最大的最多还需要资源时候,就一定可以得到一个安全序列)。

综上,我们可以对银行家算法进行一个概括:

数据结构:

  • 长度为m的一维数组Available表示还有多少可用资源
  • n*m矩阵Max表示各进程对资源的最大需求数
  • n*m矩阵Allocation表示已经给各进程分配了多少资源
  • Max-Allocation=Need 矩阵表示各进程最多还需要多少资源
  • 用长度为m的一位数组Request 表示进程此次申请的各种资源数

银行家算法步骤:

  • 检查此次申请是否超过了之前声明的最大需求数
  • 检查此时系统剩余的可用资源是否还能满足这次请求
  • 试探着分配,更改各数据结构
  • 用安全性算法检查此次分配是否会导致系统进入不安全状态

安全性算法步骤:

  • 检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收。
  • 不断重复上述过程,看最终是否能让所有进程都加入安全序列。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐