银行家算法

文章目录

主要内容

一.银行家算法

1.需求分析

通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生条件,采用适当的算法,有效防止和避免死锁发生。

  1. 模拟一个银行家算法,判断是否处于安全状态。
  2. 初始化时,让系统拥有一定的资源。
  3. 如果预分配后,系统处于不安全状态,则提示不能满足请求。

1.设置数据结构:包括资源向量(Resource),最大需求矩阵(Need),分配矩阵(Allocation),需求矩阵(Request), 可利用剩余资源数(Available)。
2.设计安全性算法:设置工作向量 Work 表示系统可提供进程继续运行可利用资源数目,Finish 表示系统是否有足够的资源分配给进程。
3. 利用三组数据分别测试银行家算法,并给出结果,包括安全状态和不安全状态。安全状态请给出进程进行资源分配的安全序列。

2.概要设计

为了实现银行家算法,在系统中必须设置这样四个数据结构:
1)Available 向量:系统中可利用的资源数目
2)Max 矩阵:每个进程对每种资源的最大需求
3)Allocation 矩阵:每个进程已分配的各类资源的数目
4)Need 矩阵:每个进程还需要的各类资源数,其中三个矩阵间存在下述关系:
Need[i,j] = Max[i,j] - allocation[i, j]

算法逻辑:
设 Requesti 是进程 Pi 的请求向量,如果 Requesti[j]=K,表示进程 Pi 需要 K 个 Rj 类型的
资源。当 Pi 发出资源请求后,系统按下述步骤进行检查:
(1) 若 Requesti[j] ≤ Need[i,j],转向(2),否则认为出错(因为它所需的资源数目已超过它所宣布的最大值)。
(2) 若 Requesti[j] ≤ Available[j],转向(3),否则须等待(表现为进程 Pi 受阻)。
(3) 系统尝试把资源分配给进程 Pi,并修改下面数据结构中的数值:
Available[j] = Available[j]-Requesti[j]
Allocation[i,j] = Allocation[i,j] + Requesti[j]
Need[i,j] = Need[i,j]-Requesti[j]
(4)试分配后,执行安全性算法,检查此次分配后系统是否处于安全状态。若安全,才正式分配;否则,此次试分配作废,进程 Pi 等待

3.源代码

代码如下(示例):
 #include<stdio.h>
