您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页银行家算法实验报告 (1)

银行家算法实验报告 (1)

来源:意榕旅游网


银行家算法实验报告

学 院 计算机与电子信息学院

专 业 计算机科学与技术 班 级 学 号 姓 名 指导老师

实验名称

银行家算法

实验目的

编程来实现银行家算法,进一步理解银行家算法的概念及含义,提高对银行家算法的认识,同时提高自己的动手实践能力。各种死锁防止方法能够阻止发生死锁,但必然会降低系统的并发性并导致低效的资源利用率。死锁避免却与此相反,通过合适的资源分配算法确保不会出现进程循环等待链,从而避免死锁。本实验旨在了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生。

操作系统是计算机系统的核心系统软件,它负责控制和管理整个系统的资源 并组织用户协调使用这些资源,使计算机高效的工作。本课程实验的目的是综合应用学生所学知识,通过实验环节,加深学生对操作系统基本原理和工作过程的理解,提高学生独立分析问题、解诀问题的能力,增强学生的动手能力。

实验内容

编写程序实现银行家算法

实验要求

1.选择使用c、c++、java任意高级语言完成银行家算法的设计 2.设计有n个进程共享m个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。

3.并且具有良好的交互界面

实验原理 实验环境

Window10系统 Devc++编译器

实验设计

数据结构 算法设计 功能模块设计

实验心得

附录:源代码(部分)

#include \"string.h\" #include \"iostream\" using namespace std;

#define FALSE 0 #define TRUE 1 #define W 5 #define R 4

int M=5; //总进程数 int N=3; //资源种类

int AllResource[3]= {10,5,7}; //各种资源的数目总和

