一、算法介绍

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

​ 多个进程动态地共享系统的资源可能会产生死锁现象。死锁的产生,必须同时满足四个条件,第一个是互斥条件,即一个资源每次只能由一个进程占用;第二个为请求和保持条件,即一个进程请求资源不能满足时,它必须等待,但它仍继续保持已得到的所有其它资源;第三个是不剥夺条件,任何一个进程不能抢占另一个进程已经获得且未释放的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源,防止死锁的机构只须确保上述四个条件之一不出现,则系统就不会发生死锁。在实验中假定系统中任一资源在每一时刻只能由一个进程使用,任何进程不能抢占其它进程正在使用的资源,当进程得不到资源时必须等待。因此只要资源分配策略能保证进程不出现循环等待,则系统就不会发生死锁。

二、算法背景简介

​ 在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。在这样的描述中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程。

​ 银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。

​ 要解释银行家算法,必须先解释操作系统安全状态和不安全状态。

​ 安全序列是指一个进程序列{P1,…,Pn}是安全的,即对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。

三、测试数据

测试题目如下图所示:

测试数据文件banker.dat:

四、代码实现

banker.cpp

#include<iostream>
#include<fstream>
#include<Windows.h>
#include<queue>
using namespace std;
const int M = 100;int pro = 0;//线程数目
int source = 0;//资源数目
queue<int> safeq;//安全序列
//安全性算法
bool check(int available[], int max[][M], int allocation[][M], int need[][M]) {bool finished[100] = { false };//标记某一线程是否已经完成所有资源的借贷int available2[100];//可利用资源向量available int max2[100][100];//最大需求矩阵max int allocation2[100][100];//分配矩阵allocation int need2[100][100];//需求矩阵need//为四个矩阵赋值for (int i = 0; i < pro; i++) {for (int j = 0; j < source; j++) {available2[j] = available[j];max2[i][j] = max[i][j];allocation2[i][j] = allocation[i][j];need2[i][j] = need[i][j];}}while (1) {int sumNeed = 0;for (int i = 0; i < pro; i++) {for (int j = 0; j < source; j++) {sumNeed += need2[i][j];}if (sumNeed != 0) {break;}}//如果need矩阵中所有的值都为0,即所有的需求都已经被满足if (sumNeed == 0) {return true;}//用于标记是否满足了某个线程的请求,如果都无法满足,则出现了不安全队列bool needflag = false;for (int i = 0; i < pro; i++) {bool flag = true;for (int j = 0; j < source; j++) {if (need2[i][j] > available2[j]) {flag = false;}}if (flag && !finished[i]) {needflag = true;safeq.push(i);for (int j = 0; j < source; j++) {allocation2[i][j] = allocation2[i][j] + need2[i][j];need2[i][j] = 0;available2[j] = available2[j] + allocation2[i][j];finished[i] = true;}}else {continue;}}if (!needflag) {cout << "出现了不安全序列!!\n";return false;}}return false;
}//主函数
int main() {int available[100];//可利用资源向量available int max[100][100];//最大需求矩阵max int allocation[100][100];//分配矩阵allocation int need[100][100];//需求矩阵needcout << "正在读取数据文件\n";Sleep(2000);ifstream inFile;inFile.open("banker.dat");if (!inFile.is_open())cout << "文件打开时候出错!!" << endl;inFile >> pro >> source;cout << "共有" << pro << "个线程," << source << "种资源\n";if (pro >= 100 || source >= 100) {cout << "输入的线程或资源数目过大!!";exit(0);}while (!inFile.eof()) {           // 若未到文件结束一直循环//读入availablefor (int i = 0; i < pro; i++) {inFile >> available[i];}//读入maxfor (int i = 0; i < pro; i++) {for (int j = 0; j < source; j++) {inFile >> max[i][j];}}//读入allocationfor (int i = 0; i < pro; i++) {for (int j = 0; j < source; j++) {inFile >> allocation[i][j];}}//读入needfor (int i = 0; i < pro; i++) {for (int j = 0; j < source; j++) {need[i][j] = max[i][j] - allocation[i][j];}}}inFile.close();//打印提示信息cout << "************************************************\n";cout << "        操作系统实验模拟银行家算法\n";cout << "        作者:CSDN Carmelo_7 主页: https://blog.csdn.net/Carmelo_7?spm=1000.2115.3001.5343\n";cout << "************************************************\n";cout << "AVAILABLE:\n";for (int i = 0; i < pro; i++) {cout << available[i] << " ";}cout << "\n";cout << "MAX:\n";for (int i = 0; i < pro; i++) {for (int j = 0; j < source; j++) {cout << max[i][j] << " ";}cout << "\n";}cout << "ALLOCATION:\n";for (int i = 0; i < pro; i++) {for (int j = 0; j < source; j++) {cout << allocation[i][j] << " ";}cout << "\n";}cout << "NEED:\n";for (int i = 0; i < pro; i++) {for (int j = 0; j < source; j++) {cout << need[i][j] << " ";}cout << "\n";}//检查当前状态是否安全if (check(available, max, allocation, need) == true) {cout << "操作系统现有状态安全!\n" << "安全序列为:";while (!safeq.empty()) {cout << "P" << safeq.front() << " ";safeq.pop();}}else {cout << "操作系统现有状态不安全!\n";exit(0);}//线程开始请求相应的资源bb:while (true) {int proNo;int request[100];cout << "输入请求的线程号:";cin >> proNo;for (int i = 0; i < source; i++) {cout << "\n输入线程对于资源" << i << "的请求数量:\n";cin >> request[i];}//复制一份四个矩阵int available2[100];//可利用资源向量available int max2[100][100];//最大需求矩阵max int allocation2[100][100];//分配矩阵allocation int need2[100][100];//需求矩阵need//为四个矩阵赋值for (int i = 0; i < pro; i++) {for (int j = 0; j < source; j++) {available2[j] = available[j];max2[i][j] = max[i][j];allocation2[i][j] = allocation[i][j];need2[i][j] = need[i][j];}}for (int i = 0; i < source; i++) {if (available2[i]<request[i]) {cout << "操作系统现有状态不安全!\n";goto bb;}}for (int i = 0; i < source; i++) {available2[i] = available2[i] - request[i];allocation2[proNo][i] = allocation[proNo][i]+ request[i];need2[proNo][i] = need[proNo][i]- request[i];}//检查接受request请求后状态是否安全if (check(available2, max2, allocation2, need2) == true) {cout << "操作系统现有状态安全!\n" << "安全序列为:";while (!safeq.empty()) {cout << "P" << safeq.front() << " ";safeq.pop();}}else {cout << "操作系统现有状态不安全!\n";exit(0);}return 0;}
}

