银行家算法

1.设计目的与要求

1.1设计目的

        了解银行家算法中使用的数据结构和求安全序列算法,并进一步加深对避免死锁算法及其实现过程的理解。

1.2设计要求

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

2.设计思想及系统平台

2.1设计思想

        基本思想分为两个模块,一是银行家算法模块,二是安全性检查模块。当有进程申请资源时,先检查系统是否能够满足进程的请求,此时程序进入安全性检查模块,如果安全就分配,不安全就拒绝申请。

        本算法的数据结构:

        1)可利用资源向量Available。这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目。

        2)最大需求矩阵Max。这是一个n×m的矩阵,定义了系统中n个进程中的每一个进程对m类资源的最大需求。

        3)分配矩阵Allocation。这也是一个n×m的矩阵,定义了系统中每一类资源当前已分配给每一进程的资源数。

        4)需求矩阵Need。这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。

        由数学知识可知,Need[i,j]=Max[i,j]-Allocation[i,j]。

2.2系统平台及使用语言

        CodeBlocks,C++

3.详细算法描述

1)初始化函数Init()

        用户输入数据,初始化可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、 需求矩阵NEED。

 

2)银行家算法Order()

        当进程Pi发出资源请求后,系统按以下步骤进行检查:

        ①如果Request[i,j]<=Need[i,j],便转向步骤②;否则出错,因为它请求的资源数已超过它的需求最大值。

        ②如果Request[i,j]<=Available[j],便转向步骤③;否则,表示当前资源不足,Pi须等待

        ③系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:Available[j]= Available[j]-Request i[j]、Allocation[i,j]= Allocation[i,j]+Request[i,j]、Need[i,j]= Need[i,j]-Request[i,j]

        ④系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程Pi;否则,恢复原来的资源分配状态,让进程Pi等待。

 

3)安全性检查算法Safecheck()

        ①设置两个向量:工作向量Work,表示系统可提供给进程继续运行所需的各类资源数目,初始化Work=Available;Finish,表示系统是否有足够的资源分配给进程,初始化Finish[i]=false;当有足够资源分配给进程时,再令Finish[i]=true。

        ②从进程集合中找到一个能满足下述条件的进程:Finish[i]=false;Need[i,j]≤Work[j];若找到,执行步骤③,否则,执行步骤④。

        ③假设进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work[j]= Work[j]+Allocation[i,j];Finish[i]=true;go to step ②

        ④如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。

4.源代码

