本篇博文为追忆曾经写过的算法系列第二篇(20081021)

温故知新

目的:具有代表性的死锁避免算法是Dijskstra给出的银行家算法。本实验是基于银行家算法的思想通过编写C++程序实现银行家算法的计算机程序化,使其更实用。同时也加深了有关自愿申请、避免死锁等概念,体会避免死锁的实际实现过程与方法。


要求: 1.设定进程p对各类资源r合理的最大需求max及初值确定;2.设定系统提供资源初始状况allocation;3.设定每次某个进程对各类资源的申请表示need;4.编制C++程序,基于银行家算法思想,决定申请是否被允许。

说明

1.数据结构

假设有p个进程r类资源,则有如下数据结构:

max[p][r]          p个进程对r类资源的最大需求量

allocation[p][r] p个进程已经得到r类资源的资源量

need[p][r]        p个进程还需要r类资源的资源量

available[r]    当前系统对r类资源的可用资源数

2.银行家算法

设进程I提出请求request[r],则银行家算法按如下规则进行判断。

(1)如果request[r]<=need[p][r],则转(2);否则,出错。

(2)如果request[r]<=available [r],则转(3);否则,出错。

(3)系统试探分配资源,修改相关数据:

available[r]= available [r]-request[r]

allocation[pn][r]=allocation[pn]+request[r]

need[pn][r]=need[pn][r]-request[r]

其中,pn指第pn行申请资源。

