您好,欢迎访问三七文档
当前位置:首页 > 金融/证券 > 金融资料 > OS银行家算法实验报告
《操作系统原理》实验报告银行家算法实验专业:计算机科学与技术学号:200902014012姓名:杨瑜实验日期:2012-5-9一、实验目的通过实验用编程语言模拟银行家诉法来加强对银行家安全算法的理解和掌握。二、实验内容熟悉避免死锁发生的方法,死锁与安全序列的关系,编程实现银行家算法,要求输出进程的安全序列。三、算法中用到的数据结构1.可利用资源向量Available2.最大需求矩阵Max3.分配矩阵Allocation4.需求矩阵Need模拟实现银行家算法以避免死锁的出现.分两部分组成:第一部分:银行家算法(扫描)1.如果Request=Need,则转向2;否则,出错2.如果Request=Available,则转向3,否则等待3.系统试探分配请求的资源给进程4.系统执行安全性算法第二部分:安全性算法1.设置两个向量(1).工作向量:Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)(2).Finish:表示系统是否有足够资源分配给进程(True:有;False:没有).初始化为False2.若Finish[i]=False&&Need=Work,则执行3;否则执行4(I为资源类别)3.进程P获得第i类资源,则顺利执行直至完成!并释放资源:Work=Work+Allocation;Finish[i]=true;转24.若所有进程的Finish[i]=true,则表示系统安全;否则,不安全!四、算法流程图五、实现代码#includestdio.h#defineP_NUM5#defineS_NUM3intMax[P_NUM][S_NUM],Allocation[P_NUM][S_NUM],Need[P_NUM][S_NUM];intAvailable[S_NUM],Request[S_NUM];intWork[S_NUM],Finish[P_NUM],CurrentProcessId=-1,Arrange[P_NUM],CurrentId=0;FILE*fpr,*fpw;inttimes=0;voidinit(){inti=0,j=0;for(i=0;iP_NUM;i++){for(j=0;jS_NUM;j++){scanf(%d,&Max[i][j]);}for(j=0;jS_NUM;j++){scanf(%d,&Allocation[i][j]);Need[i][j]=Max[i][j]-Allocation[i][j];}Finish[i]=0;}for(j=0;jS_NUM;j++){scanf(%d,&Available[j]);}}voidallocation(){intj=0,reasonable=1;if(CurrentProcessId-1&&CurrentProcessIdP_NUM){printf(P%dRequests:(,CurrentProcessId);for(j=0;jS_NUM;j++){Need[CurrentProcessId][j]=Need[CurrentProcessId][j]-Request[j];Allocation[CurrentProcessId][j]=Allocation[CurrentProcessId][j]+Request[j];Available[j]=Available[j]-Request[j];printf(%d,Request[j]);if(Need[CurrentProcessId][j]0||Available[j]0)reasonable=0;}printf()\n);if(reasonable==0){UnAllocation();printf(TheRequestisnotreasonable!Thebelowtableissamewiththetoptable!\n);}}}intUnAllocation(){intj=0;if(CurrentProcessId-1&&CurrentProcessIdP_NUM){for(j=0;jS_NUM;j++){Need[CurrentProcessId][j]=Need[CurrentProcessId][j]+Request[j];Allocation[CurrentProcessId][j]=Allocation[CurrentProcessId][j]-Request[j];Available[j]=Available[j]+Request[j];}}}voidsafeCheck(){intj=0,processNo=0,times=0;for(j=0;jS_NUM;j++){Work[j]=Available[j];}processNo=meetCommand();if(processNo0){UnAllocation();printf(thisstateisnotsafty!\n);}else{printf(Assignsourceinsequence:);for(j=0;jP_NUM;j++){printf(→P%d,Arrange[j]);}printf(\n\n\n\n\n);}CurrentProcessId=-1;for(j=0;jP_NUM;j++){Finish[j]=0;Arrange[j]=0;}}intmeetCommand(){intmeet=0,finish=1,i=0,j=0,maxUnFinish=0;for(i=0;iP_NUM;i++){if(Finish[i]==0){finish=0;maxUnFinish=i;}}if(finish==1)return0;for(i=0;iP_NUM;i++){if(Finish[i]==0){meet=0;for(j=0;jS_NUM;j++){if(Need[i][j]Work[j])meet=-1;}if(meet==0){Finish[i]=1;printCheckInfo(i);for(j=0;jS_NUM;j++){Work[j]=Work[j]+Allocation[i][j];}Arrange[CurrentId]=i;CurrentId++;meetCommand();}if(i==maxUnFinish&&meet==-1)return-1;}}return0;}voidprintInfo(){inti=0,j=0;printf(┌───────┬────────┬─────────┬─────────┬────────┐\n);printf(││Max│Allocation│Need│Available│\n);printf(│processID├────────┼─────────┼─────────┼────────┤\n);printf(││ABC│ABC│ABC│ABC│\n);printf(├───────┼────────┼─────────┼─────────┼────────┤\n);for(i=0;iP_NUM;i++){printf(│P%d│,i);for(j=0;jS_NUM;j++){printf(%d,Max[i][j]);}printf(│);for(j=0;jS_NUM;j++){printf(%d,Allocation[i][j]);}printf(│);for(j=0;jS_NUM;j++){printf(%d,Need[i][j]);}printf(│);if(i==0){for(j=0;jS_NUM;j++){printf(%d,Available[j]);}printf(│\n);}if(i0)printf(│\n);}printf(└───────┴────────┴─────────┴─────────┴────────┘\n);}intprintCheckInfo(inti){intj=0,allFinsh=1;if(times==0){printf(┌───────┬────────┬─────────┬─────────┬────────┐\n);printf(││Work│Allocation│Need││\n);printf(│processID├────────┼─────────┼─────────┤States│\n);printf(││ABC│ABC│ABC││\n);printf(├───────┼────────┼─────────┼─────────┼────────┤\n);times++;}printf(│P%d│,i);for(j=0;jS_NUM;j++){if(Work[j]9)printf(%d,Work[j]);if(Work[j]10)printf(%d,Work[j]);}printf(│);for(j=0;jS_NUM;j++){printf(%d,Allocation[i][j]);}printf(│);for(j=0;jS_NUM;j++){printf(%d,Need[i][j]);}printf(│);for(j=0;jP_NUM;j++){printf(%d,Finish[j]);allFinsh*=Finish[j];}printf(│\n);if(allFinsh==0)printf(├───────┼────────┼─────────┼─────────┼────────┤\n);if(allFinsh0)printf(└───────┴────────┴─────────┴─────────┴────────┘\n);}main(){intj=0;charcomeOn;fpr=fopen(banker.txt,r);fpw=fopen(outcoming.txt,w);printf(程序运行结果如下:\n);init();printInfo();allocation();safeCheck();scanf(\n%c,&comeOn);while(comeOn=='y'||comeOn=='Y'){printInfo();scanf(%d,&CurrentProcessId);for(j=0;jS_NUM;j++){scanf(%d,&Request[j]);}allocation();times=0;CurrentId=0;safeCheck();scanf(\n%c,&comeOn);}}六、总结通过了这次实验更透彻的理解了银行家算法如何来避免思索的产生,以及对银行家算法的具体实现步骤更加清晰的理解。七、运行结果#includestdio.h#defineP_NUM5#defineS_NUM3intMax[P_NUM][S_NUM],Allocation[P_NUM][S_NUM],Need[P_NUM][S_NUM];intAvailable[S_NUM],Request[S_NUM];intWork[S_NUM],Finish[P_NUM],CurrentProcessId=-1,Arrange[P_NUM],CurrentId=0;FILE*fpr,*fpw;inttimes=0;intprintCheckInfo(inti);intUnAllocation();voidallocation();intmeetCommand();voidsafeCheck();voidprintInfo();intprintCheckInfo(inti);voidinit(){inti=0,j=0;for(i=0;iP_NUM;i++){for(j=0;jS_NUM;j++){scanf(%d,&Max[i][j]);}for(j=0;jS_NUM;j++){scanf(%d,&Allocation[i][j]);Need[i][j]=Max[i][j]-Alloc
本文标题:OS银行家算法实验报告
链接地址:https://www.777doc.com/doc-2848191 .html