算法思想:

代码:

#include<iostream>
#include<string>
using namespace std;
#define  numberOfProcess 5
#define  numberOfReSource 3
int *available=new int[numberOfReSource];
int *work=new int[numberOfReSource];
string *securitySequence=new string[numberOfProcess];
typedef struct pcb {string pName;//进程名string *nameOfReSource = new string[numberOfReSource];//依次存放各类资源的名称int *max = new int[numberOfReSource];//max[j]=K表示进程需要Rj类资源的最大数目为Kint *allocation = new int[numberOfReSource];//allocation[j]=K表示进程已分得Rj类资源的数目为Kint *need = new int[numberOfReSource];//need[j]=K表示进程还需要Rj类资源K个方能完成任务bool finish;struct pcb *next;//链接指针指向下一个进程
}PCB;void printProcess(PCB* p) {//输出进程的相关信息PCB *q = p->next;//q指向第一个进程cout << endl << "所有进程的相关信息" << endl;cout << "         Need        Allocation    Finish" << endl;cout << "进程  A   B   C      A   B   C           " << endl;while (q) {//遍历进程cout << q->pName << "    ";cout << q->need[0] << "   " << q->need[1] << "   " << q->need[2] << "      ";cout << q->allocation[0] << "   " << q->allocation[1] << "   " << q->allocation[2] << "     ";cout << (q->finish ? "true" : "false") << endl;q = q->next;//q指向下一个进程}cout << endl;
}void initProcess(PCB *p) {//初始化进程cout << "初始化进程" << endl;cout << "请依次输入资源的名称:";string *nameOfReSource = new string[numberOfReSource];//该变量里依次存放资源的名称for (int i = 0; i<numberOfReSource; i++)//依次存放各类资源的名称cin >> nameOfReSource[i];cout << "请依次输入当前可利用资源量:";for (int i = 0; i<numberOfReSource; i++)cin >> available[i];PCB *q = p;PCB *r = new PCB;//当前工作指针for (int i = 0; i<numberOfProcess; i++) {cout << "请输入进程的名字:";cin >> r->pName;cout << "请依次输入该进程的各类资源的最大需求量(例如:2 3 4 ...):";for (int j = 0; j<numberOfReSource; j++)cin >> r->max[j];cout << "请依次输入该进程的各类资源的已经分配量(例如:2 3 4 ...):";for (int j = 0; j<numberOfReSource; j++) {cin >> r->allocation[j];r->need[j] = r->max[j] - r->allocation[j];r->finish = false;}q->next = r;q = r;r->next = new PCB;r = r->next;//指针后移}r->next = NULL;q->next = NULL;q = NULL;delete q;//释放结点delete r;printProcess(p);//输出此时进程的相关信息cout << endl;
}bool securityAlgorithm(PCB *p) {//安全性检查算法PCB *m = p->next;//m指向第一个结点PCB *s = p->next;//s指向第一个结点int count = 0;bool flag = true;for (int i = 0; i<numberOfReSource; i++)//初始化work变量work[i] = available[i];cout << "初始时刻work变量的值:";for (int j = 0; j<numberOfReSource; j++)cout << work[j] << " ";cout << endl;while (s) {//将所有进程的finish初始化为falses->finish = false;s = s->next;}while (true) {//安全性检测flag = true;for (int j = 0; j<numberOfReSource; j++)if (m->need[j]>work[j] && !m->finish) {flag = false;break;}if (flag && !m->finish) {//找到符合条件的进程securitySequence[count++] = m->pName;//将该进程的名称加到安全序列中for (int j = 0; j<numberOfReSource; j++)//修改work变量的值work[j] = work[j] + m->allocation[j];m->finish = true;//修改finishcout << endl << "当前选中的进程:" << m->pName << endl;cout << "该进程预分配后work变量的值:";//输出此刻work变量的值for (int j = 0; j<numberOfReSource; j++)cout << work[j] << " ";cout << endl;}m = m->next;//m指向下一个进程if (m == NULL)//m指向第一个进程m = p->next;s = p->next;flag = false;for (int i = 0; i<numberOfProcess; i++) {if (s->finish) {s = s->next;continue;}flag = true;for (int j = 0; j<numberOfReSource; j++)if (s->need[j]>work[j]) {flag = false;break;}if (flag)//当前进程符合条件break;s = s->next;}if (!flag)//退出整个循环break;}flag = true;s = p->next;for (int i = 0; i<numberOfProcess; i++) {if (!s->finish) {flag = false;break;}s = s->next;}if (flag) {//全为truecout << endl << "当前系统是安全的" << endl;cout << "安全序列:";for (int i = 0; i<numberOfProcess; i++)cout << securitySequence[i] << " ";cout << endl;printProcess(p);return true;}else {//不全为falsecout << "当前系统是不安全的" << endl;printProcess(p);return false;}
}int main() {PCB *p = new PCB;PCB *q;initProcess(p);//初始化操作securityAlgorithm(p);//安全性检测string nameOfRequestResource;//请求资源的进程名int *requestResource = new int[numberOfReSource];bool flag = true;while (true) {cout << endl << "请输入发出请求资源的进程的名字:";cin >> nameOfRequestResource;cout << "请依次输入请求向量:";for (int i = 0; i<numberOfReSource; i++) {cin >> requestResource[i];}q = p->next;while (q) {//找到当前进程if (q->pName == nameOfRequestResource)break;q = q->next;}cout << endl << "银行家算法开始进行检查" << endl << endl;flag = true;for (int i = 0; i<numberOfReSource; i++) {if (requestResource[i]>q->need[i] || requestResource[i]>available[i]) {flag = false;break;}}if (flag) {//符合条件cout << "银行家算法检查过后发现符合要求" << endl << endl;for (int i = 0; i<numberOfReSource; i++) {available[i] -= requestResource[i];q->allocation[i] += requestResource[i];q->need[i] -= requestResource[i];}cout << "下面进行安全性算法检查" << endl << endl;if (!securityAlgorithm(p))//当前系统处于不安全状态for (int i = 0; i<numberOfReSource; i++) {available[i] += requestResource[i];q->allocation[i] -= requestResource[i];q->need[i] += requestResource[i];}}else//不符合条件cout << "银行家算法检查之后发现不符合要求" << endl << endl;cout << endl;string choose;cout << endl << "是否还有进程要申请资源,若是则输入YES,否则输入NO:";cin >> choose;if (choose == "NO")break;}q = NULL;delete q;return 0;
}

