银行家算法中安全性检查子算法的实现
实验内容:
编程实现银行家算法中的安全性检查子算法,要求:
(1) 本程序要能描述 n 个并发进程共享 m 类资源,在某一时刻的资源分配状态;
n、m 自定,但都不能小于 3;
(2) 本程序功能:
① 联机输入:系统拥有的每类资源的最大数量(即可利用资源向量的初值)、
n 个进程的最大需求矩阵、当前时刻 n 个进程的已分配资源矩阵;
② 如果①中出现不合理的输入,直接检查指出,并不进行后续步骤,程序
结束;
③ 计算并输出系统当前时刻的可利用资源向量;
④ 计算并输出当前时刻 n 个进程的还需要资源矩阵;
⑤ 根据安全性检查算法,判定当前系统状态是否安全,输出检查结论。
注意:
(1) 这里所指的“不合理的输入”是:某进程对某资源的最大需求大于系统拥有
该类资源的最大数量;某进程在某类资源上,已分配资源大于它的最大需求等。
(2) 这个算法是“银行家算法”的子算法,其中用到的数据结构必须采用与银行
家算法相同的数据结构(见教材),以方便下次实验使用
设计、运行程序,记录设计程序的源代码;
运行时的输入数据,应该包含合理输入和不合理输入两种情况;
观察并记录运行结果。
/*这里模拟的是3个进程申请3个资源*/
要用.cpp的格式保存下列代码
#define M 3 //资源类数
int Max[N][M]; //最大需求矩阵Max
int Allocation[N][M]; //分配矩阵Allocation
int Need[N][M]; //需求矩阵Need
int finish[N];
int work[M];
int i=0; //第i个进程
int j=0; //第j个资源
finish[i]=false;
}
for( j=0;j<M;j++){
work[j]=available[j];
}
for( i=0;i<N;i++){
if(finish[i]==false&&Need[i][0]<=work[0]&&Need[i][1]<=work[1]&&Need[i][2]<=work[2]){
goto STEP3;
}else{
if(i==N-1){
//从进程集合中找不到一个进程能满足条件时
goto STEP4;
}
}
}
finish[i]=true;
work[0]=work[0]+allocation[i][0];
work[1]=work[1]+allocation[i][1];
work[2]=work[2]+allocation[i][2];
goto STEP2;
bool alltrue=true;
for( i=0;i<N;i++){
if(finish[i]==false){
alltrue=false;
break;
}
}
}
{
/* 1、初始化*/
int k; //用在判断进程对资源的最大需求数目超过了当前可用资源数目处
int m,n; //用在3个进程的对3类资源的各自最大需求资源数目处
int x,y; //用在3类资源的已分配资源数目处
int v,w; //用在3个进程对3类资源的还需求数目处
int a=0;
int b,c;
int max_Available[3]={0,0,0};//未初始化的可利用最大资源数目
int g=0; //用作循环以确定当前的可利用资源
printf("请依次输入3类资源的可用资源数目的最大值(中间以空格隔开):\n");
scanf("%d%d%d",&max_Available[0],&max_Available[1],&max_Available[2]);
printf("请依次输入3个进程的对3类资源的各自最大需求资源数目(中间以空格隔开):\n");
for(m=0;m<3;m++){
for(n=0;n<3;n++)
scanf("%d",&Max[m][n]);
//scanf("%d,%d,%d",&Max[m][0],&Max[m][1],&Max[m][2]);
}
for(k=0;k<3;k++)
{
if(Max[k][0]>=max_Available[0]||Max[k][1]>=max_Available[1]||Max[k][2]>=max_Available[2])
{
printf("error:进程对资源的最大需求数目超过了可用资源数目的最大数目!!\n");
return 0;
}
}
printf("请依次输入3类资源的已分配资源数目(中间以空格隔开):\n");
for(x=0;x<3;x++)
for(y=0;y<3;y++)
scanf("%d",&Allocation[x][y]);
for(;g<3;g++)
Available[g]=max_Available[g]-Allocation[0][g]-Allocation[1][g]-Allocation[2][g];
printf("当前可利用资源的数目分别为:\n");
for(g=0;g<3;g++)
printf("%d\t",Available[g]);
printf("\n");
for( v=0;v<N;v++)
{
for(w=0;w<M;w++)
Need[v][w]=Max[v][w]-Allocation[v][w];
}
printf("3个进程对3类资源的还需求数目如下:\n");
for(b=0;b<3;b++)
{
for(c=0;c<3;c++)
{
printf("%d\t", Need[b][c]);
a+=1;
}
if(a==3) //控制换行
{
a=0;
printf("\n");
}
}
bool secure=bankSecurable(Allocation,Available);
if(secure)printf("the sequence is securable...\n");
else printf("the sequence is not securable!!!\n");
}
系统中某一类资源当前的空闲数目。其初始值是系统中所配置的该类
(惠州学院 刘宇芳 2016)
全部(最多)可用资源的数目; 其数值随该类资源的分配和回收而动态地
改变。如 Available[j] = K,则表示系统中目前 j 类资源空闲 K 个。
表进程 i 生命周期中需要 j 类资源的最大数量;例如:Max[i,j] = K,
则表示进程 i 需要 j 类资源的最大数目为 K。
由系统中目前并发执行的 n 个进程的最大需求向量组成 Max,这
是一个 n×m 的矩阵。 它定义了系统中 n 个进程中的每一个进程对系统
的 m 类资源的最大需求。
代表目前系统已经给 i 进程分配 j 类资源的数量; 如果 Allocation[i, j] =
K,则表示进程 i 当前已获得 j 类资源的数目为 K。
由系统中目前并发执行的 n 个进程的已分配资源向量组成
Allocation,这也是一个 n×m 的矩阵。它定义了系统中每一类资源当
前已分配给每一进程的资源数。
该进程 i 继续运行至完成还需要 j 类资源的数量;如果 Need[i,j]=K,
则表示进程 i 还需要 j 类资源 K 个,方能完成其任务。
这也是一个 n×m 的矩阵,用以表示每一个进程尚需的各类资源
数。上述三个矩阵存在如下关系:
(惠州学院 刘宇芳 2016)
Need[i,j]= Max[i,j] –Allocation[i,j]
以上四个数据结构描述了系统当前资源分配的一个状态。
目前可提供给进程继续运行使用的各类资源(空闲的)数目, 在开始执行
安全性检查算法时,赋初值 Work:=Available;
2 完成向量 Finish,它是一个含有 n 个分量的一维逻辑型数组,它表
示系统目前是否有足够的资源分配给系统目前的 n 个进程,使之运行
直到完成。 当系统目前有足够资源分配给进程 i 时, 令 Finish[i]: =true;
算法开始时先给 Finish 赋初值,对每个进程 i,Finish[i]:=false;
② 进程 i 的每个 Need[i,j] ≤ Work[j];
若能找到,执行步骤(3);否则,执行步骤(4);
释放出分配给它的资源,故可以执行:
① Finish[i] := true;/*将进程 i 放入推进序列*/
② 每个 Work[j] :=Allocation[i,j]+ Work[j] ;/*回收进程 i 的全
部资源*/
③ go to 步骤 2;
程推进序列,这个序列就是安全序列,这表示系统目前处于安全状态;
否则, 说明有若干个进程无法进入推进序列, 系统处于不安全状态。 (经
过逐一计算后,如果是由于不满足步骤 2 的条件①而结束循环,则找
到了一个安全序列;如果是由于不满足步骤 2 的条件②而结束循环,
则没有找到安全序列;)
银行家算法中安全性检查子算法的实现相关推荐
- 计算机LCG/PCG/MWC/XorShift等PRNG算法,以及V8中Math.random()、webkit中crypto等随机算法的实现
计算机LCG/PCG/MWC/XorShift等PRNG算法,以及V8中Math.random().webkit中crypto等随机算法的实现 本文篇幅较长,如想直接看 js 的随机数实现可定位本文E ...
- 彩票软件中热温冷算法的实现情况
彩票软件中热温冷算法的实现情况 Delphi / Windows SDK/API http://www.delphi2007.net/DelphiDB/html/delphi_200612251912 ...
- 简单分析Guava中RateLimiter中的令牌桶算法的实现
为什么80%的码农都做不了架构师?>>> 令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法.典型情况下,令 ...
- java令牌桶_简单分析Guava中RateLimiter中的令牌桶算法的实现
令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法.典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送. ...
- OpenCV中图像旋转(warpAffine)算法的实现过程
在OpenCV中,目前并没有现成的函数直接用来实现图像旋转,它是用仿射变换函数cv::warpAffine来实现的,此函数目前支持4种插值算法,最近邻.双线性.双三次.兰索斯插值,如果传进去的参数为基 ...
- python 推荐系统算法,Python用户推荐系统minkowski算法的实现
Python用户推荐系统minkowski算法的实现 #-*- coding: utf-8 -*- ''' python: www.iplaypy.com @author: Jekey 欧几里得距离 ...
- java 排序算法面试题_面试题: java中常见的排序算法的实现及比较
1.冒泡排序 1.1 冒泡排序普通版 每次冒泡过程都是从数列的第一个元素开始,然后依次和剩余的元素进行比较,若小于相邻元素,则交换两者位置,同时将较大元素作为下一个比较的基准元素,继续将该元素与其相邻 ...
- 关于近邻保持算法LLE,LPP,NPE等算法的实现---流行学习
需要注意的是: 1.在基于流行学习的方法中,所谓的M=(I-W)*(I-W)'中的I是单位矩阵.而不是1 2.对于图W,我们将系数按照一列一列的形式放,并且,Sw = Train_Ma*Mg*Trai ...
- 粒子群算法(8)---混合粒子群算法的实现
混合粒子群算法将全局粒子群算法与局部粒子群算法结合,其速度更新采用公式 其中G(k+1)是全局版本的速度更新公式,而L(k+1)是局部版本的速度更新公式,混合粒子群算法采用H(k+1)的公式. 位置更 ...
最新文章
- oracle没什么没有备份,怎么恢复没有备份的Oracle数据库
- 数据库设计Step by Step (9)——ER-to-SQL转化
- 浙二大数据朱继红_快看!浙经贸2020级新生趣味大数据来咯!
- 软件测试周记录之jmeter
- 解决用navicate远程连接数据库出现1045 access denied for user 'root'@'localhost' using password yes...
- Hexo创建导航页面
- html个版本间的特点,了解下什么是HTML5,他与以往的版本有什么区别 什么新元素...
- panel中html怎么写,panel控件有什么用 请写出Panel控件的用途
- python多线程下载器_用 python 实现一个多线程网页下载器
- Spring web应用最大的败笔
- 疯狂java讲义价格_疯狂java讲义
- C++语言(11)——C++类成员函数调用分析
- python 面授_5天Python实战营(面授)
- JavaWeb——Servlet开发3
- [b][size=5]沸点文库下载器V2.5.0.0——百度文库豆丁道客巴巴实时浏览下载热门排行文档推荐[/size][/b] [b]沸点文库下载器 - 沸点文档下载 软件信息 软件版本:V2.5.
- 芝麻信用商家接入指南
- Spring Boot 2 基础篇学习笔记
- index+match函数/一对多查找匹配,可以代替Vlookup函数的使用。
- 天下无敌宇文拓,一肩担尽古今愁
- 阿里云域名https证书(ssl证书)配置
热门文章
- Problem 3: 人造卫星的高度
- origin两个图层图例合并_origin8.0版怎样将图例调成横排,换句话说,图例可不可自由调动...
- linux软件安装之详解apt、yum、dnf 和 pkg包安装
- 计算机毕业设计JAVA糖助手服务交流平台mybatis+源码+调试部署+系统+数据库+lw
- Ceph MDS问题分析
- FCKeditor使用详解(汇总)
- 通过tftp在ubuntu和LS1B开发板之间传输文件
- 手机chrome查看源代码_如何查看Chrome扩展程序的源代码
- 计算机电子工程论文,电子信息工程论文范文
- 大航海时代5服务器维护,《大航海时代5》停运公告