测试数据文件banker.dat:

4 4
1 5 2 0
0 0 1 2
1 7 5 0
2 3 5 6
0 6 5 6
0 0 1 2
1 0 0 0
1 3 5 4
0 0 1 4

银行家算法C++代码实现相关推荐

  1. 操作系统 | 银行家算法及代码实现

    参考博客 [操作系统]死锁避免之银行家算法_少侠露飞的学习笔记-CSDN博客 [操作系统]避免死锁--银行家算法_明昕ztoy的博客-CSDN博客_银行家算法避免死锁 实现思路 当一个进程申请使用资源 ...

  2. 银行家算法java代码

    import java.util.Scanner;public class banker {private int Process = 0; // 定义最大进程数目private int Resour ...

  3. 操作系统中避免死锁的银行家算法【表面C++实际C语言】一学就废的菜鸡代码

    文章目录 银行家算法 实验原理 数据结构 初始化 输出资源分配量 安全性算法 银行家算法 完整代码 测试数据 测试结果 第一题 第二题 银行家算法 银行家算法是一种最有代表性的避免死锁的算法.在避免死 ...

  4. 银行家算法原理及代码实现

    银行家算法原理 简介 银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法.它 ...

  5. 银行家算法——C++实现 [ 开源代码 + 详细解析 ]

    ✅ (原创,纯手敲,开源免费,2021的最后一篇) 文章目录 零.运行结果图 一.银行家算法简介(Dijkstra在1965年提出) 二.安全状态 三.算法实质与思想 四.算法所需的相关数据结构 五. ...

  6. 【操作系统】银行家算法:算法分析 + 运行结果 + 完整代码

    学习网站推荐:前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站 一.银行家算法 可利用银行家算法避免死锁,请设计银行家算法,参考教材依据教材<计算 ...

  7. python银行家算法代码_避免死锁的银行家算法C++程序实现

     本篇博文为追忆以前写过的算法系列第二篇(20081021) 温故知新 目的:具有代表性的死锁避免算法是Dijskstra给出的银行家算法.本实验是基于银行家算法的思想通过编写C++程序实现银行家 ...

  8. 操作系统 进程调度-银行家算法实验报告

    实验要求 一. 实验目的 死锁会引起计算机工作僵死,因此操作系统中必须防止.本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家 ...

  9. 实验三银行家算法linux,操作系统原理与linux_银行家算法实验报告.doc

    . . . PAGE 成 绩 评 阅 人 评阅日期 计算机科学与技术系 实 验 报 告 课程名称: 操作系统原理与linux 实验名称: 银行家算法 2011年 04 月 实验三 银行家算法 一.实验 ...

  10. 银行家算法回顾[JAVA实现]

    为什么80%的码农都做不了架构师?>>>    分析了一下银行家算法,基于银行家算法做了一个小程序. 银行家算法主要用于操作系统进程管理程序中,用于防止死锁. 接下来这段代码将模拟这 ...

最新文章

  1. sklearn随机森林分类类RandomForestClassifier
  2. SAP Variant Conditions in Purchasing using reference characteristics【中英文双语版】
  3. java中处理字符编码(网页与数据库)(转)
  4. USB Host Device And OTG
  5. 牛客网_PAT乙级_1020完美数列(25)【vector sort 最后一个测试用例超时】
  6. leetcode 算法解析(一):260. Single Number III(C++版本和自己的注解)
  7. 4562亿元教育经费收从哪里花向何处
  8. UNSW-论文以及博士论文下载
  9. python 自动化测试
  10. Xshell远程连接CentOS-7版的Linux
  11. UDF-java获取名字中的姓
  12. hdu 4300 Clairewd’s message kmp匹配! 多校联合赛第一题
  13. js给列表设置统一的高度
  14. STC学习:八位数码管动态扫描
  15. Dev C++下载简介和安装
  16. Google Analytics(分析)网址构建器
  17. 基于C++的BNN推理
  18. android 点赞源码,【Ctrl.js】微信给最新一条消息点赞源码
  19. 桌面html文件图标异常,.htm.html文件图标无法显示的解决办法
  20. VMware-KVM安装

热门文章

  1. 区块链毕业设计中期检查表模板
  2. linux查看u盘的分区格式化,linux U盘格式化ext3
  3. RapidMiner遇到的问题
  4. RapidMiner 数值调整
  5. Firebug工具离线安装
  6. 软件需求跟踪矩阵例子
  7. GSM sim900a mini模块详解
  8. python实训总结泰坦尼克号重建_Python之泰坦尼克号生存率分析
  9. QQ,MSN,旺旺在线客服代码
  10. 在Linux中使用7zip/7zz