最后去年我交上去的
#include #define N 5 /*进程数,N的可扩充性已完善*/ #define M 3 /*资源数,M的可扩充性基本完善,若使用输出推荐3~5*/
struct claim { int user; int num[M]; }claims;
int input() { int i; printf("请输入申请分配资源的进程号(0~%d):\n",N-1);/*进程号是0至N-1*/ scanf("%d",&claims.user); for(i=0;i{ printf("请输入%c类资源所需的数量:\n",65+i);/*A的ASC2码值是65*/ scanf("%d",&claims.num); } return 1;
}
int safety_chk(int allocation[][M],int need[][M],int available[M]) { int work[M],finish[N],p,i,j; for(p=0;p for(p=0;p for(i=0;i { if(finish==0) { for(j=0,p=0;j[j]<=work[j])p++; if(p==M) { for(j=0;j work[j]=allocation[j]+work[j]; finish=1; i=-1;/*重头再来*/ } } } for(i=0;i { if(finish==0) return 0; } return 1; }
int process(int allocation[][M],int need[][M],int available[M]) { int ret,i; input(); for(i=0;i { if(claims.num>need[claims.user])/*检查*/ { printf("所需资源超过已宣布的最大值!\n"); return 0; } } for(i=0;i{ if(claims.num>available)/*检查*/ { printf("尚无足够资源,进程须等待!\n"); return 0; } } for(i=0;i { available=available-claims.num; allocation[claims.user]=allocation[claims.user]+claims.num; need[claims.user]=need[claims.user]-claims.num; } if(ret=safety_chk(allocation,need,available)==0) {
printf("安全检查结果:系统处于不安全状态!\n"); for(i=0;i { available=available+claims.num; allocation[claims.user]=allocation[claims.user]-claims.num; need[claims.user]=need[claims.user]+claims.num; } return 0; } else {
printf("安全检查结果:系统处于安全状态!\n"); } return 1; }
void output(int allocation[][M],int need[][M],int available[M]) { int i,j; printf("\tMax最大需求\tAllocation分配\tNeed还需要\tAvailable可用\n");/*为保持每个表项长度基本一致故加中文*/ for(j=0;j<4;j++) { printf("\t");for(i=0;i} printf("\n"); for(i=0;i { printf("P%d\t",i); for(j=0;j[j]+need[j]); printf("\t"); for(j=0;j[j]); printf("\t"); for(j=0;j[j]); printf("\t"); if(i==0)for(j=0;jprintf("\n"); } }
void firdo(int allocation[][M],int need[][M],int available[M])/*M、N扩展时,各矩阵通过输入的初始*/ { int i,j; for(i=0;i{ printf("初始进程%d的分配矩阵Allocation\n",i); for(j=0;j{ printf("%c类资源\n",65+j); scanf("%d",&allocation[j]); } printf("初始进程%d的需求矩阵Need\n",i); for(j=0;j{ printf("%c类资源\n",65+j); scanf("%d",&need[j]); } } printf("初始可利用资源向量available\n"); for(j=0;j{ printf("%c类资源\n",65+j); scanf("%d",&available[j]); } }
void main() { int allocation[N][M]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; int need[N][M]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}}; int available[M]={3,3,2}; int xz; /*下面注释内程序是M、N扩展时,各矩阵通过输入的初始化*/ /*firdo(allocation,need,available); while(safety_chk(allocation,need,available)==0) { printf("\nT0时刻的安全检查结果:系统处于不安全状态!\n请重新进行初始化:\n"); firdo(allocation,need,available); }*/ while(1) { printf("1.申请分配资源\n"); printf("2.导出当前资源状况\n"); printf("3.退出\n"); scanf("%d",&xz); if(xz==3){printf("A03计算机(2)班 李宁 0505030208\n");break;} else switch(xz) { case 1:{ if(process(allocation,need,available)==0) printf("资源分配失败!\n"); else printf("资源分配成功!\n"); break; } case 2:output(allocation,need,available); } printf("\n"); }
return; } |