#include <iostream>
#include <vector>
using namespace std;
#define MAX 20
int n_process;//表示进程的个数
int n_resource;//表示资源的个数
int Resource[MAX];//表示资源的总数
int Max[MAX][MAX];//表示进程对每类资源的最大需求量
int Allocation[MAX][MAX];//表示系统给进程已分配每类资源的数目
int Need[MAX][MAX];//表示进程还需各类资源数目
int Available[MAX];//表示系统当前剩下的资源
int Work[MAX];//表示安全性检查的中间变量
bool Finish[MAX];//表示资源是否被安全性检查过
vector<int> Safeorder;//表示安全序列
void Menu()
{cout << "------------银行家算法----------------" << endl;cout << "*          1.初始化数据              *" << endl;cout << "*          2.申请资源                *" << endl;cout << "*          3.显示资源分配情况        *" << endl;cout << "*          4.退出                    *" << endl;cout << "--------------------------------------" << endl;cout << "请选择:";
}
//检查初始化数值是否合理
void checkInit()
{if (n_resource)for (int i = 0; i < n_process; i++){for (int j = 0; j < n_resource; j++){if (Max[i][j] < 0){cout << "Max[" << i << "][" << j << "]输入值小于0!" << endl;}if (Allocation[i][j] < 0){cout << "Allocation[" << i << "][" << j << "]输入值小于0!" << endl;}if (Allocation[i][j]>Max[i][j]){cout << "Allocation[" << i << "][" << j << "]的值大于Max[" << i << "][" << j << "]输入值" << endl;}}}for (int i = 0; i < n_resource; i++){if (Available[i]<0){cout << "Available[" << i << "]的值小于0!" << endl;}}cout << "检查完毕,输入无误!" << endl;
}
//初始化进程和资源
int Init()
{if (n_resource != 0 && n_process != 0){cout << "已经初始化过了!" << endl;return 1;}cout << "请分别输入资源个数和进程个数,中间用空格隔开:" << endl;cin >> n_resource >> n_process;cout << "请输入各个资源的总拥有量:" << endl;for (int i = 0; i < n_resource; i++){cin >> Resource[i];}for (int i = 0; i < n_process; i++){cout << "P" << i << "对各个资源的最大需求量:" << endl;for (int j = 0; j < n_resource; j++){cin >> Max[i][j];}cout << "P" << i << "各个资源已分配量:" << endl;for (int j = 0; j < n_resource; j++){cin >> Allocation[i][j];}for (int j = 0; j < n_resource; j++){Need[i][j] = Max[i][j] - Allocation[i][j];}}for (int i = 0; i < n_resource; i++){int sum[MAX] = { 0 };for (int j = 0; j < n_process; j++){switch(i){case 0:case 1:case 2:sum[i] += Allocation[j][i];break;}}Available[i] = Resource[i] - sum[i];}checkInit();return 1;
}
//安全性检查
bool Safecheck()
{//清空原来的安全序列Safeorder.clear();//Work初始化为Availablefor (int i = 0; i < n_resource; i++){Work[i] = Available[i];}//还没开始检查,设置标志为falsefor (int i = 0; i < n_process; i++){Finish[i] = false;}//开始安全性检查int count = 0;for (int k = 0; k < n_process; k++){for (int i = 0; i < n_process; i++){if (Finish[i] == false){count = 0;for (int j = 0; j < n_resource; j++){if (Need[i][j] <= Work[j])count++;}//如果进程所需的各个资源数都没有超过系统现有的对应资源数if (count == n_resource){for (int j = 0; j < n_resource; j++){//将Work赋值为 第i个进程各个已分配资源数+系统现有的对应资源数Work[j] = Work[j] + Allocation[i][j];}Finish[i] = true;Safeorder.push_back(i);//加入到安全序列}}}}count = 0;//安全的进程数for (int i = 0; i < n_process; i++){if (Finish[i] == true)count++;}if (count == n_process)return true;elsereturn false;
}
//请求进程
int Order()
{int n = -1; //请求资源的进程号int *Request = new int[n_resource];//表示请求的各个资源数量cout << "请输入你要请求的进程号:";cin >> n;cout << "请输入你要请求各个资源的数量,中间用空格隔开:" << endl;for (int i = 0; i< n_resource; i++){cin >> Request[i];}//开始判断//请求量大于该进程的最大需求量,出错for (int i = 0; i < n_resource; i++){if (Need[n][i] < Request[i]){cout << "输入错误,请求量不能比该进程的最大需求量还大!" << endl;return 1;}}//请求量大于当前空闲资源量,出错for (int i = 0; i < n_resource; i++){if (Available[i] < Request[i]){cout << "拒绝,当前空闲资源不够!" << endl;return 1;}}//请求量合理,试图分配资源给请求进程,并做安全性检查for (int i = 0; i < n_resource; i++){Available[i] -= Request[i];Allocation[n][i] += Request[i];Need[n][i] -= Request[i];}//安全性检查bool Is_safe=Safecheck();if (Is_safe == true){cout << "系统已经分配资源给P" << n << "进程了!" << endl;cout << "其中一个安全序列为:" << endl;for (int i = 0; i < Safeorder.size(); i++){cout << "P" << Safeorder.at(i) << "->";}cout << "End" << endl ;}//不安全,恢复试分配之前的现场else{cout << "不能分配资源,否则系统会处于不安全状态!" << endl;for (int i = 0; i < n_resource; i++){Available[i] += Request[i];Allocation[n][i] -= Request[i];Need[n][i] += Request[i];}}return 1;
}
//显示资源分配情况
void Display()
{cout << endl;cout << "进程 \t Max \t Allocation\tNeed\tAvailable" << endl;for (int i = 0; i < n_process; i++){cout << " P" << i << " \t";for (int j = 0; j < n_resource; j++){cout << Max[i][j] << " ";}cout << "\t   ";for (int j = 0; j < n_resource; j++){cout << Allocation[i][j] << " ";}cout << "\t";for (int j = 0; j < n_resource; j++){cout << Need[i][j] << " ";}cout << "\t  ";for (int j = 0; i==0&&j < n_resource; j++){cout << Available[j] << " ";}cout << endl;}cout << endl;
}int main()
{int choose = 0;while (1){Menu();cin >> choose;switch (choose){case 1:Init();break;case 2:Order();break;case 3:Display();break;case 4:cout << "系统已退出!";return 1;default:cout << "输错了,重输" << endl;break;}}
}

 实验报告:https://download.csdn.net/download/sjhdxpz/88212618

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

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