结果:

利用银行家算法避免死锁(C++实现)相关推荐

  1. 利用银行家算法避免死锁

    [概述] 操作系统中,银行家算法是避免死锁的一种重要算法. 本文针对<计算机操作系统(第四版)>(汤小丹)p123页的问题:**如果在银行家算法中把P0发出的请求向量改为Request0( ...

  2. 【操作系统/OS笔记15】死锁的系统模型,死锁的处理办法,银行家算法与死锁检验算法

    本次笔记内容: 11.1 死锁问题 11.2 系统模型 11.3 死锁特征 11.4 死锁处理办法 11.5 死锁预防和死锁避免 11.6 银行家算法 11.7 死锁检测和死锁恢复 文章目录 死锁问题 ...

  3. c/c++多线程模拟系统资源分配(并通过银行家算法避免死锁产生)

    银行家算法数据结构  (1)可利用资源向量Available  是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目.如果Available[j]=K,则表示系统中现有Rj类资源K个. ( ...

  4. python银行家算法_Linux 死锁概念与银行家算法python 实现

    一 . 死锁的概念 接上篇 http://shaobaobaoer.cn/archives/680/linux-process-manager-note 在之前的哲学家吃饭的问题中,当每个哲学家都想进 ...

  5. 银行家算法检测死锁c语言,[算法]操作系统进程调度与通信算法 Dijkstra银行家算法 C语言实现 | 李大仁博客...

    /* *银行家算法 *code CG 2008 01 05 */ #include"stdio.h" #define FALSE 0 #define TRUE 1 #define ...

  6. 避免死锁的银行家算法

    死锁的定义> 如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那仫该组进程就是死锁的. 产生死锁的必要条件> 1).互斥条件:进程对所分配到的资源进行排它性使用, ...

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

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

  8. 【计算机操作系统】银行家算法的模拟实现

    文章目录 前言 1 实验相关知识理论 1.1 死锁的概念 1.2 产生死锁的原因 1.3 避免死锁的方法 1.4 解除死锁的方法 2 实验设计思路 3 实验设计涉及到的数据结构 4 程序算法设计 4. ...

  9. 操作系统之银行家算法解析

    操作系统之银行家算法解析(带例题) 利用银行家算法避免死锁,首先我们先来明晰一下银行家算法的数据结构,其中必须设置四个数据结构,Available,Max,Allocation,Need. Avail ...

最新文章

  1. 买粮油也能玩出新花样?京东超市携手金龙鱼带来狗年礼盒!
  2. Android实现下拉头部缩放功能
  3. JObject 用法 、JProperty 用法、JArray 用法 Linq 转 Json
  4. set()与get()详细解答(C#)
  5. openmv串口数据 串口助手_STM32 串口接收不定长数据 STM32 USART空闲检测中断
  6. sysctl.conf文件详解
  7. 软件工程复习提纲——第七章
  8. android执行lua脚本的方法,从Android应用程序调用Lua脚本
  9. transactionscope 中的异步 处理 异常_PLC编程中的异常处理
  10. java新职篇:面向对象之抽象
  11. _DEVOBJ_EXTENSION结构体
  12. c# printDialog不显示问题
  13. 【NGUI】实现半圆形进度条,技能CD效果
  14. Netty详解第二课 Netty进阶和优化
  15. 泰拉瑞亚服务器搭建-瑟银灾厄-Centos
  16. 微信支付之App支付
  17. python二维码生成识别代码_Python学习案例之二维码生成识别
  18. 通信专业实务(三)——接入网
  19. 浙江大学计算机专业博导大牛,重磅!官方公布的“最强人脉高校”,校友全是大牛!...
  20. Fatal signal 11问题的解决方法

热门文章

  1. 购物小票 FoundPrice.java
  2. 最长递增子序列 最长连续递增序列
  3. 算法—详细讲解单向循环链表的实现(python)
  4. [ARM异常]-ARMV8-aarch64 异常(中断)是如何跳转到向量表的
  5. bl 和 ldr跳转程序的区别
  6. 进程间通信——DLL共享节
  7. Linux awk+uniq+sort 统计文件中某字符串出现次数并排序
  8. 7、MySQL设置日志输出方式
  9. 非递归遍历求二叉排序树的深度
  10. ACM入门之【读入、输出优化】