银行家算法原理

简介

银行家算法(Banker’s Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。

数据结构

  1. 可利用资源向量Available:这是一个含有m个元素的数组,每一个元素代表每一类资源可利用的资源数目。如Available[j]=k表示j类资源还有k个可利用。
  2. 最大需求矩阵Max:这是一个n*m的矩阵,它定义了n个进程对m个元素的最大需求。如Max[i][j]=k,表示系统第i个进程对第j个元素的最大需求为k。
  3. 分配矩阵Allocation:这是一个n*m的矩阵,它定义了系统中每一个进程当前获得的资源数。如Allocation[i][j]=k,表示系统第i个进程已经分配了j资源k个。
  4. 需求矩阵Need:这是一个n*m的矩阵,它定义了系统中每一个进程尚需的资源数。如Need[i][j]=k,表示系统第i个进程尚需资源j k个。
    Need[i][j]=Max[i][j]-Allocation[i][j]

银行家算法

银行家算法基本思想是,如果系统中一个进程发出一个资源请求,在请求合理的情况下,先把资源预分配给进程。随后检查预分配后系统的状态是否为安全状态(即没有死锁),若不安全则撤回预分配的资源。其实现原理如下:
先定义一个Request(i)向量表示系统第i个进程请求的资源数。如Request(i)[j]=k,表示系统第i个向量请求j资源k个。当第i个进程发出请求后按如下步骤检查:
1.如果Request(i)[j]<=Need[i][j]便转向步骤2,否则认为出错。
2.如果Request(i)[j]<=Available[i][j]便转向步骤3,否则没有足够资源需等待。
3.请求合理,此时预分配:
Available[i][j=Available[i][j]-Request(i)[j]
Allocation[i][j]=Allocation[i][j]+Request(i)[j]
Need[i][j]=Need[i][j]-Request(i)[j]
4.系统执行安全性算法,检查此次资源分配是否安全。

安全性算法

1.设置两个向量:工作向量Work,具有m个元素,表示系统可提供给进程继续运行所需的各类资源数目,执行算法前Work=Available。Finish向量,含有m个元素,它表示系统是否有足够资源分配给进程使之运行完成。开始时Finish[i]=false,当有足够资源时Finish[i]=ture。
2.从进程集合中找到一个能满足下列条件的进程:
Finish[i]=false
Need[i][j]<=Work[j]
若找到执行步骤3,否则执行步骤4。
3.当进程获得资源后,可顺利运行并完成释放资源,故执行:
Work[j]=Work[j]+Allocation[i][j]
Finish[i]=ture
go to step 2
4.如果所有进程的Finish[i]=ture都满足,则系统处于安全状态,否则处于不安全状态。

代码实现

因为没学过python,所以基本边学边写,然后发现二维数组赋值时总出问题。对二位数组的[i][j]元素赋值时二维数组中所有一维数组的[j]元素都会被赋值。后来发现是定义时候出了问题。一开始我使用 A=[[0]*n]*m 定义一个n行m列所有元素都为0的数组,这样会导致所有一维数组都是一个[0]*n的映射,所以改变一个就都会改变。
话不多说上代码:

def request_():request = Available.copy()x = int(input("请输入请求的进程:"))x = x - 1print("请输入请求的资源数:")for j in range(m):request[j] = int(input())if (request[j] <= Need[x][j] and request[j] <= Available[j]):Available[j] = Available[j] - request[j]Allocation[x][j] = Allocation[x][j] + request[j]Need[x][j] = Need[x][j] - request[j]else:print("请求不合理")def security():Work = Available.copy()Finish = [0]*n##开始全为falseseq=[]for k in range(n):for i in range(n):flag = 1for j in range(m):if Need[i][j] > Work[j]:flag = 0breakif flag == 1 and Finish[i] == 0:for j in range(m):Work[j] = Work[j] + Allocation[i][j]Finish[i] = 1seq.append(i)for i in range(n):if Finish[i]!=1:print("不安全")return Falseprint("存在安全序列:")for i in range(n):print(seq[i])return Trueif __name__ == '__main__':##初始化n = int(input("请输入进程数:"))m = int(input("请输入资源数:"))Available = [0] * mMax = [[0]*m for _ in range(n)]Allocation = [[0]*m for _ in range(n)]Need = [[0]*m for _ in range(n)]for i in range(n):print("请输入第{:x}个程序的各个值:".format(i + 1))print("Max向量:")for j in range(m):Max[i][j] = int(input())print("Allocation向量:")for j in range(m):Allocation[i][j] = int(input())print("请输入Available向量的值:")for i in range(m):Available[i] = int(input())for i in range(n):for j in range(m):Need[i][j] = Max[i][j] - Allocation[i][j]##初始化结束request_()security()"""#测试样例n=5m=3Max=[[7,5,3],[3,2,2],[9,0,2],[2,2,2],[4,3,3],]Allocation = [[0,1,0],[2,0,0],[3,0,2],[2,1,1],[0,0,2],]Need = [[7,4,3],[1,2,2],[6,0,0],[0,1,1],[4,3,1],]Available=[3,3,2]security()
"""

银行家算法原理及代码实现相关推荐

  1. 多类线性分类器算法原理及代码实现 MATLAB

    多类线性分类器算法原理及代码实现 MATLAB 一.算法原理 下面举例说明为何蓝圈部分在case2中是确定的而在case1中不确定: 二.代码实现 1.HK函数 function [] = HK(w1 ...

  2. SSD算法原理与代码(三)

    说明:这几篇文章是讲解SSD,从算法原理.代码到部署到rk3588芯片上的过程.环境均是TF2.2,具体的安装过程请参考网上其他的文章. 一.SSD简介 SSD算法是一个优秀的one-stage目标检 ...

  3. 计算机图形学--中点椭圆算法原理及代码实现

    目录 椭圆的几何特性: 算法原理: 代码实现: 说明,我们这里讨论的椭圆都是对称轴平行于坐标轴的椭圆,对于其他方程较为复杂的椭圆我们不做讨论. 椭圆的几何特性: 首先我们考虑椭圆的几何特性.椭圆是抽对 ...

  4. 论文|Node2vec算法原理、代码实战和在微信朋友圈的应用

    1 概述 Node2vec是2016年斯坦福教授 Jure Leskovec.Aditya Grover提出的论文,论文的下载链接为:https://arxiv.org/pdf/1607.00653. ...

  5. 深度强化学习-D3QN算法原理与代码

    Dueling Double Deep Q Network(D3QN)算法结合了Double DQN和Dueling DQN算法的思想,进一步提升了算法的性能.如果对Doubel DQN和Duelin ...

  6. 萤火虫算法_40多种智能优化算法原理和代码分享

    40多种智能优化算法原理和代码分享 <智能优化算法讲解>PDF下载地址: <智能优化算法原理讲解>PDF​mianbaoduo.com 包括: 1.海鸥算法SOA 智能优化算法 ...

  7. HoughCircle(霍夫圆)算法原理及代码实现

      此算法建立在Canny算法的基础上,对Canny算法检测出的边缘图像进行拟合,因此要用到Canny算法返回的边缘图像及梯度方向矩阵.Canny算法相关内容详见上一篇博客:Canny边缘检测算法原理 ...

  8. 深度强化学习-Double DQN算法原理与代码

    深度强化学习-Double DQN算法原理与代码 引言 1 DDQN算法简介 2 DDQN算法原理 3 DDQN算法伪代码 4 仿真验证 引言 Double Deep Q Network(DDQN)是 ...

  9. 【MATLAB】混合粒子群算法原理、代码及详解

    目录 1.算法 1.1.原理 1.2.性能比较 1.3.步骤 2.代码 2.1.源码及注释 2.2.执行与效果 1.算法 1.1.原理 \qquad建议没接触过粒子群算法的朋友先看较为基础的全局粒子群 ...

最新文章

  1. mysql 安装卸载_MySQL(一)——安装、卸载以及基本操作
  2. UVA10010 Where's Waldorf?
  3. PageRanke算法
  4. SAP Marketing Cloud功能简述(四) : 线索和客户管理
  5. 王道408数据结构——第六章 图
  6. HDU 3240 Counting Binary Trees 数论-卡特兰数
  7. Build Settings发布设置
  8. Linux操作系统常用基本命令
  9. 【树莓派Zero】1- 简介
  10. android 会自动横屏再竖屏,Android横屏竖屏切换的问题
  11. 截止失真放大电路_数字电路基础(一)
  12. android app卸载以后弹出用户反馈界面
  13. PLC故障排查步骤的思路和方法
  14. 解决echarts在平移和缩放中国地图后,下钻到下一级具体省份地图时生成的地图不在容器中间,会跑到容器外面去。
  15. 远程桌面 域计算机,在AD中实现仅普通域用户可通过远程桌面控制自身计算机
  16. R语言和医学统计学:非参数检验的补充
  17. 如何在实验室服务器上跑代码
  18. 用简单的lnmp实现的论坛搭建
  19. 皮尔森相关性系数的计算python代码(三)
  20. Win10 平板 关闭屏幕不休眠 平板电源键 锁屏 程序

热门文章

  1. 辉芒微FT61F022A
  2. 解决ijkplayer和阿里云播放器冲突的解决
  3. Python心形图-采用turtle模块画心形
  4. 十大最赚钱增值业务排行榜
  5. Hadoop-3.3.0安装 Centos 8.2安装Hadoop-3.3.0 Hadoop-3.3.0安装指南
  6. 研发路上的总结和思考 -----来自阿里巴巴中间插件----作者:石佳宁
  7. 【OpenCV入门教程】图像加噪
  8. 小程序源码:全新独立后台修复登录在线答题
  9. 非飞行模式下,笔记本电脑不显示附近WiFi,并提示“适配器遇到与驱动程序或硬件相关的问题”——解决办法
  10. ChatGPT国内怎么用?官网实在太麻烦了,ChatGPT可以直接国内使用吗?