int Max[5][3]= {{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; //M个进程对N类资源最大资源需求量

int Available[R]; //系统可用资源数

int Allocation[5][3]= {{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; //M个进程已经得到N类资源的资源量

int Need[W][R]; //M个进程还需要N类资源的资源量 int Request[R]; //请求资源个数 //菜单界面 void Menu() {

cout << \" --------------------银行家算法测试----------------------\" << endl;

cout << \" | 1.输入总进程数M、总资源数N |\" << endl; cout << \" | 2.输入最大需求矩阵Max、分配矩阵Allocation |\" << endl;

cout << \" | 3.种资源的数目总和 |\" << endl;

cout << \" | 4.退出程序 |\" << endl; cout << \" |______________________________________________________|\" << endl; }

//键盘输入 void Input1() {

cout<<\" 输入总进程数M:\"; cin>>M; cout<cout<<\" 输入总资源数N:\"; cin>>N; cout<void Input2() {

printf(\" 输入最大需求矩阵Max[%d][%d]:\\n\ for(int i=0; i>Max[i][j];

printf(\" 输入分配矩阵Allocation[%d][%d]:\\n\ for(int i=0; i>Allocation[i][j]; }

void Input3() {

printf(\" 输入种资源的数目总和AllResource[%d]:\\n\ for(int j=0; j>AllResource[j]; }

void PrintData() { //函数showdata,输出资源分配情况 int i,j;

printf(\" 各种资源的总数量(AllResource):\"); printf(\" [\");

for (j=0; jprintf(\" %d\ printf(\" ]\"); printf(\"\\n\\n\");

printf(\" 最大需求矩阵(Max) \\n\\n\"); printf(\" 资源类型\"); for(int i=0; iprintf(\"\\n\"); printf(\"\\n\");

for (i=0; iprintf(\" 进程;p%d\

for (j=0; jprintf(\" %d\ printf(\"\\n\"); }

printf(\"\\n\");

printf(\" 分配矩阵(Allocation) \\n\\n\"); printf(\" 资源类型\"); for(int i=0; iprintf(\"\\n\"); printf(\"\\n\");

for (i=0; iprintf(\" 进程;p%d\

for (j=0; jprintf(\" %d\ printf(\"\\n\"); }

printf(\"\\n\");

printf(\" 需求矩阵(Need) \\n\\n\"); printf(\" 资源类型\"); for(int i=0; iprintf(\"\\n\"); printf(\"\\n\");

for (i=0; iprintf(\" 进程;p%d\

for (j=0; jprintf(\" %d\ printf(\"\\n\"); }

printf(\"\\n\");

printf(\" 系统目前可利用资源向量(Available):\"); printf(\" [\");

for (j=0; jprintf(\" %d\ printf(\" ]\"); printf(\"\\n\\n\"); }

//为第K个进程分配资源 void Distribution(int k) { int j;

for (j=0; jAvailable[j]=Available[j]-Request[j];

Allocation[k][j]=Allocation[k][j]+Request[j]; Need[k][j]=Need[k][j]-Request[j]; } }

//恢复第K个进程已分配的资源 void Restore(int k) {

int j;

for (j=0; jAvailable[j]=Available[j]+Request[j];

Allocation[k][j]=Allocation[k][j]-Request[j]; Need[k][j]=Need[k][j]+Request[j]; } }

//安全性算法 //M进程数 //N资源数

int Safety(int s) { //函数chkerr,检查是否安全 int WORK[W],Finish[W]; int i,j,k=0;

for(i=0; iWORK[j]=Available[j];

i=s;//将第s个进程的标号赋值给i do {

if(Finish[i]==FALSE&&Need[i][j]<=WORK[j]) { WORK[j]=WORK[j]+Allocation[i][j]; Finish[i]=TRUE; i=0;//跳到第二步 } else { i++; }

} while(iif(Finish[i]==FALSE) {

printf(\"\\n =======================\\n\"); printf(\" =======系统不安全========\\n\"); printf(\" =======================\\n\\n\"); return 1; } else {

printf(\"\\n =======================\\n\"); printf(\" =======系统安全========\\n\"); printf(\" =======================\\n\\n\"); return 0; } } }

void Bank() { //银行家算法主体 int i=0,j=0; char flag='Y';

while(flag=='Y'||flag=='y') { i=-1;

while(i<0||i>=M) {

printf(\" 请输入需申请资源的进程号(从P0到开始到P%d)>>P\

//printf(\"P\"); cin>>i; cout<=M)

printf(\" 输入的进程号不存在,重新输入!\\n\"); }

printf(\" 请输入进程P%d申请的资源数:\\n\ for (j=0; j>Request[j];

if(Request[j]>Need[i][j]) { //若请求的资源数大于进程还需要i类资源的资源量j

printf(\"进程P%d申请的资源数大于进程P%d还需要%d类资源的资源量!\\n\

printf(\"申请不合理,出错Request[%d]>NEED[%d][%d]!请重新选择!\\n\\n\

flag='N'; break;

} else if(Request[j]>Available[j]) { //若请求的资源数大于可用资源数

printf(\"进程P%d申请的资源数大于系统可用%d类资源的资源量!\\n\

printf(\"申请不合理,出错Request[j]>AVAILABLE[j]!请等待\\n\\n\");

flag='N'; break;

} }

if(flag=='Y'||flag=='y') { Distribution(i); //调用changdata(i)函数,对进程i改变资源数 if(Safety(i)==0) { //调用安全性算法进行检测,若对于进程i系统安全

PrintData(); //输出资源分配情况

} else if(Safety(i)==1) { //若系统不安全

Restore(i);//调用rstordata(i)函数,恢复资源数 PrintData(); //输出资源分配情况 } }

printf(\"\\n\");

printf(\"是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: \\n\");

//scanf(\"%d\ } }

//主函数 int main() { while(1){ Menu(); char c;

printf(\" 输入你的选择:\"); cin>>c; switch(c) { case'1':

Input1();continue; case'2':

Input2();continue; case'3':

Input3();continue; case'4': exit(0);

default:system(\"cls\");break; } }

//Input();//输入矩阵 int i=0,j=0,p; //初始化资源数量

for (j=0; jp=p-Allocation[i][j];//减去已经被占据的资源 Available[j]=p; if(Available[j]<0) Available[j]=0; }

}

}

for (i=0; iNeed[i][j]=Max[i][j]-Allocation[i][j]; PrintData(); Bank();

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

Copyright © 2019- yrrf.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务