银行家算法实验报告

更新时间:2023-07-21 09:15:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课程设计(大作业)报告

课程名称: 操 作 系 统 设计题目: 银行家算法实现 院 系: 信 息 技 术 学 院 班 级:

姓 名: 学 号: 指导教师:

设计时间:2013年12月30日至1月3日

昆明学院

昆明学院课程设计(大作业)任务书

课程设计(大作业)成绩学号:201111010309 课程设计题目:银行家算法的实现 总结: 不知不觉又过了一个星期了,这次实训,总的下来,感觉不易。 为准确理解,应该以手动模式下运行为准,这样的交互性较好!而自动实现下,更接近 于机器的工作方式。程序在设计初,只是用了手动这一模式,后来听取同学的意见以随机 数实现自动模式,在设计时出了好些问题,但想多了问题也就通了,而新的问题又出现, 却总能解决。在这种模式下能更彻底理解银行家算法中的资源分配策略。 姓名:蒋兴发 指导教师:张德海

指导教师评语:

成绩:

填表时间:2013 年 12 月 27 日

指导教师签名:

目录

课程设计(大作业)报告 ................................................................................... 1

昆明学院课程设计(大作业)任务书 ............................................................ 2

一、题目分析 .......................................................................................................... 5

1.1实验名称:.................................................................................................. 5 1.2实验目的 ..................................................................................................... 5 1.3问题分析与设计 ........................................................................................... 5

1.3.1算法思路 .......................................................................................... 5 1.3.2银行家算法步骤 ................................................................................. 5 1.3.3安全性算法步骤 ................................................................................. 6 1.3.4、流程图 ........................................................................................... 7

二、程序设计 ........................................................................................................ 10 三、结果分析 ........................................................................................................ 20 四、心得体会 ........................................................................................................ 22

计算机操作系统实验报告

一、题目分析

1.1实验名称:

银行家算法 1.2实验目的

银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

1.3问题分析与设计

1.3.1算法思路

先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。 1.3.2银行家算法步骤

(1)如果Requesti<or =Need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。

