📄 w1.c
字号:
#include <stdio.h>
#define M 3 /*M 是资源的数目*/
#define N 5/*N 是运行的进程数目*/
int available[M];/*可以使用的资源数*/
struct processb{
char pname[20]; /*进程名称*/
int max [M]; /*进程需要的最大资源数*/
int allocation[M];
/*已经给该进程分配的资源数*/
int need[M]; /*进程仍然需要的资源数*/
}process[N];
/*safealgorithm 进行安全性判断*/
int safealgorithm()
{
int i,j;
int work[M],finish[N];
for(i=0;i<M;i++)
work[i]=available[i];/*给 work赋初值*/
for(i=0;i<N;i++)
finish[i]=0; /*finish 置零*/
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
if(finish[i]==1||process[i].need[j]>work[j]) break; /*如果存在word<need或者进程已经完成,结束本次循环*/
if(j==M) /*如果循环是正常结束,那么j=M,说明进程可以执行完*/
{ /*那么就释放它拥有的所有资源*/
for(j=0;j<M;j++)
work[j]=work[j]+process[i].allocation[j];
finish[i]=1;
printf("p%d->",i);
i=-1;}
}
/*并且将该进程的finish 置1*/
/*然后从头寻找还没完成的进程*/
for(i=0;i<N;i++)
if(finish[i]==0)break; /*如果进程没有全部结束,结束本次循环*/
if(i==N){ /*如果 上次循环是正常结束,那么i=N,说明可以全部结束了*/
printf("\nThis allocation end!\n"); /*说明系统是安全的,然后 返回1*/
printf("This allocation is an safealgorithm !\n");
return 1;
}
printf("\nthis allocation is not safealgorithm!\n");
return 0; /*否则,说明系统不安全,返回 0*/
}
/*进行第一步的分配判断,即:是否 request > need*/
int compareRN(int i,int request[])
{
int j;
for(j=0;j<M;j++)
if(request[j]>process[i].need[j])
{
printf("warning:This allocation is unlegal!\n",j);
return 0;
}
return 1;
}
/*进行第一步的分配判断,即:是否 request > available*/
int compareRA(int request[])
{
int j;
for(j=0;j<M;j++)
if(request[j]>available[j]){
printf("warning:This allocation is unlegal!\n");
return 0;
}
return 1;
}
/*进行第三步分配判断,即:假如将资源分配给进程,系统是否处于安全状态*/
void tryallocation(int i,int request[])
{
int j;
for(j=0;j<M;j++) /*假设分配*/
{
available[j]=available[j]-request[j];
process[i].allocation[j]=process[i].allocation[j]+request[j];
process[i].need[j]=process[i].need[j]-request[j];
}
j=safealgorithm(); /*安全判断*/
if(j==0) /*不安全就将假设资源分配作废,恢复初始状态*/
{ printf("This allocation is failure,undo!!\n");
for(j=0;j<M;j++)
{
available[j]=available[j]+request[j];
process[i].allocation[j]=process[i].allocation[j]-request[j];
process[i].need[j]=process[i].need[j]+request[j];
}
}
else printf("This allocation successful\n"); /*否则,资源分配成功*/
}
/*用户进行分配操作*/
void allocation(int i,int request[])
{
int j;
j=compareRN(i,request);/*第一步判断*/
if(j==0) {
printf("warning:this algorithm can not allocation!\n");
return ;
}
j=compareRA(request);/*第二步判断*/
if(j==0){
printf("warning:this algorithm can not allocation!\n");
return ;
}
tryallocation(i,request);/*第三步判断*/
}
/*显示资源的使用情况*/
void display()
{
int i,j;
printf("Available M:\n");
for(i=0;i<M;i++)
{
printf("%d source still has %d;",i,available[i]);
if(i%3==0&&i!=0) printf("\n");
}
printf("\nAllocation M:\n");
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
printf("%s have %d source %d and still need %d;\n",process[i].pname,j,process[i].allocation[j],process[i].need[j]);
}
}
printf("\tMAX,\tALLOCATION,\tNEED");
for(i=0;i<N;i++)
{ printf("\n%s\t",process[i].pname);
for(j=0;j<M;j++)
printf("%d",process[i].max[j]);
printf("\t") ;
for(j=0;j<M;j++)
printf("%d",process[i].allocation[j]);
printf("\t\t") ;
for(j=0;j<M;j++)
printf("%d",process[i].need[j]);
printf("\t") ;
}
}
/*回收资源的第一步判断,即:判断这个进程]的回收资源数是否大于分配数*/
int Cerror(int i,int back[])
{
int j;
for(j=0;j<M;j++)
{
if(back[j]>process[i].allocation[j])
{
printf("This reback is error,because back is more than allocation!\n");
return 0; /*如果 大于的话,返回0*/
}
}
return 1; /*否则返回1*/
}
/*进行回收资源的第二步,即:回收资源*/
void Csuccess(int i,int back[])
{
int j;
for(j=0;j<M;j++)
{
process[i].allocation[j]=process[i].allocation[j]-back[j];
process[i].max[j]=process[i].max[i]-back[j];
available[j]=available[j]+back[j];
}
printf("\n call back now!\n");/*已经回收完毕*/
}
/*用户进行回收操作*/
void reback(int i,int back[])
{
int j;
if(!(i>=0&&i<N))
{
printf("process %d not exist!\n",i);
return;
}
j=Cerror(i,back);
if(j==0)
{
printf("Can not reback!\n");
return;
}
Csuccess(i,back);
}
void main()
{
int i,j,request[M],work[M],back[M];
char a;
printf("please input the name of process:\n");/*输入进程名,即:为每个进程起一个名称*/
for(i=0;i<N;i++)
{
printf("The %d process's name is :",i);
scanf("%s",&process[i].pname);
}
printf("please input available source:\n");/*输入目前的可用资源数 */
for(i=0;i<M;i++)
{
scanf("%d",&available[i]);
}
printf("please input the max number of source :\n");/*输入进程每个资源的最大需求*/
for(i=0;i<N;i++)
for(j=0;j<M;j++)
{
scanf("%d",&process[i].max[j]);
}
again: printf("The source has been allocation :\n ");/*输入进程已经分配的资源*/
for(i=0;i<N;i++)
for(j=0;j<M;j++)
{
scanf("%d",&process[i].allocation[j]);
}
for(i=0;i<N;i++)/*给进程的need赋初值*/
for(j=0;j<M;j++)
{
process[i].need[j]=process[i].max[j]-process[i].allocation[j];
}
i=safealgorithm();/*进行安全性判断*/
if(i==0)/*如果返回是0,说明系统不安全,让用户重新输入分配情况*/
{
printf("Allocation is wrong.please try it again\n");
goto again;
} /*否则,开始让用户进行选择操作*/
printf("*************************************");
printf("\n\tMAX,\tALLOCATION,\tNEED");
for(i=0;i<N;i++)
{ printf("\n%s\t",process[i].pname);
for(j=0;j<M;j++)
printf("%d",process[i].max[j]);
printf("\t") ;
for(j=0;j<M;j++)
printf("%d",process[i].allocation[j]);
printf("\t\t") ;
for(j=0;j<M;j++)
printf("%d",process[i].need[j]);
printf("\t") ;
}
printf("\n*************************************") ;
loop: printf("\nSelect your choice\na:Allocation\nr:Reback\nd:Display\n");
a=getchar();
a=getchar(); /*a是用户所作的选择,根据a的值确定下一步的操作*/
switch(a)
{
case 'a': /*入果a='a',说明用户要进行分配操作,输入要分配资源的进程号*/
{
printf("Input allocation process'number:");
scanf("%d",&i);
printf("Input source request of process %3d\n:",i);/*输入该进程对各个资源的申请情况*/
for(j=0;j<M;j++)
{
printf("source-%d'number:",j);
scanf("%d",&request[j]);
}
allocation(i,request); /*进行分配操作*/
break;
}
case 'R': /*如果用户输入的是'c',说明用户要进行回收操作,输入要回收的进程名*/
{
printf("Input reback process'number:");
scanf("%d",&i);
printf("Input the number of process %3d'reback source\n:",i);/*输入各个资源的回收数目*/
for(j=0;j<M;j++)
{
printf("source-%d",j);
scanf("%d",&back[j]);
}
reback(i,back); /*进行回收操作*/
break;
}
case 'd': /*用户输入的是d,说明用户要进行显示资源操作*/
{
display(); /*直接执行display*/
break;
}
default:
printf("ERROR!\n");goto loop;
}
printf("\nEND?(y/n)"); /*用户的这次操作已经完成,提示是否结束如果输入n,返回loop*/
a=getchar(); /*否则退出程序*/
a=getchar();
if(a=='n'||a=='N') goto loop;
else goto end;
end:
printf("THIS ALLOCATION IS END!");
exit();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -