操作系统银行家算法c语言版适合广大在校生作实验报告

源代码在线查看: 汤子瀛银行家算法.txt

软件大小: 3 K
上传用户: xuhuizi
关键词: 操作系统 c语言 实验报告
下载地址: 免注册下载 普通下载 VIP

相关代码

				本程序模拟的是《计算机操作系统》(汤子赢等)课本P97"银行家算法之例"编写的
				
				
				第一部分:银行家算法(扫描)
				1.如果Request				2.如果Request				3.系统试探分配请求的资源给进程
				4.系统执行安全性算法
				第二部分:安全性算法
				1.设置两个向量
				(1).工作向量:Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)
				(2).Finish:表示系统是否有足够资源分配给进程(True:有;False:没有).初始化为False
				2.若Finish[i]=False&&Need				3.进程P获得第i类资源,则顺利执行直至完成!并释放资源:
				Work=Work+Allocation;
				Finish[i]=true;
				转2
				4.  若所有进程的Finish[i]=true,则表示系统安全;否则,不安全!
				
				程序说明:
				
				一、开发语言:C语言
				二、本程序模拟的是课本P97"银行家算法之例"编写的。
				    即系统中有五个进程{0,1,2,3,4}和三类资源{A,B,C},各进程的初始资源分配情况及各资源的总数量均     参照该例子。
				三、本程序中共四个函数分别为:zhibiao(),apply(),test(),及主函数main()
				    其中:
				    1、zhibiao()的功能为:直观的列出系统某时刻的资源分配情况。
				    2、apply()的功能为:进程发出资源请求后,系统试探着把资源分配给该进程并修改数据结构中的数值。
				    3、test()的功能为:系统的安全性检测。
				四、需要注意的问题:
				    1、本程序的前提是假设当前只有一个进程请求资源。
				    2、一旦操作不符合要求会得到意想不到的结果!再按任意键可能该程序也不能正常运行,则就关闭该程序,       然后再打开重新运行便可.
				五、课本上的例子在这个程序中运行后成功。
				    例如:P1:Request1(1,0,2)
				          p4: Request4(3,3,0)
				          P0:Request0(0,2,0)
				    再测试P0:Request0(0,1,0) 同课本上的结果相同。
				本程序还有很多不足,功能不很完善,只是适合于当前只有一个进程请求资源,且进程和资源都是事先固定好的.
				
				源代码:
				#include "dos.h"
				#include "conio.h"
				#include "alloc.h"
				
				int available[3]={3,3,2};
				int max[6][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
				int allocation[6][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
				int need[6][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
				int live[5]={1,1,1,1,1};
				int stay[3][3];
				int request[3],process[5];
				int i,j,p=5,pro,x,k1;
				void zhibiao()
				{ x=1;
				  printf("      Max         All         Nee         Ava\n");
				  printf("PRO   A  B  C     A  B  C     A  B  C     A  B  C\n");
				  for(i=0;i				  {  if(live[i]==1)
				   { printf("P%d    ",i);
				     for(j=0;j				     {printf("%-3d",max[i][j]);}printf("   ");
				     for(j=0;j				     {printf("%-3d",allocation[i][j]);}printf("   ");
				     for(j=0;j				     {printf("%-3d",need[i][j]);}printf("   ");
				    }
				     if(x==1&&live[i]==1) {printf("%-3d%-3d%-3d",available[0],available[1],available[2]);x=0;}
				     if(live[i]==1) printf("\n"); 
				  }
				}
				int apply()
				{ int v=1;
				  for(i=0;i				  {if(need[pro][i]				   if(available[i]				  if(v==1){for(i=0;i				           {stay[0][i]=allocation[pro][i];allocation[pro][i]+=request[i];
				            stay[1][i]=need[pro][i];need[pro][i]-=request[i];
				            stay[2][i]=available[i];available[i]-=request[i];}
				           }
				  return(v);
				}
				int test()
				{ int work[3],finish[5]={0,0,0,0,0},v,k=0,t=0;
				  for(i=0;i				  if(live[i]==0) {finish[i]=1;k1--;}
				  for(i=0;i				 while(1)
				 { for(i=0;i				   { if(finish[i]==0) { v=1;
				                        for(j=0;j				                         if(need[i][j]>work[j])  {v=0;break;}
				                        if(v==1) { finish[i]=1;
				                                   for(j=0;j				                                   process[k]=i;k++;
				                                  }
				                       }
				}
				    if(t==k)  break;
				       else   t=k;
				    if(k==k1)  break;
				  }
				if(k==k1)  return(1);
				else      return(0);
				
				}
				main()
				{
				 while(1)
				{zhibiao();
				 k1=5;
				 printf("该系统中共五个进程{0,1,2,3,4},请输入其中一个进程:P");
				 scanf("%d",&pro);
				 if(pro4)  break;
				 printf("P%d请求的三类资源数(资源数用逗号隔开)分别是:",pro);
				 scanf("%d,%d,%d",&request[0],&request[1],&request[2]);
				 if(apply()==0)  {printf("出错或尚无足够资源,P%d必须等待!\n",pro);
				                  printf("请按任意键继续。");}
				 else   if(test()==0) {printf("系统处于不安全状态,P%d必须等待!\n",pro);
				                       for(i=0;i				                       { allocation[pro][i]=stay[0][i];
				                         need[pro][i]=stay[1][i];
				                         available[i]=stay[2][i];}
				        printf("请按任意键继续。");} 
				 else   {zhibiao();printf("系统处于安全状态!\n");
				         printf("存在一安全序列为:");
				         for(i=0;i				         printf("P%d>",process[i]);
				         printf("P%d",process[k1-1]);
				         printf("\n请按任意键继续。");}
				 if(need[pro][0]==0&&need[pro][1]==0&&need[pro][2]==0)
				    for(i=0;i				 {available[i]+=max[pro][i];
				     live[pro]=0;}
				 getch();
				 clrscr();
				 delay(5000);
				}
				}
				
							

相关资源