操作系统课的实验(银里手算法)#include"malloc.h" #include"stdio.h" #include"stdlib.h" #definealloclensizeof(structallocation) #definemaxlensizeof(structmax) #defineavalensizeof(structavailable) #defineneedlensizeof(structneed) #definefinilensizeof(structfinish) #definepathlensizeof(structpath) structallocation { intvalue; structallocation*next; }; structmax { intvalue; structmax*next; }; structavailable/*可用资源数*/ { intvalue; structavailable*next; }; structneed/*需求资源数*/ { intvalue; structneed*next; }; structpath { intvalue; structpath*next; }; structfinish { intstat; structfinish*next; }; intmain() { introw,colum,status=0,i,j,t,temp,processtest; structallocation*allochead,*alloc1,*alloc2,*alloctemp; structmax*maxhead,*maxium1,*maxium2,*maxtemp; structavailable*avahead,*available1,*available2,*workhead,*work1,*work2,*worktemp,*worktemp1; structneed*needhead,*need1,*need2,*needtemp; structfinish*finihead,*finish1,*finish2,*finishtemp; structpath*pathhead,*path1,*path2; printf("\n请输入系统资源的种类数:"); scanf("%d",&colum); printf("请输入现时内存中的进程数:"); scanf("%d",&row); printf("请输入已分配资源矩阵:\n"); for(i=0;inext=alloc2->next=NULL; scanf("%d",&allochead->value); status++; } else { alloc2=(structallocation*)malloc(alloclen); scanf("%d,%d",&alloc2->value); if(status==1) { allochead->next=alloc2; status++; } alloc1->next=alloc2; alloc1=alloc2; } } } alloc2->next=NULL; status=0; printf("请输入最大需求矩阵:\n"); for(i=0;inext=maxium2->next=NULL; scanf("%d",&maxium1->value); status++; } else { maxium2=(structmax*)malloc(maxlen); scanf("%d,%d",&maxium2->value); if(status==1) { maxhead->next=maxium2; status++; } maxium1->next=maxium2; maxium1=maxium2; } } } maxium2->next=NULL; status=0; printf("请输入现时系统剩余的资源矩阵:\n"); for(j=0;jnext=available2->next=NULL; work1->next=work2->next=NULL; scanf("%d",&available1->value); work1->value=available1->value; status++; } else { available2=(structavailable*)malloc(avalen); work2=(structavailable*)malloc(avalen); scanf("%d,%d",&available2->value); work2->value=available2->value; if(status==1) { avahead->next=available2; workhead->next=work2; status++; } available1->next=available2; available1=available2; work1->next=work2; work1=work2; } } available2->next=NULL; work2->next=NULL; status=0; alloctemp=allochead; maxtemp=maxhead; for(i=0;inext=need2->next=NULL; need1->value=maxtemp->value-alloctemp->value; status++; } else { need2=(structneed*)malloc(needlen); need2->value=(maxtemp->value)-(alloctemp->value); if(status==1) { needhead->next=need2; status++; } need1->next=need2; need1=need2; } maxtemp=maxtemp->next; alloctemp=alloctemp->next; } need2->next=NULL; status=0; for(i=0;inext=finish2->next=NULL; finish1->stat=0; status++; } else { finish2=(structfinish*)malloc(finilen); finish2->stat=0; if(status==1) { finihead->next=finish2; status++; } finish1->next=finish2; finish1=finish2; } } finish2->next=NULL;/*Initializationcompleated*/ status=0; processtest=0; for(temp=0;tempstat==0) { for(j=0;jnext,worktemp=worktemp->next) if(needtemp->valuevalue) processtest++; if(processtest==colum) { for(j=0;jvalue+=alloctemp->value; worktemp1=worktemp1->next; alloctemp=alloctemp->next; } if(status==0) { pathhead=path1=path2=(structpath*)malloc(pathlen); path1->next=path2->next=NULL; path1->value=i; status++; } else { path2=(structpath*)malloc(pathlen); path2->value=i; if(status==1) { pathhead->next=path2; status++; } path1->next=path2; path1=path2; } finishtemp->stat=1; } else { for(t=0;tnext; finishtemp->stat=0; } } else for(t=0;tnext; alloctemp=alloctemp->next; } processtest=0; worktemp=workhead; finishtemp=finishtemp->next; } } path2->next=NULL; finishtemp=finihead; for(temp=0;tempstat==0) { printf("\n系统处于非安全状态!\n"); exit(0); } finishtemp=finishtemp->next; } printf("\n系统处于安全状态.\n"); printf("\n安全序列为:\n"); do { printf("p%d",pathhead->value); } while(pathhead=pathhead->next); printf("\n"); return0; }#include"string.h"#include#include#defineM5#defineN3#defineFALSE0#defineTRUE1/*M个进程对N类资源最大资源需求量*/intMAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};/*系统可用资源数*/intAVAILABLE[N]={10,5,7};/*M个进程对N类资源最大资源需求量*/intALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};/*M个进程已经得到N类资源的资源量*/intNEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};/*M个进程还需要N类资源的资源量*/intRequest[N]={0,0,0};voidmain(){inti=0,j=0;charflag='Y';voidshowdata();voidchangdata(int);voidrstordata(int);intchkerr(int);showdata();while(flag=='Y'||flag=='y'){i=-1;while(i=M){printf("请输入需申请资源的进程号(从0到");printf("%d",M-1);printf(",否则重输入!):");scanf("%d",&i);if(i=M)printf("输入的进程号不存在,重新输入!\n");}printf("请输入进程");printf("%d",i);printf("申请的资源数\n");for(j=0;jNEED[i][j]){printf("进程");printf("%d",i);printf("申请的资源数大于进程");printf("%d",i);printf("还需要");printf("%d",j);printf("类资源的资源量!申请不合理,出错!请重新选择!\n");/*printf("申请不合理,出错!请重新选择!\n");*/flag='N';break;}else{if(Request[j]>AVAILABLE[j]){printf("进程");printf("%d",i);printf("申请的资源数大于系统可用");printf("%d",j);printf("类资源的资源量!申请不合理,出错!请重新选择!\n");/*printf("申请不合理,出错!请重新选择!\n");*/flag='N';break;}}}if(flag=='Y'||flag=='y'){changdata(i);if(chkerr(i)){rstordata(i);showdata();}elseshowdata();}elseshowdata();printf("\n");printf("是否继续银里手算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示:");scanf("%c",&flag);}}voidshowdata(){inti,j;printf("系统可用的资源数为:\n");printf("");for(j=0;j");}printf("\n");return0;}
2015/11/20 3:54:43
883KB
算法
银行家
1