相关文章

2023.8.7论文阅读

文章目录 CMUNeXt: An Efficient Medical Image Segmentation Network based on Large Kernel and Skip Fusion摘要本文方法实验结果 Boundary Difference Over Union Loss For Medical Image Segmentation&#xff08;损失函数&#xff09;摘要本文方法实验结果 CMUNeXt: An E…

回归预测 | MATLAB实现基于PSO-LSSVM-Adaboost粒子群算法优化最小二乘支持向量机结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于PSO-LSSVM-Adaboost粒子群算法优化最小二乘支持向量机结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于PSO-LSSVM-Adaboost粒子群算法优化最小二乘支持向量机结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考…

【基础操作】Linux打开terminal,Anaconda默认进入的虚拟环境(python版本)设置(自行指定)

为了免除每次打开terminal都要输入 conda activate … 的麻烦&#xff0c;可以这么设置。 1. 打开terminal&#xff0c;然后输入命令 vim ~/.bashrc2. 然后在文件末尾添加 conda activate your_envs # your_envs是你的虚拟环境名称3. 保存退出&#xff0c;重新打开就成功啦…

navicat连接postgresql报错

navicat连接postgresql报错 navicat连接postgresql报错 现象 有小伙伴告诉我 安装了新的postgresql 使用navicat连接&#xff0c;报错 ERROR: column "datlastsysoid" does not existLINE 1: SELECT DISTINCT datlastsysoid FROM pg database column “datlastsy…

.netcore grpc客户端流方法详解

一、客户端流式处理概述 客户端流式处理方法在该方法没有接收消息的情况下启动。 requestStream 参数用于从客户端读取消息。 返回响应消息时&#xff0c;客户端流式处理调用完成。客户端可以发送多个消息流到服务端&#xff0c;当所有客户端消息流发送结束&#xff0c;调用请…

SpringBoot案例-部门管理-修改

目录 前言 查看页面原型&#xff0c;明确需求 页面原型 需求 阅读接口文件 思路分析 功能接口开发 控制层&#xff08;Controller类&#xff09; 业务层&#xff08;Service类&#xff09; 业务类 业务实现类 持久层&#xff08;Mapper类&#xff09; 接口测试 前…

ROS2 学习(一)介绍,环境搭建,以及个人安装的一些建议

ROS2 学习 学习自b站课程&#xff1a;https://www.bilibili.com/video/BV16B4y1Q7jQ?p1 &#xff08;up主&#xff1a;古月居GYH&#xff09; ROS 介绍 Robot OS&#xff0c;为机器人开发提供了相对完善的 middleware&#xff0c;工具&#xff0c;软件等。 ROS1 对嵌入式设…

计算机网络(7) --- UDP协议和TCP协议

计算机网络&#xff08;6&#xff09; --- https协议_哈里沃克的博客-CSDN博客https协议https://blog.csdn.net/m0_63488627/article/details/132112683?spm1001.2014.3001.5501 目录 1.补充知识 1.PORT端口号 2.端口号范围划分 3.知名端口号 2.UDP协议 1.UDP报头 2.U…

BGP小综合

实验题目如下&#xff1a; 实验拓扑如下&#xff1a; 实验要求如下&#xff1a; 【1】R2-7每台路由器均存在一个环回接口用于建立邻居&#xff0c;同时还存在一个环回来代表连接用户的 接口;最终这些连接用户的接口网络需要可以和R1/8的环回通讯 【2】AS2网段地址1…

