• 操作系统 - 《银行家算法》


    (一)安全序列

    你是一位成功的商人,手里掌握着 100 个w的资金
    有三个企业想找你贷款,分别是 企业 B 、企业 A 、企业 T ,为描述方便,简称 BAT
    B 表示:“咱们的项目很有前景,大哥,我最多会跟你借 70w
    A 表示:“大哥,你真是义薄云天的好大哥,我最多会跟你借 40w
    T 表示:“大哥,我,我我最多会跟你借 50w
            然而…在哥谭的 江湖中有个不成文的规矩:如果你借给企业的钱总数达不到企业提出的最 大要求,那么不管你之前给企业借了多少钱,那些钱都拿不回来了
      情景1:刚开始, BAT 三个企业分别从你这儿借了 20 10 30 w, 手里还有:40w,此时… A 还想借 20 w,你敢借吗?
        假如答应了A的请求…… 之后按T  ==> B==> A的顺序借钱是OK的,因为此时借走之后手里还有:20w,可以先把20w全部借给T,等T把钱全部 还回来了,手里就会有20+30=50w,再把这些钱全借给B,B还钱后总共有 50+20=70w,最后再借给A。(完全实现资金的自由流动,But投资有风险,需谨慎)
    最大需求
    已借走
    最多还会
    B702050
    4010+20=3040-30=10
    T503020

    情景2:刚开始,BAT三个企业分别从你这儿借了 201030 w,手里还有:40w,此时… B 还想借 30 w,你敢借吗?

       给B借30亿是不安全的…之后手里只剩10w,如果BAT都提出再借20w的请求,那么任何一个企业的需要都得不到满足。
    最大需求
    已借走
    最多还会
    B7020+3070-50=20
    401030
    T503020

    安全序列:

            所谓 安全序列 ,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是 安全状态 。当然, 安全序列可能有多个
            如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了 不安全状态 。这就意味着之后 可能 所有进程都无法顺利的执行下去。当然,如果有进程提前归还了一些资源,那 系统也有可能重新回到安全状态 ,不过我们在分配资源之前总是要考虑到最坏的情况。
            如果系统处于 安全状态 ,就 一定不会 发生 死锁 。如果系统进入 不安全状态 ,就 可能 发生 死锁
    (处于不 安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)
            因此可以 在资源分配之前预先判断这次分配是否会导致系统进入不安全状态 ,以此决定是否答应资源分配请求。这也是“ 银行家算法 ”的核心思想。

    (二)银行家理论入门

    概念:

            银行家算法(Banker’s Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。
      在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。在操作系统中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程。
      银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。
      

    进一步阐述:

            当进程申请资源时,银行家算法通过模拟分配资源给该进程,然后判断这种模拟分配后的系统是否安全。若不安全,则撤销模拟分配,并让该进程继续等待。

    要确定系统是否安全,我们需要参考以下组件:

    以下组件:

    进程Pi

      MAX:进程Pi的最大需求资源数量。
      Allocation:已经分配给该进程的资源数量。
      Need:进程还需要的资源数量,即`Need = MAX - Allocation`。

    Available:当前的空闲资源数量。系统中的总资源量等于资源池的剩余资源量加上已经分配给所有进程的资源。

            当资源P1申请资源时,银行家算法首先模拟分配资源给它。只有当申请的资源数量小于或等于Available时,这种模拟分配才会进行。然后,算法会检查分配给P1后的剩余资源是否能够满足至少一个进程的需求。如果没有一个进程可以完成并释放资源,那么系统将处于不安全状态,因为随着时间的推移,所有的进程都可能被阻塞,导致死锁。

            但是,如果有一个或多个进程可以使用剩余的资源完成,我们可以模拟地回收这些进程的资源并继续检查其他进程。这种模拟过程的目的是找到一个可能的进程执行序列,这些进程可以依次完成并释放它们的资源,使得其他进程也能够完成。

            通过上述模拟分配和回收过程,我们可以生成一个安全的进程序列,例如{P0, P3, P2, P1}。这表示我们首先满足P0的需求,然后从P0回收资源,接着满足P3的需求,依此类推。这样的序列表明我们可以安全地分配资源而不会导致死锁。

     

    总结: 

            银行家算法以及如何使用该算法判断系统是否处于安全状态,从而避免死锁。简要地说,当进程请求资源时,银行家算法会尝试为该进程分配资源。但在正式分配之前,算法会先判断,如果现在为该进程分配资源,系统是否仍然处于一个“安全”的状态。

            "安全"的状态意味着即使为某个进程分配了资源,也仍有足够的资源满足其他进程的最大需求,这样就不会因为某个进程霸占资源而导致其他进程无法完成。如果所有进程都能够完成,并且按照某种顺序释放它们的资源,这样其他等待的进程就能继续完成,那么系统就被认为是“安全”的。反之,如果存在任何一个进程不能完成,那么系统就可能进入死锁状态。

            为了确定系统是否处于安全状态,银行家算法使用了一个简单的测试。算法首先检查是否有一个进程其所需的资源小于等于可用资源。如果有,算法就会假定资源被该进程请求,并将该进程标记为完成。然后,假设该进程在完成后释放了它所有的资源。这个过程将继续,直到所有进程都被标记为完成,或者没有进程可以被标记为完成。

            如果所有进程都被标记为完成,那么系统就处于安全状态。否则,系统就可能会死锁。

            总之,银行家算法的关键思想是,通过模拟进程请求和释放资源的情况来预测是否可能发生死锁。如果模拟过程中发现可能会有死锁,那么算法就不会为请求的进程分配资源。

    (三)银行家算法经典习题(***)

    解答:

    (1)计算Need矩阵,对应相减:Max-Allocation

    (2)根据题意,计算出对应的Available

    (3)找安全序列,一个就行了

    (4)其他(可不写)

    2.

    答:

    (1)

    肯定是安全的,安全序列:P0 ,3 ,4,1,2

    或者  0   ,3    ,1 ,   2,   4

    或者0   ,3    ,1 ,   2,   4

  • 相关阅读:
    【浅学Java】三次握手 / 四次挥手
    OpenSSL生成PKCS#8私钥和公钥
    封装一个vue3 Toast组件,支持组件和api调用
    了解一下Monorepo
    前端 webSocket 的使用
    00_socket_demo
    echarts学习:基本使用和组件封装
    盘一盘这个没资格出现在面试环节的场景题。
    AI视频教程下载-1小时ChatGPT提示基础课程
    【数据结构与算法】之深入解析“两个有序数组的第K小乘积”的求解思路与算法示例
  • 原文地址:https://blog.csdn.net/qq_63976098/article/details/133957267