银行家算法模拟,请问华为手机截图怎么这个截图与实验内容相符吗?内容要求5类资源,截图只有3,请帮忙弄一份5类资源!

预防进程死锁的银行家算法
一:需求分析
程序设计的任务和目的:设计程序模拟预防进程死锁的银行家算法的工作过程。假设系统中有n个进程P1, … ,Pn,有m类可分配的资源R1, … ,Rm,在T0时刻,进程Pi分配到的j类资源为Allocationij个,它还需要j类资源Need ij个,系统目前剩余j类资源Workj个,现采用银行家算法进行进程资源分配预防死锁的发生。
通过这次实验,加深对进程死锁的理解,进一步掌握进程资源的分配、死锁的检测和安全序列的生成方法。
(1) 输入的形式和输入值的范围;
为免去测试时候需要逐步输入数据的麻烦,输入时采用输入文件流方式将数据放在.txt文件中,第一行为进程个数和资源个数,二者之间用空格隔开。第二行为进程已分配的各资源个数(之间用空格隔开),第三行为进程仍需要的进程个数(之间用空格隔开),第四行为各个资源的可用数。运行程序后按照提示输入请求资源的进程号和请求的各资源数。 (2) 输出的形式;
先输出初始状态下的安全序列,后用户输入申请的进程号和资源数后判断,若为安全状态则输出安全序列,若不安全,则输出不安全。 (3) 程序所能达到的功能;
可以判断给出的数据是否为安全状态,若安全则输出安全序列,不安全则提示信息。申请资源后可先判断资源是否合理,若合理则预分配,然后判断是否安全,若安全则输出安全序列,不安全则恢复各数据并提示信息。
(4) 测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。 详见运行结果截图。 二:概要设计
主程序模块void main()调用银行家算法bool bank()和安全比较算法boolcompare();以及打印输出函数bool bank();
银行家算法bool bank()调用输出函数bool bank(int* availabled,int n,int m)
主要思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。 三:详细设计
数据结构按照课本上所给思路编写。 银行家算法步骤
(1)如果Requesti<or =Need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。
(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:
Available=Available-Request[i];
Allocation=Allocation+R
Need=Need-R
(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
安全性算法步骤(安全性算法放在了银行家算法内) (1)设置两个向量
①工作向量Work。它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=A②布尔向量Finish。它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时,令Finish[i]=true (2)从进程集合中找到一个能满足下述条件的进程: ①Finish[i]=false②Need&or=Work 如找到,执行步骤(3);否则,执行步骤(4)。
(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行: Work=Work+A Finish[i]=
转向步骤(2)。
(4)如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态。 主要代码:读入文件,利用安全性算法进行检测的函数,利用银行家算法进行判定的函数, 打印输出的函数(详见源代码)。 主要程序流程图:
银行家算法流程图:
四:调试分析
调试过程中遇到的问题:判断和循环使用不当导致无法得出结果。在上一次资源分配不安全后无法再申请资源,后添加判断和循环后实现可一直按用户请求分配资源。改进:能够每次合理分配后均能输出分配后的各资源数。经验和体会:通过这次实验,加深了对进程死锁的理解,进一步掌握了进程资源的合理分配、死锁的检测和安全序列的生成方法。 五:用户使用说明
1、如下图按照下图格式输入数据第一行为进程个数和资源个数,二者之间用空格隔开。第二行为进程已分配的各资源个数(之间用空格隔开),第三行为进程仍需要的进程个数(之间用空格隔开),第四行为各个资源的可用数。运行程序后按照提示输入请求资源的进程号和请求的各资源数。
2、按提示输入申请资源的进程号,按回车。
3、按提示输入申请的各类资源个数,中间用空格隔开,按回车即可看到结果。 六:测试结果
测试数据:
运行结果截图:
七:附录 源程序:
#include&iostream& #include&sstream&
//读文件 #include&fstream&
//读文件 #include&iomanip&
//格式化输出结果
const static int MaxNumber=100;
int Available[MaxNumber];
//最初状态的可分配资源
int SAvailable[MaxNumber];
//时时状态的可分配资源
int Max[MaxNumber][MaxNumber];
int Allocation[MaxNumber][MaxNumber]; //Allocation
int Need[MaxNumber][MaxNumber];
int Request[MaxNumber];
int SafeOrder[MaxNumber];
//存放安全序列
bool Finished[MaxNumber];
//存放各进程是否完成您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
银行家算法的模拟实现操作系统课程设计.doc19页
本文档一共被下载:
次 ,您可免费全文在线阅读后下载本文档
文档加载中...广告还剩秒
需要金币:200 &&
你可能关注的文档:
··········
··········
课程设计报告
银行家算法的模拟实现操作系统
题目:银行家算法的模拟实现一、设计目的
本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
二、设计内容
用C或C++语言编制银行家算法通用程序,并检测所给状态的系统安全性。
算法介绍:数据结构:
可利用资源向量 A
最大需求矩阵M
需求矩阵Need
模拟实现Dijkstra的银行家算法以避免死锁的出现,分两部分组成:
第一部分:银行家算法(扫描);
第二部分:安全性算法。
2)设计原理
一.银行家算法的基本概念
1、死锁概念。
在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险━━死锁。所谓死锁Deadlock,是指多个进程在运行中因争夺资源而造成的一种僵局Deadly_Embrace,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。一组进程中,每个进程都无限等待被该组进程中另一进程所占有的资源,因而永远无法得到的资源,这种现象称为进程死锁,这一组进程就称为死锁进程。
2、关于死锁的一些结论:
参与死锁的进程最少是两个 (两个以上进程才会出现死锁)
参与死锁的进程至少有两个已经占有资源
参与死锁的所有进程都在等待资源
参与死锁的进程是当前系统中所有进程的子集
注:如果死锁发生,会浪费大量系统资源,甚至导致系统崩溃。
3、资源分类。
永久性资源:可以被多个进程多次使用(可再用资源)可抢占资源不可抢占资源
临时性资源:只可使用一次的资源;如信号量,中断信号,同步信号等
正在加载中,请稍后...银行家算法C语言模拟程序
银行家算法C语言模拟程序
这个最简单的模拟程序,为了完成操作系统作业而做的。大家放心,绝对可以运行,呵呵!
有什么不完善的地方请提出!(在计数器的运用上比较乱,希望大家看的明白)
(注:各位大哥大姐们,希望大家重视小弟我身为初学者不容易,到时别在其他网站到处乱添,这样小弟我会很伤心的!作者:luo卢丹)
#include&stdio.h&
#include&stdlib.h&
#include&conio.h&
Available[10];&&&&&&&&&&
//可使用资源向量
Max[10][10];&&&&&&&&&&&&
//最大需求矩阵
Allocation[10][10]={0};&&&&&
//分配矩阵
Need[10][10]={0};&&&&&&&&&&&
//需求矩阵
Work[10];&&&&&&&&&&&&&&&
//工作向量
Finish[10];&&&&&&&&&&&&&
//状态标志
Request[10][10];&&&&&&&&
//进程申请资源向量
int Pause[10];
int List[10];
n;&&&&&&&&&&&&&&&&&&&&&&
//系统资源总数
m;&&&&&&&&&&&&&&&&&&&&&&
//总的进程数
a;&&&&&&&&&&&&&&&&&&&&&&
//当前申请的进程号
l,e;&&&&&&&&&&&&&&&&&&&&
b=0,c=0,f=0,g;&&&&&&&&&&
void mainenter()//主要的输入部分代码
&printf("请输入系统总共有的资源数:");
&scanf("%d",&n);
&printf("请输入总共有多少个进程:");
&scanf("%d",&m);
&for(i=1;i&=n;i++)
&&printf("第%d类资源有的资源实例:",i);
&&scanf("%d",&Available[i]);
&for(i=1;i&=m;i++)
&&for(j=1;j&=n;j++)
&&&printf("进程P[%d]对第%d类资源的最大需求量:",i,j);
&&&scanf("%d",&Max[i][j]);
&&&Need[i][j]=Max[i][j];
void mainrequest()& //进程提出新申请的代码部分
printf("请输入申请资源的进程:");
scanf("%d",&a);
&for(i=1;i&=n;i++)
&&printf("请输入进程P[%d]对%d类资源的申请量:",a,i);
&&scanf("%d",&Request[a][i]);
&&if(Request[a][i]&Need[a][i])
&&&printf("\n出错!进程申请的资源数多于它自己申报的最大量\n");
&&if(Request[a][i]&Available[i])
&&&printf("\nP[%d]必须等待\n",a);
//以下是试探性分配
&&Available[i]=Available[i]-Request[a][i];
&&Allocation[a][i]=Allocation[a][i]+Request[a][i];
&&Need[a][i]=Need[a][i]-Request[a][i];
&&Work[i]=Available[i];
&for(i=1;i&=m;i++)&
&&Pause[i]=Available[i];//Pause[i]只是一个暂时寄存的中间变量,为防止在下面
&&&&&&&&&&&&&&&&&&&&&&&&//安全性检查时修改到Available[i]而代替的一维数组
&&Finish[i]=
&for(g=1;g&=m;g++)
&&for(i=1;i&=m;i++)
&&&b=0;&&&&&&&&&&&&&&&&&//计数器初始化
&&&for(j=1;j&=n;j++)
&&&&if(Need[i][j]&=Pause[j])
&&&&&b=b+1;&&&&
&&&&&&&&&&&&&&&
if(Finish[i]==false&&b==n)
&&&&&for(l=1;l&=n;l++)
&&&&&&Pause[l]=Pause[l]+Allocation[i][l];&
&&&&&Finish[i]=&
&&&&&printf("$$
%d ",i);//依次输出进程安全序列之一中每个元素
printf("\n");
&for(i=1;i&=m;i++)
&&if(Finish[i]==true)
f=f+1;//统计Finish[i]==true的个数
&if (f==m)
&&printf("safe static");
f=0;//将计数器f重新初始化,为下一次提出新的进程申请做准备
&&printf(" unsafe static
");//以下代码为当系统被判定为不安全状态时
&&&&&&&&&&&&&&&&&&&&&&&&&&&
//返回提出申请前的状态
&&for(i=1;i&=n;i++)
&&&Available[i]=Available[i]+Request[a][i];
&&&Allocation[a][i]=Allocation[a][i]-Request[a][i];
&&&Need[a][i]=Need[a][i]+Request[a][i];
void mainprint()
&printf("当前的系统状态\n");
&printf("&&&&&&&
目前占有量&&&&
最大需求量&&&&&
尚需要量 \n进程");
&for(i=1;i&=n;i++)
&&for(j=1;j&=n;j++)
&&&printf("&
&for(i=1;i&=m;i++)
&&printf("\nP[%d]",i);
&&for(j=1;j&=n;j++)
&&&printf("&&
%d ",Allocation[i][j]);
&&for(j=1;j&=n;j++)
&&&printf("&&
%d ",Max[i][j]);
&&for(j=1;j&=n;j++)
&&&printf("&&
%d ",Need[i][j]);
&printf("\n\n系统剩余资源量:&&
&for(i=1;i&=n;i++)
&&printf("&&
%d ",Available[i]);
&printf("\n");
void main()
&{ int k,h=1;
&& while(h)
system("cls");&
&&&&printf("\n\n&&&&&&&&&&&
★ 欢迎使用本程序 ★\n");
&&&&printf("\n\n&
1:输入系统的资源数、申请进程数、每个类资源的实例数");
&&&&printf("\n&
2:……………………………………& 输入进程的资源申请");
&&&&printf("\n&
3:……………………………………………& 输出系统状态");
&&&&printf("\n&
4:…………………………………………………& 退出程序");
&&&&printf("\n\n
please choose ");
&&&&scanf("%d",&k);
1:mainenter();&&&&&
2:mainrequest();&&&&&
3:mainprint();&&&&&
4:h=0;&&&&&&&
printf("\n");
system("pause");
&& system("cls");
printf("\n\n&&&&&&
谢谢使用 \n");
&& printf("\n\n&
See you next time!!!\n\n\n");
以下是程序运行截图:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。君,已阅读到文档的结尾了呢~~
银行家算法的模拟实现(课程设计)
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
银行家算法的模拟实现(课程设计)
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 银行家算法例题 的文章

 

随机推荐