基于smardaten无代码开发智能巡检系统,让无人机飞得更准

目录 引言需求背景搭建思路开发过程&#xff08;1&#xff09;无人机设备数据接入&#xff08;2&#xff09;无人机巡检任务管理&#xff08;3&#xff09;无人机三维防控监视&#xff08;4&#xff09;运防一体化大屏设计&#xff08;5&#xff09;异常告警管理&#xff08;6&…

面试总结-webpack/git

说说你对webpack的理解 webpack 是一个静态模块打包器&#xff0c;整个打包过程就像是一条生产线&#xff0c;把资源从入口放进去&#xff0c;经过一系列的加工&#xff08;loader&#xff09;&#xff0c;最终转换成我们想要的结果&#xff0c;整个加工过程还会有监控&#x…

redis基础(三十六)

安装redis、配置redis 目录 一、 概述 &#xff08;一&#xff09;NoSQL 1、类型 2、应用场景 &#xff08;二&#xff09;Redis 二、安装 &#xff08;一&#xff09;编译安装 &#xff08;二&#xff09;RPM安装 三、目录结构 四、命令解析 五、redis登录更改 1、…

2023国赛数学建模C题思路分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

中睿天下入选河南省网信系统2023年度网络安全技术支撑单位

近日&#xff0c;河南省委网信办发布了“河南省网信系统2023年度网络安全技术支撑单位名单”&#xff0c;中睿天下凭借出色的网络安全技术能力和优势成功入选。 本次遴选由河南省委网信办会同国家计算机网络与信息安全管理中心河南分中心&#xff08;以下简称安全中心河南分中心…

Zebec Protocol 将进军尼泊尔市场,通过 Zebec Card 推动地区金融平等

流支付正在成为一种全新的支付形态&#xff0c;Zebec Protocol 作为流支付的主要推崇者&#xff0c;正在积极的推动该支付方案向更广泛的应用场景拓展。目前&#xff0c;Zebec Protocol 成功的将流支付应用在薪酬支付领域&#xff0c;并通过收购 WageLink 将其纳入旗下&#xf…

Pytest测试框架3

目录&#xff1a; pytest结合数据驱动-yamlpytest结合数据驱动-excelpytest结合数据驱动-csvpytest结合数据驱动-jsonpytest测试用例生命周期管理&#xff08;一&#xff09;pytest测试用例生命周期管理&#xff08;二&#xff09;pytest测试用例生命周期管理&#xff08;三&a…

UG NX二次开发(C#)-CAM-获取刀具类型

文章目录 1、前言2、UG NX中的刀具类型3、获取刀具类型3.1 刀具类型帮助文档1、前言 在UG NX的加工模块,加工刀具是一个必要的因素,其包括了多种类型的类型,有铣刀、钻刀、车刀、磨刀、成型刀等等,而且每种刀具所包含的信息也各不相同。想获取刀具的信息,那就要知道刀具的…

2023最新水果编曲软件FL Studio 21.1.0.3267音频工作站电脑参考配置单及系统配置要求

音乐在人们心中的地位日益增高&#xff0c;近几年音乐选秀的节目更是层出不穷&#xff0c;喜爱音乐&#xff0c;创作音乐的朋友们也是越来越多&#xff0c;音乐的类型有很多&#xff0c;好比古典&#xff0c;流行&#xff0c;摇滚等等。对新手友好程度基本上在首位&#xff0c;…

【报童模型】随机优化问题二次规划

面对需求的不确定性&#xff0c;报童模型是做库存优化的常见模型。而标准报童模型假设价格是固定的&#xff0c;此时求解一个线性规划问题&#xff0c;可以得到最优订货量&#xff0c;这种模型存在局限性。因为现实世界中价格与需求存在一定的关系&#xff0c;本文假设需求q是价…

LNMP环境介绍和搭建

一.LNMP简介 1.含义 2.工作原理 二.部署LNMP环境 1.Nginx环境 &#xff08;1&#xff09;上传nginx包&#xff0c;下载编译安装工具并解包到指定目录&#xff08;tar 参数 tar包 - C 目录路径&#xff09; &#xff08;2&#xff09; 开始编译安装&#xff0c;每次编译后…