#define true 1
#define false 0
#define N 4
#define M 3
#define MAXINT 9999int resource[M] = { 10,5,7 };
int available[M] = { 0 };
int need[N][M] =
{ 7,5,3,
3,2,2,
9,0,2,
2,2,2 };
int allocation[N][M] =
{ 0,1,0,
2,0,0,
3,0,2,
2,1,1 };
int request[N][M] = { 0 };
bool Finish[N];
int safeSeries[N] = { MAXINT, MAXINT , MAXINT , MAXINT };//用于存放安全序列void Init();
void showInfo();
bool isSafe();
void SafeInfo(int* work, int i);void Init()
{int i, j;//printf("输入进程数量、资源数量\n");//scanf("%d %d",&processNum,&resourceNum);printf("输入当前资源数目\n");for (i = 0; i < M; i++) {scanf("%d", &resource[i]);}printf("输入最大需求矩阵\n");for (i = 0; i < N; i++) {for (j = 0; j < M; j++) {scanf("%d", &need[i][j]);}}printf("输入分配矩阵\n");for (i = 0; i < N; i++) {for (j = 0; j < M; j++) {scanf("%d", &allocation[i][j]);}}// printf("输入当前需求矩阵\n");for (i = 0; i < N; i++){for (j = 0; j < M; j++){request[i][j] = need[i][j] - allocation[i][j];}}
}void showInfo()
{int i, j;printf("当前资源总量:");for (j = 0; j < M; j++) {printf("%d ", resource[j]);}printf("\n");//计算Avaliable向量for (i = 0; i < M; i++){int count = 0;for (j = 0; j < N; j++){count += allocation[j][i];}available[i] = resource[i] - count;}//计算request向量for (i = 0; i < N; i++){for (j = 0; j < M; j++){request[i][j] = need[i][j] - allocation[i][j];}}printf(" PID\t Need\t\tAllocation\tRequest\n");for (i = 0; i < N; i++){printf(" P%d\t", i);for (j = 0; j < M; j++){printf("%d ", need[i][j]);}printf("\t\t");for (j = 0; j < M; j++){printf("%d ", allocation[i][j]);}printf("\t\t");for (j = 0; j < M; j++){printf("%d ", request[i][j]);}printf("\n");}printf("当前资源剩余:");for (j = 0; j < M; j++) {printf("%d ", available[j]);}
}bool isSafe()
{int i, j, k;int trueFinished = 0;int work[M];for (i = 0; i < M; i++){work[i] = available[i];//}for (i = 0; i < N; i++){Finish[i] = false;}i = 0;int temp = 0;int temp0 = 0;int flag = 0;while (trueFinished != N){int j = 0;if (Finish[i] != true){for (j = 0; j < M; j++){if (request[i][j] > work[j]){break;}}}if (j == M){Finish[i] = true;SafeInfo(work, i);for (k = 0; k < M; k++){work[k] += allocation[i][k];}int k2;safeSeries[trueFinished++] = i;}i++;if (i >= N){if (flag == 0){temp = trueFinished;temp0 = trueFinished;}i = i % N;if (flag == 1) {temp = trueFinished;if (temp == temp0)break;elsetemp0 = temp;}flag = 1;}temp = trueFinished;}if (trueFinished == N){printf("\n系统安全!\n\n安全序列为:");for (i = 0; i < N; i++){printf("%d ", safeSeries[i]);}printf("\n");return true;}printf("******系统不安全!******\n");return false;
}void SafeInfo(int* work, int i)
{int j;printf(" P%d\t", i);for (j = 0; j < M; j++){printf("%d ", work[j]);}printf("\t\t");for (j = 0; j < M; j++){printf("%d ", request[i][j]);}printf("\t ");for (j = 0; j < M; j++){printf("%d ", allocation[i][j]);}printf("\t\t");for (j = 0; j < M; j++){printf("%d ", allocation[i][j] + work[j]);}printf("\n");
}int main()
{int i, j, curProcess;int wheInit = 0;printf("是否使用内置数据?0是,1否:");scanf("%d", &wheInit);if (wheInit){Init();}printf("---------------------------------------------------------\n");showInfo();printf("\n---------------------------------------------------------\n");printf("\n系统安全情况分析\n");printf(" PID\t Work\t\tRequest\tAllocation\tWork+Allocation\n");isSafe();return 0;
}

在这里插入图片描述
在这里插入图片描述


总结

以上是今天要讲的内容,练习了银行家算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/413201.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Discuz论坛网站登录账号操作慢,必须强制刷新才会显示登录怎么办?

飞飞发现在登录服务器大本营账号时&#xff0c;输入账号密码登录后还是显示的登录框&#xff0c;强制刷新后才知道已经登录了&#xff0c;每次都要刷新才能正常显示&#xff0c;非常影响用户体验&#xff0c;于是在网上找了类似的问题故障解决方法&#xff0c;目前问题已经解决…

移动端开发进阶之蓝牙通讯(四)

移动端开发进阶之蓝牙通讯(四) 在移动端开发实践中,可能会要求在不同的设备之间切换,从而提升用户体验; 或者为了提升设备的利用率,实现设备之间的连接和协同工作; 不得不通过多端连接,将多个设备连接在一起,实现设备之间的数据共享、远程控制等功能,根据具体的应用…

黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(6)解散部门

指路&#xff08;1&#xff09;&#xff08;2&#xff09;&#xff08;3&#xff09;&#xff08;4&#xff09;&#xff08;5&#xff09;&#x1f447; 黑马程序员JavaWeb开发|案例&#xff1a;tlias智能学习辅助系统&#xff08;1&#xff09;准备工作、部门管理_tlias智能…

Elasticsearch:和 LIamaIndex 的集成

LlamaIndex 是一个数据框架&#xff0c;供 LLM 应用程序摄取、构建和访问私有或特定领域的数据。 LlamaIndex 是开源的&#xff0c;可用于构建各种应用程序。 在 GitHub 上查看该项目。 安装 在 Docker 上设置 Elasticsearch 使用以下 docker 命令启动单节点 Elasticsearch 实…

网络文件共享服务

一.存储类型 直连式存储&#xff1a;Direct-Attached Storage&#xff0c;简称DAS 存储区域网络&#xff1a;Storage Area Network&#xff0c;简称SAN&#xff08;可以使用空间&#xff0c;管理也是你来管理&#xff09; 网络附加存储&#xff1a;Network-Attached Storage&…

年龄性别预测2:Pytorch实现年龄性别预测和识别(含训练代码和数据)

年龄性别预测2&#xff1a;Pytorch实现年龄性别预测和识别(含训练代码和数据) 目录 年龄性别预测2&#xff1a;Pytorch实现年龄性别预测和识别(含训练代码和数据) 1.年龄性别预测和识别方法 2.年龄性别预测和识别数据集 3.人脸检测模型 4.年龄性别预测和识别模型训练 &a…

解决Python安装库时出现的Requirement already satisfied问题

uirement already satisfied的问题当我们用pip install 库名时&#xff0c;出现了下面 Requirement already satisfied WARNING: Ignoring invalid distribution -ip 的问题 对于这样的问题&#xff0c;解决办法就是在 pip install 后加 - -target你所要添加的库文件地址(注意…

Unity使用Protobuf

1.下载Protobuf ProtoBuf 2.打开它并且编译 如果有报错下载相应的.net版本即可 这里默认是6.0.100 由于我本机是8.0.100所以我改了这个文件 3.编译后的文件复制到Unity Assets/Plugins下 4.写个测试的proto文件 5.然后使用protoc生成 这里实现了一个简单的bat批量生成 Protos C…

CSS样式学习-基本用法

html超文本传输标签&#xff0c;属性等权重 outline 标签轮廓 <input type"text"> <textarea cols"30" rows"10"></textarea> outline: none; 表示无轮廓 &#xff08;开发时用的比较多&#xff09; CSS 轮廓&#xff…

在js文件中引入外部变量

需求背景: 有个ip地址需要在项目部署后修改为客户自己的,所以就把这个ip放到了外部进行管理,方便直接修改 实现方法: 第一步:在public文件夹下创建一个json文件,里面放的就是需要在外部进行管理,随时都可以修改的变量 第二步:在需要引变量的js文件中写入如下代码 结合第一步…

再见了RDM,Redis官方GUI才是最好的!

1 简介 直观高效的 Redis GUI 管理工具&#xff0c;它可以对 Redis 的内存、连接数、命中率以及正常运行时间进行监控&#xff0c;并且可以在界面上使用 CLI 和连接的 Redis 进行交互&#xff08;RedisInsight 内置对 Redis 模块支持&#xff09;&#xff0c;官方下载地址。 使…

k8s之ingress

ingress基于域名进行映射&#xff0c;把url(http https)的请求转发到service&#xff0c;再由service把请求转发到每一个pod ingress只要一个或者少量的公网ip或者LB&#xff0c;可以把多个http请求暴露到外网&#xff0c;七层反向代理 理解为service的service&#xff0c;是…