昆明理工大学信息工程与自动化学院学生实验报告(2010 —2011 学年第二学期)课程名称:操作系统开课实验室:计算中心444 2011 年 4 月28 日一、实验目的通过编写银行家算法,要求学生进一步掌握如何实现死锁的避免,进一步熟练使用数组进行程序的设计及实现。
二、实验原理及基本技术路线图(方框原理图)用C语言或C++语言开发。
实现银行家算法、安全性检测算法。
银行家算法就是对每一个请求进行检查,检查如果满足它是否会导致不安全状态。
若是,则不满足该请求;否则便满足。
利用银行家算法,我们可以来检测CPU为进程分配资源的情况,决定CPU是否响应某进程的的请求并为其分配资源,从而很好避免了死锁的产生。
算法的思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。
若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。
若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。
银行家算法的步骤:(1)如果Request<or =Need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。
(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:Available=Available-Request[i];Allocation=Allocation+Request;Need=Need-Request;(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
安全性检测算法:(1)设置两个向量①工作向量Work。
它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;②标志向量Finish。
它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=0,当有足够资源分配给进程时,令Finish[i]=1。
(2)从进程集合中找到一个能满足下述条件的进程:①Finish[i]=0②Need<or=Work如找到,执行步骤(3);否则,执行步骤(4)。
(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work=Work+Allocation;Finish[i]=1;转向步骤(2)。
(4)如果所有进程的Finish[i]=1,则表示系统处于安全状态;否则,系统处于不安全状态。
主要的数据结构:(1)最大需求矩阵Max[ ][ ];(2)系统已分配资源Allocation[ ][ ] (3)资源的名称name[ ] (4)还需要资源Need[ ][ ] (5)请求资源向量Request[ ] (6)存放安全序列temp[ ] (7)存放系统可提供资源Work[ ] (8)Flag 标志程序模块:main( )//系统的主函数display()// 显示资源矩阵int safe()//安全性算法safe();//用银行家算法判定系统是否安系统结构图:程序流程图:银行家算法流程图安全性算法流程图-6-三、所用仪器、材料(设备名称、型号、规格等)。
计算机一台四、实验方法、步骤#include<stdio.h>#define False 0#define True 1int 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 M=100;//作业的最大数为100int N=100;//资源的最大数为100void display()//******************显示资源矩阵******************************************{int i,j;printf("系统目前可用的资源[Avaliable]:\n");printf("资源名称: ");for(i=0;i<N;i++)printf("%d ",name[i]);printf("\n");printf("可用资源数量: ");for (j=0;j<N;j++)printf("%d ",Avaliable[j]);-7-printf(" \n Max Allocation Need Avaliable\n");printf("进程名 ");for(j=0;j<4;j++){for(i=0;i<N;i++)printf("%d ",name[i]);printf(" ");}printf("\n");for(i=0;i<M;i++){printf("%d",i);printf(" ");for(j=0;j<N;j++)printf("%d ",Max[i][j]);printf(" ");for(j=0;j<N;j++)printf("%d ",Allocation[i][j]);printf(" ");for(j=0;j<N;j++)printf("%d ",Need[i][j]);printf(" ");if(i==0)for (j=0;j<N;j++)printf(" %d",Avaliable[j]);printf("\n ");}}int safe()//*************************安全性算法-8-************************************************** {int i,k=0,m,apply,Finish[100]={0};int j;int flag=0;Work[0]=Avaliable[0];Work[1]=Avaliable[1];Work[2]=Avaliable[2];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){for(m=0;m<N;m++)Work[m]=Work[m]+Allocation[i][m];//变分配数 Finish[i]=True;temp[k]=i;i=-1;k++;flag++;}}}}for(i=0;i<M;i++){if(Finish[i]==False){-9-printf("\n系统不安全"); //不成功系统不安全return -1;}}printf("\n系统是安全"); //如果安全,输出成功printf("\n分配的序列:");for(i=0;i<M;i++){//输出运行进程数组printf("%d",temp[i]);if(i<M-1) printf("->");}return 0;}int main()//******************************************主函数*****************************************{int i,j,number,m,n,flag;char ming;printf("\n\t\t*****************BANK 银行家算法设计与实现*****************\n");printf("\t\t\t 请首先输入系统可供资源种类的数量:");scanf("%d",&n);N=n;for(i=0;i<n;i++){printf("\t\t资源%d的名称:",i+1);scanf("%d",&ming);name[i]=ming;printf("\t\t资源的数量:");scanf("%d",&number);Avaliable[i]=number;}printf("\t\t请输入作业的数量:");scanf("%d",&m);M=m;printf("\t\t请输入各进程的最大需求量%d*%d矩阵[Max]:\n",m,n);for(i=0;i<m;i++)for(j=0;j<n;j++){printf("\t\t");scanf("%d",&Max[i][j]);}do{flag=0;printf("\t\t请输入各进程已经申请的资源量%d*%d矩阵[Allocation]:\n",m,n); for(i=0;i<m;i++)for(j=0;j<n;j++){printf("\t\t");scanf("%d",&Allocation[i][j]);if(Allocation[i][j]>Max[i][j])flag=1;Need[i][j]=Max[i][j]-Allocation[i][j];}if(flag)printf("\t\t申请的资源大于最大需求量,请重新输入!\n",m,n);}while(flag);int a;display();//显示各种资源safe();//用银行家算法判定系统是否安printf("按0继续,1结束进程\n");scanf("%d",&a);if(0) return 0;main();}五、实验过程原始记录(数据、图表、计算等)六、实验结果、分析和结论(误差分析与数据处理、成果总结等。