(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

3.安全性检查

(1)设置两个工作向量work=available;finish[p]=0;

(2)从进程集合中找到一个满足下述条件的进程,

finish[i]=0

need<=work

如找到,执行(3);否则,执行(4)

(3)设进程获得资源,可顺利执行,直至完成,从而释放资源:

work=work+allocation

finish[i]=1

转(2);

(4)如所有的进程finish[p]=1,则表示安全;否则系统不安全。

算法流程

算法程序

// gujinjin 08/10/05_06
// 避免死锁银行家算法的C++ 编程实现#include<iostream>
using namespace std;// p 进程数,r 资源种类
#define p 4
#define r 3/*-----------------------------------------------*/
/*输入函数*/
/*-----------------------------------------------*/
//a-max,b-allocation,c-need,d-available
void input(int a[p][r],int b[p][r],int c[p][r],int d[r])
{int i,j;cout<<"* input max data:\n";for(i=0;i<p;i++)for(j=0;j<r;j++)cin>>a[i][j];cout<<"* input allocation data:\n";for(i=0;i<p;i++)for(j=0;j<r;j++)cin>>b[i][j];cout<<"* input need data:\n";for(i=0;i<p;i++)for(j=0;j<r;j++)cin>>c[i][j];cout<<"* input available data:\n";for(j=0;j<r;j++)cin>>d[j];
}/*-----------------------------------------------*/
/*比较函数*/
/*-----------------------------------------------*/
//比较结果为m中的元素全大于n中的元素返回1,否则返回0
int com(int m[r],int n[r])
{int i,flag=0;for(i=0;i<r;i++)if(m[i]<n[i]){flag=1;break;}if(flag==1)  return(0);else return(1);
}/*-----------------------------------------------*/
/*安全性检验函数*/
/*-----------------------------------------------*/
//b、c、d意义同上
int stest(int b[p][r],int c[p][r],int d[r])
{int i,j,k,l,flag=0,flag1=0;int t[r],finish[p],dd[r];for(i=0;i<p;i++)finish[i]=0;//finish为1即表示available满足某一进程并让其实现for(i=0;i<r;i++)dd[i]=d[i];cout<<"分配序列:\n";for(k=0;k<p;k++)            //全搜索,直至实现或不可能实现{for(i=0;i<p;i++){if(finish[i]==1)continue;else{for(j=0;j<r;j++)t[j]=c[i][j];if(com(dd,t)){finish[i]=1;cout<<i+1<<'\t';flag=1;for(l=0;l<r;l++)dd[l]=dd[l]+b[i][l];break;}}if(flag==1)break;} }cout<<'\n';for(l=0;l<p;l++){//cout<<finish[l]<<endl;if(finish[l]==0)flag1=1;}//cout<<flag1<<endl;if(flag1==0)return(1);    //flag1为记录finish是否有0存在的标记,当flag1=0时,安全else return(0);
}/*-----------------------------------------------*/
/*申请进程后的安全性检验函数*/
/*-----------------------------------------------*/
//req-request,n-第n个进程申请资源
void rtest(int b[p][r],int c[p][r],int d[r],int req[r],int n)
{int i,j;int t[r];n=n-1;for(i=0;i<r;i++)t[i]=c[n][i];if(com(d,req)&&com(t,req))//对available,request进行比较{for(j=0;j<r;j++){b[n][j]=b[n][j]+req[j];c[n][j]=c[n][j]-req[j];d[j]=d[j]-req[j];}if(stest(b,c,d))cout<<"允许"<<n+1<<"个进程申请资源!\n";else {cout<<"不允许"<<n+1<<"个进程申请资源!\n";cout<<"恢复以前状态!\n";for(j=0;j<r;j++){b[n][j]=b[n][j]-req[j];c[n][j]=c[n][j]+req[j];d[j]=d[j]+req[j];}}}else cout<<"申请资源量出错!\n";
}/*-----------------------------------------------*/
/*主函数*/
/*-----------------------------------------------*/
void main()
{int j,n;                   //n-第n个资源申请int max[p][r],allocation[p][r],need[p][r];int available[r],request[r];input(max,allocation,need,available);if(stest(allocation,need,available)==1)cout<<"初始状态安全!\n";else cout<<"初始状态不安全!\n";cout<<" input request data:\n";for(j=0;j<r;j++)cin>>request[j];cout<<"第n个进程申请资源——n的值\n";cin>>n;rtest(allocation,need,available,request,n);
}

结果演示

避免死锁的银行家算法C++程序实现相关推荐

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

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

  2. 皮卡丘忠实粉丝之Web实现操作系统实验(进程调度+存储管理+死锁避免银行家算法)

    **皮卡皮卡丘~~~~~~** 目录 进程调度 目的和要求 内容与步骤 运行结果 问题及心得 C语言实现代码 存储管理 目的和要求 内容与步骤 运行结果 问题及心得 C语言实现代码 死锁避免银行家算法 ...

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

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

  4. 《操作系统》实验四:预防进程死锁的银行家算法

    [实验题目]:预防进程死锁的银行家算法 [实验学时]:4学时 [实验目的] 通过这次实验,加深对进程死锁的理解,进一步掌握进程资源的分配.死锁的检测和安全序列的生成方法. [实验内容] 问题描述: 设 ...

  5. 【避免进程死锁】银行家算法

    一.概述 银行家算法(Banker's Algorithm)是一个避免进程死锁的著名算法,由 Dijkstra 于 1965 年提出.本文为笔者的读书笔记,结构如下: 死锁 银行家算法 例子展示 补充 ...

  6. 操作系统-进程死锁:银行家算法

    文章目录 进程死锁:银行家算法 问题描述 实验环境 输入 输出 测试数据 实验设计 数据结构 主要函数功能和参数 系统框架图 流程图 实验结果与分析 结果展示与描述 结果分析 总结 源代码 进程死锁: ...

  7. 避免死锁: 银行家算法

    避免死锁: 银行家算法 1.背景 在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还.银行家在客户申请的贷款数量不超 ...

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

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

  9. 二十三、死锁的处理策略---避免死锁(银行家算法)

    一.知识总览 二.什么是安全序列 **所谓安全序列:**就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成,只要能找出一个安全序列,系统就是安全状态.当然,安全序列可能有多个. 如果分配了资源 ...

最新文章

  1. 2022-2028年中国再生橡胶制造行业市场专项调研及投资前景规划报告
  2. 具体解释可变參数列表
  3. java datarow_DataSet DataTable DataRow 深入浅出
  4. eigen3.3.8帮助文档下载 chm_MAXHUB文档v1.10.1-MAXHUB文档电脑版下载
  5. Power Designer的使用
  6. keycode对应主要键的关系
  7. 批准Oracle IDM中的特定Web服务
  8. 过拟合问题——正则化方法
  9. java boolean if_Java if(boolean)和if(boolean=true)区别解析
  10. requirejs页面刷新失效js报错问题解决方案
  11. Access数据库连接字符串读取,设置
  12. (转)用AGG实现高质量图形输出(二)
  13. Android N 将提供分屏功能和新设计的通知控制
  14. 与计算机运算速度相关参数,计算机CPU运算速度是多少
  15. 用 ANSYS/LS-DYNA 进行显式动力学仿真计算 (转帖,有修改)
  16. 有哪些免费批量删除PDF文档的页码的方法
  17. NOIP 2014 primeの酱油记+题解
  18. python学后总结_学员 | 斥巨资学完数据分析后,给大家总结了7个小建议
  19. MIC(最大信息系数)
  20. 读书笔记:《经验的疆界》

热门文章

  1. matlab零交叉块,[MATLAB基础] 关于心电信号奇异点与其小波变换模极大值对的零交叉点的关系?请教下面程序应该如何理解哈...
  2. sklearn实现KNN分类算法
  3. itext总页数_itext 生成pdf文件添加页眉页脚
  4. 软件著作权登记加急申请时对于版本号的注意事项,可以是V5.0 V3.0 V2.0吗?
  5. Balsamiq Mockups:非常强悍的手绘界面原型设计工具
  6. 【微信小程序】浅谈Android消息机制原理,大厂面经合集
  7. go每日新闻(2021-08-02)——互联网架构大会(GIAC)摘录
  8. 放大和收缩 mac版word 的文档显示比例
  9. android设备wifi无线adb调试
  10. AspCms 2.0 标签大全-新华站长网