(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。

(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:

Available=Available-Request[i]; Allocation=Allocation+Request; Need=Need-Request;

(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。

1.3.3安全性算法步骤

(1)设置两个向量

①工作向量Work。它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;

②布尔向量Finish。它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时,令Finish[i]=true。

(2)从进程集合中找到一个能满足下述条件的进程:

①Finish[i]=false ②Need<or=Work

如找到,执行步骤(3);否则,执行步骤(4)。

(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:

Work=Work+Allocation; Finish[i]=true; 转向步骤(2)。

(4)如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态。

1.3.4、流程图

系统主要过程流程图

银行家算法流程图

安全性算法流程图

二、程序设计

#include<iostream.h> #include<string.h> #include<stdio.h> #define False 0

#define True 1

int Max[100][100]={0};//各进程所需各类资源的最大需求

int Avaliable[100]={0};//系统可用资源 char name[100]={0};//资源的名称

int Allocation[100][100]={0};//系统已分配资源 int Need[100][100]={0};//还需要资源 int Request[100]={0};//请求资源向量 int temp[100]={0};//存放安全序列 int Work[100]={0};//存放系统可提供资源 int p[100]={0}; int q[100][100]={0}; int z[100][100]={0};

int M=100;//作业的最大数为100 int N=100;//资源的最大数为100 int gg=1;

void showdata()//显示资源矩阵 { int i,j;

cout<<endl<<"此时刻的资源分配情况为:"<<endl; cout<<" Max Allocation Need Avaliable"<<endl;

cout<<"进程名 "; for(j=0;j<4;j++){ for(i=0;i<N;i++) cout<<name[i]<<" ";

cout<<" "; }

cout<<endl; for(i=0;i<M;i++){ cout<<" "<<i<<" "; for(j=0;j<N;j++) cout<<Max[i][j]<<" "; cout<<" "; for(j=0;j<N;j++)

cout<<Allocation[i][j]<<" "; cout<<" "; for(j=0;j<N;j++) cout<<Need[i][j]<<" "; if(i==0){ cout<<" "; for (j=0;j<N;j++)

cout<<Avaliable[j]<<" ";//输出分配资源 }

cout<<endl; } }

int changdata(int i)//进行资源分配 { int j;

for (j=0;j<M;j++) {//p[j]=Avaliable[j];

Avaliable[j]=Avaliable[j]-Request[j]; //q[i][j]=Allocation[i][j];

Allocation[i][j]=Allocation[i][j]+Request[j]; //z[i][j]=Need[i][j];

Need[i][j]=Need[i][j]-Request[j]; } return 1; }

int safe()//安全性算法 {

int i,d,k=0,m,h,s,apply,Finish[100]={0}; int j; int flag=0; for(i=0;i<N;i++) Work[i]=Avaliable[i];

cout<<endl<<" 安全性检查 "<<endl; cout<<" Work Need Allocation Work+Allocation Finish"<<endl;

cout<<"进程名 "; for(h=0;h<4;h++){ for(s=0;s<N;s++) cout<<name[s]<<" "; cout<<" "; }

cout<<endl;

for(i=0;i<M;i++){ apply=0;

for(j=0;j<N;j++){

if (Finish[i]==False&&Need[i][j]<=Work[j]) {

apply++; if(apply==N)

{ cout<<" "<<i<<" "; for(d=0;d<N;d++)

cout<<Work[d]<<" "; cout<<" ";

for(d=0;d<N;d++) cout<<Need[i][d]<<" "; cout<<" "; for(d=0;d<N;d++) cout<<Allocation[i][d]<<" "; cout<<" "; for(m=0;m<N;m++) {

Work[m]=Work[m]+Allocation[i][m]; cout<<Work[m]<<" ";

}//变分配数 Finish[i]=True; temp[k]=i; cout<<" ";

cout<<"true"<<" "; cout<<endl; i=-1; k++; flag++; } } } }

for(i=0;i<M;i++){ if(Finish[i]==False){ for(j=0;j<N;j++){

Avaliable[j]=Avaliable[j]+Request[j];;

Allocation[i][j]=Allocation[i][j]-Request[j];;

Need[i][j]=Need[i][j]+Request[j]; }

cout<<endl<<"系统进入不安全状态!此时系统不分配资源!"<<endl;//不成功系统不安全

return 0;

} }

cout<<endl<<"此时系统是安全的!"<<endl;//如果安全,输出成功

cout<<"安全序列为:";

for(i=0;i<M;i++){//输出运行进程数组 cout<<temp[i]; if(i<M-1) cout<<"->"; }

cout<<endl; return 0; }

void share()//利用银行家算法对申请资源对进行判定 { char ch; int i=0,j=0; ch='y';

cout<<endl<<"请输入要求分配的资源进程号(0-"<<M-1<<"):";

cin>>i;//输入须申请的资源号

cout<<endl<<"请输入进程 "<<i<<" 申请的资源:"<<endl;

for(j=0;j<N;j++) {

cout<<name[j]<<":";

cin>>Request[j];//输入需要申请的资源 }

for (j=0;j<N;j++){

if(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错

{

cout<<endl<<"进程 "<<i<<"申请的资源大于它需要的资源";

cout<<" 分配不合理,不予分配!"<<endl; ch='n'; break; }

else {

if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则

{ //出错

cout<<endl<<"进程"<<i<<"申请的资源大于系统现在可利用的资源";

cout<<" 分配出错,不予分配!"<<endl; ch='n'; break; } } }

if(ch=='y') {

changdata(i);//根据进程需求量变换资源 showdata();//根据进程需求量显示变换后的资源

safe();//根据进程需求量进行银行家算法判断 } }

int main()//主函数 {

int t=1,i,j,number,choice,m,n,flag; char ming;

cout<<"*****************银行家算法的设计与实现*****************"<<endl;

cout<<endl<<"请首先输入系统可供资源种类的数量:"; cin>>n; N=n;

for(i=0;i<n;i++) {

cout<<"资源"<<i+1<<"的名称:"; cin>>ming; name[i]=ming; cout<<"资源的数量:"; cin>>number; Avaliable[i]=number; }

cout<<endl;

cout<<"请输入作业的数量:"; cin>>m;

M=m;

cout<<endl<<"请输入各进程的最大需求量("<<m<<"*"<<n<<"矩阵)[Max]:"<<endl;

for(i=0;i<m;i++) for(j=0;j<n;j++) cin>>Max[i][j]; do{ flag=0;

cout<<endl<<"请输入各进程已经申请的资源量("<<m<<"*"<<n<<"矩阵)[Allocation]:"<<endl;

for(i=0;i<m;i++) for(j=0;j<n;j++){ cin>>Allocation[i][j]; if(Allocation[i][j]>Max[i][j]) flag=1;

Need[i][j]=Max[i][j]-Allocation[i][j]; } if(flag)

cout<<endl<<"申请的资源大于最大需求量,请重新输入!\n"<<endl;

}

while(flag);

showdata();//显示各种资源

safe();//用银行家算法判定系统是否安全 while(1){

if(t==1){

cout<<endl<<" 利用银行家算法预分配资源 "<<endl; share();

t=0;} else break;

cout<<endl<<" 是否继续银行家算法?(按 1 键继续,按其它任意键退出):";

}

return 1; }

三、 结果分析

cin>>t; cout<<endl;

本文来源:https://www.bwwdw.com/article/cqym.html

Top