您的当前位置:首页正文

银行家算法 实验报告

2022-03-22 来源:钮旅网


淮海工学院计算机工程学院

实验报告书

课程名: 《操作系统原理》

题 目: 银行家算法 班 级: D 学 号: 姓 名:

评语: 成绩: 指导教师: 批阅时间: 年 月 日 《操作系统原理》实验报告 - 1 -

一、实验目的

银行家算法是操作系统中避免死锁的典型算法,本实验可以加深对银行家算法的步骤和相关数据结构用法的更好理解。 实验环境

Turbo C 2.0/3.0或VC++6.0 实验学时

4学时,必做实验。

二、实验内容

用C语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。程序能模拟多个进程共享多种资源的情形。进程可动态地申请资源,系统按各进程的申请动态地分配资源。要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源数量以及为某进程分配资源后的有关资源数据的情况。

三、实验说明

实验中进程的数量、资源的种类以及每种资源的总量Total[j]最好允许动态指定。初始时每个进程运行过程中的最大资源需求量Max[i,j]和系统已分配给该进程的资源量Allocation[i,j]均为已知(这些数值可以在程序运行时动态输入),而算法中其他数据结构的值(包括Need[i,j]、Available[j])则需要由程序根据已知量的值计算产生。

四、实验步骤

1、理解本实验中关于两种调度算法的说明。 2、根据调度算法的说明,画出相应的程序流程图。 3、按照程序流程图,用C语言编程并实现。 五、分析与思考

1.要找出某一状态下所有可能的安全序列,程序该如何实现?

要找出这个状态下的所有可能的安全序列,前提是要是使这个系统先处于安全状态,而系统的状态可通过以下来描述:进程剩余申请数=最大申请数-占有数;可分配资源数=总数-占有数之和;通过这个描述来算出系统是否安全,从而找出所有的安全序列。

2.银行家算法的局限性有哪些?

银行家算法是一种最有代表性的避免死锁的算法。银行家算法即把操作系统看作是银行 家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申

《操作系统原理》实验报告 - 2 -

请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。但任何一种算法都存在其缺点,对各进程的资源分配要求严格,经常使其处于不安全状态,银行家算法的主要局限是过于谨慎和检查各申请者对各类资源的最大需求量开销较大。

六、测试数据与实验结果

银行家算法流程图:

进入程序 添加数据 申请资源 测试安全序列 是 输出安全序列 否 退出

《操作系统原理》实验报告 - 3 -

七、实验心得与体会

通过这次实验,知道了,什么是银行家算法,也知道了银行家算法是怎么样运行的。还知道了

《操作系统原理》实验报告 - 4 -

在用该算法时所需要注意的方面。 附录:

#include #include using namespace std;

int Available[100]; //可利用资源数组 int Max[50][100]; //最大需求矩阵 int Allocation[50][100]; //int Need[50][100]; //int Request[50][100]; int Finish[50];

char name[100]; //int temp[100];

int temp1[100]; //int sum[100]; //int p[50];

int m,n; //mint IsSafe() // {

int i,j,l=0;

int Work[100]; // for(i=0;ifor(i=0;i{ if(Finish[i]==1) continue; else

{ for(j=0;jWork[j])

break;

}

分配矩阵 需求矩阵 资源名字 资源总数量

已分配的各资源和个进程,n个资源 可利用资源数组 《操作系统原理》实验报告 - 5 -

}

if(j==n) { } else

continue; Finish[i]=1;

for(int k=0;kWork[k]+=Allocation[i][k]; p[l++]=i; i=-1;

if(l==m) {

cout<<\"系统是安全的\"<cout<cout<if(i!=l-1) cout<<\"-->\";

}

} return 0; }

void showdata()//显示资源矩阵 {

int i,j;

cout<<\"系统目前可用的资源[Avaliable]:\"<cout<cout<cout<cout<<\" Max Allocation Need\"<《操作系统原理》实验报告 - 6 -

