银行家算法 实验报告.docx
《银行家算法 实验报告.docx》由会员分享,可在线阅读,更多相关《银行家算法 实验报告.docx(9页珍藏版)》请在冰豆网上搜索。
![银行家算法 实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/21/3a43047d-12bc-4f32-aaa7-1e2a1ae240ca/3a43047d-12bc-4f32-aaa7-1e2a1ae240ca1.gif)
银行家算法实验报告
中北大学软件学院
实验报告
专业软件工程
课程名称计算机操作系统
学号
姓名
辅导教师张静成绩
实验日期
2015.11.18
实验时间
1实验名称:
实验三银行家算法
2、实验目的
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效的防止和避免死锁的发生。
3、实验要求
银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。
用银行家算法实现资源分配。
设计五个进程{p0,p1,p2,p3,p4}共享三类资源{A,B,C}的系统,例如,{A,B,C}的资源数量分别为10,5,7。
进程可动态地申请资源和释放资源,系统按进程的申请动态地分配资源,要求程序具有显示和打印各进程的某一个时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源号以及为某进程分配资源后的有关资源数据。
4、实验算法描述
5、实验代码
#include
usingnamespacestd;
#defineMAXPROCESS50/*最大进程数*/
#defineMAXRESOURCE100/*最大资源数*/
intAVAILABLE[MAXRESOURCE];/*可用资源数组*/
intMAX[MAXPROCESS][MAXRESOURCE];/*最大需求矩阵*/
intALLOCATION[MAXPROCESS][MAXRESOURCE];/*分配矩阵*/
intNEED[MAXPROCESS][MAXRESOURCE];/*需求矩阵*/
intREQUEST[MAXPROCESS][MAXRESOURCE];/*进程需要资源数*/
boolFINISH[MAXPROCESS];/*系统是否有足够的资源分配*/
intp[MAXPROCESS];/*记录序列*/
intm,n;/*m个进程,n个资源*/
voidInit();
boolSafe();
voidBank();
intmain()
{
Init();
Safe();
Bank();
}
voidInit()/*初始化算法*/
{
inti,j;
cout<<"请输入进程的数目:
";
cin>>m;
cout<<"请输入资源的种类数目:
";
cin>>n;
cout<<"请输入每个进程最多所需的各资源数,按照"<for(i=0;ifor(j=0;jcin>>MAX[i][j];
cout<<"请输入每个进程已分配的各资源数,也按照"<for(i=0;i{
for(j=0;j{
cin>>ALLOCATION[i][j];
NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];
if(NEED[i][j]<0)
{
cout<<"您输入的第"<
"<j--;
continue;
}
}
}
cout<<"请输入各个资源现有的数目:
"<for(i=0;i{
cin>>AVAILABLE[i];
}
}
voidBank()/*银行家算法*/
{
inti,cusneed;
charagain;
while
(1)
{
cout<<"请输入要申请资源的进程号(注:
第1个进程号为0,依次类推)"<cin>>cusneed;
cout<<"请输入进程所请求的各资源的数量"<for(i=0;i{
cin>>REQUEST[cusneed][i];
}
for(i=0;i{
if(REQUEST[cusneed][i]>NEED[cusneed][i])
{
cout<<"您输入的请求数超过进程的需求量!
请重新输入!
"<continue;
}
if(REQUEST[cusneed][i]>AVAILABLE[i])
{
cout<<"您输入的请求数超过系统有的资源数!
请重新输入!
"<continue;
}
}
for(i=0;i{
AVAILABLE[i]-=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];
NEED[cusneed][i]-=REQUEST[cusneed][i];
}
if(Safe())
{
cout<<"同意分配请求!
"<}
else
{
cout<<"您的请求被拒绝!
"<for(i=0;i{
AVAILABLE[i]+=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]-=REQUEST[cusneed][i];
NEED[cusneed][i]+=REQUEST[cusneed][i];
}
}
for(i=0;i{
FINISH[i]=false;
}
cout<<"您还想再次请求分配吗?
是请按y/Y,否请按其它键"<cin>>again;
if(again=='y'||again=='Y')
{
continue;
}
break;
}
}
boolSafe()/*安全性算法*/
{
inti,j,k,l=0;
intWork[MAXRESOURCE];/*工作数组*/
for(i=0;iWork[i]=AVAILABLE[i];
for(i=0;i{
FINISH[i]=false;
}
for(i=0;i{
if(FINISH[i]==true)
{
continue;
}
else
{
for(j=0;j{
if(NEED[i][j]>Work[j])
{
break;
}
}
if(j==n)
{
FINISH[i]=true;
for(k=0;k{
Work[k]+=ALLOCATION[i][k];
}
p[l++]=i;
i=-1;
}
else
{
continue;
}
}
if(l==m)
{
cout<<"系统是安全的"<cout<<"安全序列:
"<for(i=0;i{
cout<
if(i!
=l-1)
{
cout<<"-->";
}
}
cout<<""<returntrue;
}
}
cout<<"系统是不安全的"<returnfalse;
6、实验结论
7、实验心得
本次实验不仅让我对银行家算法有了更深入的理解,并且还让我的编程能力得到了较大提高,希望能有更多这样的机会,借此较好的锻炼自己,从而更好的掌握和运用自己的专业知识,提高能力水平。
本次实验相对于c++基础并不好的我有一定的难度,所以我在程序方面所做的较少。
而对银行家算法了解的比较透彻,在程序设计的原理和流程图方面做的工作较多,本次实验我学到的东西好多,也知道自己在很多方面的不足,虽然我给自己的发展方向定位为硬件方向,但是对C++还是要进一步的学习。