一句话速通银行家算法

· 浏览次数 : 0

小编点评

**银行家算法** **核心思想:** 1. 设计目标:避免死锁问题。 2. 重要前提:所有任务及所需资源已知。 3. 缺陷:限制并发程度,有些任务必须等待资源充足才能运行。 4. 算法思路:使用多线程来执行任务,并根据资源需求进行调整。 5. 算法步骤: - 检查每个任务的资源需求。 - 每个任务申请资源时,判断是否符合需求。 - 如果满足条件,执行资源分配。 - 循环处理所有任务,直到所有任务完成或资源不足。 6. **安全性验证**:通过一系列检查确保每个任务的执行不会导致死锁。 **简述:** 银行家算法是一种利用多线程来解决死锁问题的算法。它使用资源需求的限制和循环处理来确保资源分配的正确性和安全性。

正文

一句话速通银行家算法:

try 分配资源, if safe() then continue;

                      else 归还资源 并且 sleep(当前任务).

好,本文结束。

hh其实并没有,接下来我将解释这句话以及银行家算法究竟是个啥。

 

ps: 银行家算法是try assign(), 而还有个锁的api是trylock(),大家可以类比着看一下。

 

银行家算法:

1. 设计目标:

  利用内核调度解决(预防)死锁问题.

2. 重要前提:

  假设知晓所有任务及它们所需的全部资源.

3. 缺陷:

  a) 上述假设基本上很难达成,仅在某些特殊场景下适用,如嵌入式开发;

  b) 银行家算法限制了并发程度,有些任务必须等到足够资源时才能运行。

 

4. 算法思路(以进程为例):

参数说明:

       Available[m] : 系统中可用资源数组,有m种资源;

       Max_Need[i][j]:进程i对第j种资源的最大需求数量, 这是个常数数组,是我们假设已经得到的;

  Allocated[i][j]:进程i已被分配第j种资源的数量;

  mayNeedmoreMax[i][j]:进程i对第j种资源最多还需要多少个,由计算得到,(mayNeedmoreMax[i][j] = Max_Need[i][j] – Allocated[i][j]);

 

算法主体(tryAssign, and check safety):

当进程i申请资源时(request[m])

  1) 判断是否 ∀ j 满足 request[j] <= mayNeedmoreMax[i][j],含义是“当前需求值”不能超过“最大可能需求值”, 为什么可以看step3;

  2) 判断是否 ∀ j 满足request[j] <= Available[j], 含义是“当前需求”是否可以被满足, 至于为什么也可以看step3;

  2.5) 若以上两个判断均通过, 则进入step3; 否则sleep当前进程;

  3) try assign, 尝试分配资源:

      i)   Available := Available – request; (数组减法, 简略写)

      ii)  mayNeedmoreMax := mayNeedmoreMax – request;

      iii) Allocated := Allocated + request;

    在step3中, 我们进行了两次数组的减法, 为了确保结果非负, 我们必须进行step1与step2的两次判断;

  4) 判断step3中的try assign是否可行/无死锁/安全,isSafe()?

  4.1) 若isSafe判断通过, 则try assign成立, 就这么分配资源就行;

  4.2) 否则归还系统资源(别忘了归还,相当于回滚状态),并sleep 当前进程。

 

下面进一步说明step4中的安全性/可行性判断函数isSafe():【本函数里发生的都是假想的,并没有真正地分配或回收资源,只是一种可行性验证】

isSafe() {

    1) 初始化:

       Work[m] := Available[m], 新建Available数组的副本

       Finished[n] := {False}, n个进程全部标记为未完成, 或者其他情况

    2) 找到一个( (!Finished[i]) && (∀j|mayNeedmoreMax[i][j]<=Work[j]) )的进程i, 翻译成人话就是:找到一个(未完成的)且(最大所需资源数小于可用资源的)进程;

    2.1) 若能找到, 则执行step3; 否则, 执行step4

    3) (我们(假装)执行完了选中的进程i, 并取回其资源)

       Work := Work + Allocated[i][],

       Finished[i] = true;

       执行step2; (循环)

    4) 如果Finished[]中全是true, 则安全性/可行性检查通过; 否则不通过。

 

其实银行家算法挺麻烦的, 而且据说不常用, 所以大概只要掌握到开篇那句tryAssign的程度, 理解算法核心思想就差不多了吧…

