计算机操作系统实验报告
一、 实验名称:银行家算法
二、 实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简
单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 三、 问题分析与设计:
1、算法思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。
2、银行家算法步骤:(1)如果Requesti<or =Need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。 (2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。
(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:
Available=Available-Request[i]; Allocation=Allocation+Request; Need=Need-Request;
(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
3、安全性算法步骤:
(1)设置两个向量
①工作向量Work。它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;
②布尔向量Finish。它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时,令Finish[i]=true。
(2)从进程集合中找到一个能满足下述条件的进程:
①Finish[i]=false ②Need如找到,执行步骤(3);否则,执行步骤(4)。(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work=Work+Allocation; Finish[i]=true; 转向步骤(2)。
(4)如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态。 4、流程图: 系统主要过程流程图 银行家算法流程图 安全性算法流程图 四、 实验代码:
#include<> #include<> #include<> #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<cout<<\"进程名 \"; for(j=0;j<4;j++){ for(i=0;icout<cout<cout<cout<cout<int changdata(int i)//进行资源分配 { int j;for (j=0;jAllocation[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;icout<cout<<\"进程名 \"; for(h=0;h<4;h++){ for(s=0;scout<for(j=0;jif (Finish[i]==False&&Need[i][j]<=Work[j]) {apply++; if(apply==N)
{ cout<<\" \"<cout<for(d=0;dcout<<\" \"; for(d=0;dcout<for(m=0;mWork[m]=Work[m]+Allocation[i][m]; cout<for(i=0;iAvaliable[j]=Avaliable[j]+Request[j];; Allocation[i][j]=Allocation[i][j]-Request[j];;Need[i][j]=Need[i][j]+Request[j]; }
cout<return 0; } }cout<cout<<\"安全序列为:\";for(i=0;i\"; }cout<void share()//利用银行家算法对申请资源对进行判定 { char ch; int i=0,j=0; ch='y';cout<cin>>i;//输入须申请的资源号cout<cout<cin>>Request[j];//输入需要申请的资源 }for (j=0;jif(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错{
cout<cout<<\" 分配不合理,不予分配!\"<else {if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则
{ //出错
cout<cout<<\" 分配出错,不予分配!\"<break; } } }if(ch=='y') {
changdata(i);//根据进程需求量变换资源 showdata();//根据进程需求量显示变换后的资源 safe();//根据进程需求量进行银行家算法判断 } }
int main()//主函数 {
int t=1,i,j,number,choice,m,n,flag; char ming;
cout<<\"*****************银行家算法的设计与实现*****************\"<cout<>n; N=n;for(i=0;icout<<\"资源\"<>ming; name[i]=ming;cout<<\"资源的数量:\"; cin>>number; Avaliable[i]=number; }
cout<cout<<\"请输入作业的数量:\"; cin>>m; M=m;cout<for(i=0;i>Max[i][j]; do{ flag=0;cout<for(i=0;i>Allocation[i][j]; if(Allocation[i][j]>Max[i][j]) flag=1;Need[i][j]=Max[i][j]-Allocation[i][j]; } if(flag)
cout<}while(flag);
showdata();//显示各种资源
safe();//用银行家算法判定系统是否安全 while(1){
if(t==1){
cout<t=0;} else break;cout<}return 1; }
五、 程序执行结果: 六、实验总结
多个进程同时运行时,系统根据各类系统资源的最大需求和各类系统的剩余资源为进程安排安全序列,使得系统能快速且安全地运行进程,不至发生死锁。银行家算法是避免死锁的主要方法,其思路在很多方面都非常值得我们来学习借鉴。
cin>>t; cout< 09信管(2)班