cout<<\"进程名 \"; for(j=0;j<3;j++) {

for(i=0;icout<}

cout<void InputFor1() {

cout<<\" \"<cout<cout<cout<}

int i,j;

cout<<\"输入每个进程最多所需的各资源数,按照\"<for(j=0;jcin>>Max[i][j];

cout<<\"输入每个进程已分配的各资源数,也按照\"<for(j=0;jcin>>Allocation[i][j];

\"<\"<《操作系统原理》实验报告 - 7 -

}

}

}

Need[i][j]=Max[i][j]-Allocation[i][j]; if(Need[i][j]<0) { }

cout<<\"你输入的第\"<源数错误,请重新输入:\"<void InputFor2() { }

int i,j;

cout<<\"输入每个进程最多所需的各资源数,按照\"<for(j=0;jcin>>Max[i][j];

cout<<\"输入每个进程需要各资源数,也按照\"<for(j=0;jcin>>Need[i][j];

Allocation[i][j]=Max[i][j]-Need[i][j]; if(Allocation[i][j]<0) { }

cout<<\"你输入的第\"<\"<\"<数错误,请重新输入:\"<}

《操作系统原理》实验报告 - 8 -

void InputFor3() {

int i,j;

cout<<\"输入每个进程已分配的各资源数,按照\"<for(j=0;jcin>>Allocation[i][j];

cout<<\"输入每个进程需要各资源数,也按照\"<void Requst() {

for(j=0;jcin>>Need[i][j];

Max[i][j]=Allocation[i][j]+Need[i][j];

char YesOrNo; int i,mi;

cout<<\"输入要申请资源的进程号(注:第1个进程号为0,依次类推)\"<>mi;

cout<<\"输入进程所请求的各资源的数量\"<if(Request[mi][i]>Need[mi][i]) { }

if(Request[mi][i]>Available[i]) { }

cout<<\"你输入\"<>Request[mi][i]; for(i=0;i《操作系统原理》实验报告 - 9 -

}

for(i=0;iif (IsSafe()==1) {

showdata(); } else { }

cout<<\"你还想再次请求分配吗?是请按y/Y,否按n/N,再确定\"<>YesOrNo;

if(YesOrNo=='y'||YesOrNo=='Y'||YesOrNo=='n'||YesOrNo=='N') { } else { }

cout<<\"请按要求输入!\"<cout<<\" \"<Requst(); else

cout<<\"你的请求被拒绝!\"<Available[i]+=Request[mi][i]; Allocation[mi][i]-=Request[mi][i]; Need[mi][i]+=Request[mi][i]; Available[i]-=Request[mi][i]; Allocation[mi][i]+=Request[mi][i]; Need[mi][i]-=Request[mi][i];

cout<<\"同意分配\"<《操作系统原理》实验报告 - 10 -

void ChResource() { char mi2; int i,b,c ; char YesOrNo1;

cout<<\"您是要修改单个资源还是一起添加 Y全部,N单个\"<>YesOrNo1;

if(YesOrNo1=='y'||YesOrNo1=='Y'||YesOrNo1=='n'||YesOrNo1=='N') {

if(YesOrNo1=='y'||YesOrNo1=='Y') for (i=0;i{ cout<<\"请您输入你要修改的Available\"<cin>>Available[i];

showdata();

} else {

cout<<\"请输入你要修改的资源名字\"<>mi2; for (i=0;itemp1[i]=Available[i]; }

cout<<\"您修改的是\"<{

if (mi2=name[i]) { c=i ; break; }

cin>>b;

if(Available[i]<0)

《操作系统原理》实验报告 - 11 -

} }

}

cout<<\"您修改的数据出现错误请重新输入\"<showdata(); } else { } }

void ChProcess() { int a,i; char YesOrNo2;

cout<<\"请按要求输入!\"<cout<<\"请输入您要修改的进程名(注:第1个进程号为0,依次类推)\"<>a; cin>>YesOrNo2;

if(YesOrNo2=='y'||YesOrNo2=='Y'||YesOrNo2=='n'||YesOrNo2=='N') {

if(YesOrNo2=='y'||YesOrNo2=='Y') {

for(i=0;icout<<\" 您选择直接删除还是修改数据 Y========删除 N=======修改\"<Allocation[a][i]=0; Need[a][i]=0;

}

showdata();

cout<<\"为了不影响进程的美观 删除的进程我们暂时全部设为 “0” cout<<\"给您带来不便敬请谅解\"<cout<<\"请输入进成<\"<《操作系统原理》实验报告 - 12 -

{ cin>>Max[a][i]; if (Max[a][i]<0)

{ cout<<\"您输入的数据出现错误请查证后再输入 谢谢\"<}

}

cout<<\"Allocation\"<<\"以分配的各资源数目\"<>Allocation[a][i]; if (Allocation[a][i]<0) {

cout<<\"您输入的数据出现错误请查证后再输入\"<break;

}

}

for(i=0;ishowdata();

}

}

else { cout<<\"按要求输入!\"<}

}

void main() //银行家算法 {

int i,j,choice,choice2; int choice3;

谢谢

《操作系统原理》实验报告 - 13 -

char YorN,YesOrNo1;

cout<<\" 银行家算法 \"<cout<<\"请选择:\"; cin>>choice3; if (choice3==0) { cout<<\"谢 谢 使 用\"<} else {

system(\"cls\");

cout<<\" cout<<\" \"<>m;

cout<<\" \"<>n;

cout<<\" \"<cin>>name[i]; }

cout<<\" 1 已知 Max 和 Allocation \"<银行家算法 \"<cin>>choice; switch(choice) {

case 1:InputFor1();

break;

break; break;

case 2:InputFor2(); case 3:InputFor3();

default: cout<<\"请正确选择功能号(1--3)!\"<break; }

cout<<\"您要输入资源总数量还是现有数量(Y===总数量,N======现有数量\"<> YorN;

if( YorN=='y'|| YorN=='Y') { } else {

cout<<\"输入各资源现有数量:\"<cin>>Available[i];

cout<<\"输入各资源总数量\"<{ }

cin>>temp[i];

for (i=0;isum[i]=0; for(j=0;jsum[i]+=Allocation[j][i]; Available[i] =temp[i]-sum[i];

}

《操作系统原理》实验报告 - 15 -

}

} IsSafe(); showdata(); Requst();

cout<<\"**************银行家算法演示***************\"<>choice2; switch(choice2) {

case 1: ChResource(); }

break;

IsSafe(); case 2: ChProcess();

cout<<\"你还想再次请求分配吗?是请按y/Y,否按n/N,再确定\"<>YesOrNo1;

if(YesOrNo1=='y'||YesOrNo1=='Y'||YesOrNo1=='n'||YesOrNo1=='N') {

if(YesOrNo1=='y'||YesOrNo1=='Y')

Requst(); else {

cout<<\"谢 谢 使 用 祝 您 愉 快\"<system(\"cls\");

IsSafe();

} else {

cout<<\"请按要求输入!\"<《操作系统原理》实验报告 - 16 -

cout<<\"你还想再次请求分配吗?是请按y/Y,否按n/N,再确定\"<>YesOrNo1; { if(YesOrNo1=='y'||YesOrNo1=='Y') if(YesOrNo1=='y'||YesOrNo1=='Y'||YesOrNo1=='n'||YesOrNo1=='N')

Requst(); else {

cout<<\"谢 谢 使 用 祝

}

} else {

cout<<\"请按要求输入!\"<} break; case 0: choice=0;

break; default: cout<<\"选择功能号(0-5)!\"<break;

}

} }

您 愉 快\"<

因篇幅问题不能全部显示,请点此查看更多更全内容