与一句话速通银行家算法相似的内容:

一句话速通银行家算法

一句话速通银行家算法: try 分配资源, if safe() then continue; else 归还资源 并且 sleep(当前任务). 好,本文结束。 hh其实并没有,接下来我将解释这句话以及银行家算法究竟是个啥。 ps: 银行家算法是try assign(), 而还有个锁的api是try

一句话木马——上传+绕过

前期准备 软件:burp,中国蚁剑 环境:酷维网站,VM虚拟机 具体操作 1.网站管理打开,进入bookpic目录(C:\Inetpub\cms\cms\bookpic),添加a.asp文件(一句话木马上传点) 2.调出属性,修改为IP,应用后确定 3.用物理机打开网站,进入admin目录,进入ht

Spring源码系列:初探底层,手写Spring

在学习 Spring 框架源码时,记住一句话:源码并不难,只需要给你各种业务场景或者项目经理,你也能实现自己的 Spring。虽然你的实现可能无法与开源团队相媲美,但是你肯定可以实现一个 0.0.1 版本。因此,初次阅读源码时,不要陷入太深的细节中,先了解大体逻辑,再仔细研读。

需求变更,代码改的像辣鸡 - 论代码质量

一句注释引发的思考 接到一个有鸡毛信般的紧急需求(当然,002的需求向来是如此紧急的):大屏展示原来只有二个品牌数据,现增加到三个品牌的数据。一句话的需求,且没有业务逻辑变更,我认为可以迅雷不及掩耳之势,2小时收拾干净交差。当我满腔激情的定位的核心逻辑部分时,这样一句注释(见下图),让我顿时思绪天马

[BUUCTF][WEB][极客大挑战 2019]Knife 1

这题几乎是送分 题目不断暗示,后台存在一句话木马 拿个蚁剑连上去就完事了 这里用curl 连上去,演示一下,理解一下其中的原理 #注意 phpinfo() 后面的分号不能省 curl -d "Syc=phpinfo();" http://32a31ff6-2815-4485-a74e-e646f67

【Azure 存储服务】Azure Data Lake Storage (ADLS) Gen2 GRS Failover是否支持自动切换或者手动切换到灾备的终结点呢?

问题描述 在Azure的存储服务中,介绍灾备恢复和Storage Account故障转移的文档中,有一句话“Account failover is not supported for storage accounts with a hierarchical namespace enabled.” 而

『手撕Vue-CLI』处理不同指令

前言 在上一篇『手撕Vue-CLI』添加自定义指令中,已经实现了自定义指令的添加,但是指令还是比较简单的,只是简单的打印一句话,那么在实际运用场景中,可能会有更多的需求,比如可能需要在指令中传递参数,或者需要在指令中进行一些复杂的操作,那么这个时候我们就需要对指令进行处理了。 创建指令处理文件 在上

《最新出炉》系列初窥篇-Python+Playwright自动化测试-3-离线搭建playwright环境

1.简介 有些小伙伴或者童鞋们私信留言说自己是在公司局域网办公,或者公司为了安全对网络管控比较严格(尤其是一些大的国企、央企),总之就是一句话无法连到外网去在线下载,宏哥刚看到留言时觉得这问题还留言问啊,你找个有网的电脑下载好安装包然后安装就可以用了。(第一种情况及解决办法:带要搭建环境的电脑到有网

Composite 组合模式简介与 C# 示例【结构型3】【设计模式来了_8】

〇、简介 1、什么是组合设计模式? 一句话解释: 针对树形结构的任意节点,都实现了同一接口,他们具有相同的操作,可以通过某一操作来遍历全部节点。 组合模式通过使用树形结构来组合对象,用来表示部分以及整体层次。组合模式属于结构型模式,多用于递归。 官方意图描述:将对象组合成树形结构,以表示“部分-整体

Bridge 桥接模式简介与 C# 示例【结构型2】【设计模式来了_7】

〇、简介 1、什么是桥接模式? 一句话解释: 通过一个类的抽象,与另一个类的抽象关联起来,当做桥。此后不管两个抽象类的实现有多少种,均可以通过这个桥来将两个对象联系起来。 桥接,顾名思义就是用桥来连接河两岸,将原本不关联的两部分联系起来,且不影响两岸的各自演化,演化出来的不同对象仍可以通过这个桥连接