#include
"
string.h
"
#include < stdio.h >
#include < stdlib.h >
#define M 5
#define N 3
#define FALSE 0
#define TRUE 1
/**/ /*M个进程对N类资源最大资源需求量*/
int MAX[M][N] = ... {...{7,5,3},...{3,2,2},...{9,0,2},...{2,2,2},...{4,3,3}} ;
/**/ /*系统可用资源数*/
int AVAILABLE[N] = ... {10,5,7} ;
/**/ /*M个进程对N类资源最大资源需求量*/
int ALLOCATION[M][N] = ... {...{0,0,0},...{0,0,0},...{0,0,0},...{0,0,0},...{0,0,0}} ;
/**/ /*M个进程已经得到N类资源的资源量 */
int NEED[M][N] = ... {...{7,5,3},...{3,2,2},...{9,0,2},...{2,2,2},...{4,3,3}} ;
/**/ /*M个进程还需要N类资源的资源量*/
int Request[N] = ... {0,0,0} ;
void main()
... {
int i=0,j=0;
char flag='Y';
void showdata();
void changdata(int);
void rstordata(int);
int chkerr(int);
showdata();
while(flag=='Y'||flag=='y')
...{
i=-1;
while(i<0||i>=M)
...{
printf("请输入需申请资源的进程号(从0到");
printf("%d",M-1);
printf(",否则重输入!):");
scanf("%d",&i);
if(i<0||i>=M)printf("输入的进程号不存在,重新输入! ");
}
printf("请输入进程");
printf("%d",i);
printf("申请的资源数 ");
for (j=0;j<N;j++)
...{
printf("资源");
printf("%d",j);
printf(":");
scanf("%d",&Request[j]);
if(Request[j]>NEED[i][j])
...{
printf("进程");
printf("%d",i);
printf("申请的资源数大于进程");
printf("%d",i);
printf("还需要");
printf("%d",j);
printf("类资源的资源量!申请不合理,出错!请重新选择! ");
/**//*printf("申请不合理,出错!请重新选择! ");*/
flag='N';
break;
}
else
...{
if(Request[j]>AVAILABLE[j])
...{
printf("进程");
printf("%d",i);
printf("申请的资源数大于系统可用");
printf("%d",j);
printf("类资源的资源量!申请不合理,出错!请重新选择! ");
/**//*printf("申请不合理,出错!请重新选择! ");*/
flag='N';
break;
}
}
}
if(flag=='Y'||flag=='y')
...{
changdata(i);
if(chkerr(i))
...{
rstordata(i);
showdata();
}
else
showdata();
}
else
showdata();
printf(" ");
printf("是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ");
scanf("%c",&flag);
}
}
void showdata()
... {
int i,j;
printf("系统可用的资源数为: ");
printf(" ");
for (j=0;j<N;j++)...{
printf(" 资源");
printf("%d",j);
printf(":");
printf("%d",AVAILABLE[j]);
/**//*printf(" ");*/
/**//* cout<<endl;
// cout<<"各进程资源的最大需求量:"<<endl<<endl;
// for (i=0;i<M;i++)
// {
// cout<<"进程"<<i<<":";
// for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<MAX[i][j];
// cout<<endl;
*/ }
printf(" ");
printf("各进程还需要的资源量: ");
for (i=0;i<M;i++)
...{
printf(" 进程");
printf("%d",i);
printf(":");
for (j=0;j<N;j++)...{
printf("资源");
printf("%d",j);
printf(":");
printf("%d",NEED[i][j]);
/**//*printf(" ");*/
}
printf(" ");
}
printf("各进程已经得到的资源量: ");
for (i=0;i<M;i++)
...{
printf(" 进程");
printf("%d",i);
/**//*printf(": ");*/
for (j=0;j<N;j++)...{
printf("资源");
printf("%d",j);
printf(":");
printf("%d",ALLOCATION[i][j]);
/**//*printf(" ");*/
}
printf(" ");
}
}
void changdata( int k)
... {
int j;
for (j=0;j<N;j++)
...{
AVAILABLE[j]=AVAILABLE[j]-Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
NEED[k][j]=NEED[k][j]-Request[j];
}
} ;
void rstordata( int k)
... {
int j;
for (j=0;j<N;j++)
...{
AVAILABLE[j]=AVAILABLE[j]+Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
NEED[k][j]=NEED[k][j]+Request[j];
}
} ;
int chkerr( int s)
... {
int WORK,FINISH[M],temp[M];
int i,j,k=0;
for(i=0;i<M;i++)FINISH[i]=FALSE;
for(j=0;j<N;j++)
...{
WORK=AVAILABLE[j];
i=s;
while(i<M)
...{
if (FINISH[i]==FALSE&&NEED[i][j]<=WORK)
...{
WORK=WORK+ALLOCATION[i][j];
FINISH[i]=TRUE;
temp[k]=i;
k++;
i=0;
}
else
...{
i++;
}
}
for(i=0;i<M;i++)
if(FINISH[i]==FALSE)
...{
printf(" ");
printf("系统不安全!!! 本次资源申请不成功!!! ");
printf(" ");
return 1;
}
}
printf(" ");
printf("经安全性检查,系统安全,本次分配成功。 ");
printf(" ");
printf(" 本次安全序列:");
for(i=0;i<M;i++)...{
printf("进程");
printf("%d",temp[i]);
printf("->");
}
printf(" ");
return 0;
}
#include < stdio.h >
#include < stdlib.h >
#define M 5
#define N 3
#define FALSE 0
#define TRUE 1
/**/ /*M个进程对N类资源最大资源需求量*/
int MAX[M][N] = ... {...{7,5,3},...{3,2,2},...{9,0,2},...{2,2,2},...{4,3,3}} ;
/**/ /*系统可用资源数*/
int AVAILABLE[N] = ... {10,5,7} ;
/**/ /*M个进程对N类资源最大资源需求量*/
int ALLOCATION[M][N] = ... {...{0,0,0},...{0,0,0},...{0,0,0},...{0,0,0},...{0,0,0}} ;
/**/ /*M个进程已经得到N类资源的资源量 */
int NEED[M][N] = ... {...{7,5,3},...{3,2,2},...{9,0,2},...{2,2,2},...{4,3,3}} ;
/**/ /*M个进程还需要N类资源的资源量*/
int Request[N] = ... {0,0,0} ;
void main()
... {
int i=0,j=0;
char flag='Y';
void showdata();
void changdata(int);
void rstordata(int);
int chkerr(int);
showdata();
while(flag=='Y'||flag=='y')
...{
i=-1;
while(i<0||i>=M)
...{
printf("请输入需申请资源的进程号(从0到");
printf("%d",M-1);
printf(",否则重输入!):");
scanf("%d",&i);
if(i<0||i>=M)printf("输入的进程号不存在,重新输入! ");
}
printf("请输入进程");
printf("%d",i);
printf("申请的资源数 ");
for (j=0;j<N;j++)
...{
printf("资源");
printf("%d",j);
printf(":");
scanf("%d",&Request[j]);
if(Request[j]>NEED[i][j])
...{
printf("进程");
printf("%d",i);
printf("申请的资源数大于进程");
printf("%d",i);
printf("还需要");
printf("%d",j);
printf("类资源的资源量!申请不合理,出错!请重新选择! ");
/**//*printf("申请不合理,出错!请重新选择! ");*/
flag='N';
break;
}
else
...{
if(Request[j]>AVAILABLE[j])
...{
printf("进程");
printf("%d",i);
printf("申请的资源数大于系统可用");
printf("%d",j);
printf("类资源的资源量!申请不合理,出错!请重新选择! ");
/**//*printf("申请不合理,出错!请重新选择! ");*/
flag='N';
break;
}
}
}
if(flag=='Y'||flag=='y')
...{
changdata(i);
if(chkerr(i))
...{
rstordata(i);
showdata();
}
else
showdata();
}
else
showdata();
printf(" ");
printf("是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ");
scanf("%c",&flag);
}
}
void showdata()
... {
int i,j;
printf("系统可用的资源数为: ");
printf(" ");
for (j=0;j<N;j++)...{
printf(" 资源");
printf("%d",j);
printf(":");
printf("%d",AVAILABLE[j]);
/**//*printf(" ");*/
/**//* cout<<endl;
// cout<<"各进程资源的最大需求量:"<<endl<<endl;
// for (i=0;i<M;i++)
// {
// cout<<"进程"<<i<<":";
// for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<MAX[i][j];
// cout<<endl;
*/ }
printf(" ");
printf("各进程还需要的资源量: ");
for (i=0;i<M;i++)
...{
printf(" 进程");
printf("%d",i);
printf(":");
for (j=0;j<N;j++)...{
printf("资源");
printf("%d",j);
printf(":");
printf("%d",NEED[i][j]);
/**//*printf(" ");*/
}
printf(" ");
}
printf("各进程已经得到的资源量: ");
for (i=0;i<M;i++)
...{
printf(" 进程");
printf("%d",i);
/**//*printf(": ");*/
for (j=0;j<N;j++)...{
printf("资源");
printf("%d",j);
printf(":");
printf("%d",ALLOCATION[i][j]);
/**//*printf(" ");*/
}
printf(" ");
}
}
void changdata( int k)
... {
int j;
for (j=0;j<N;j++)
...{
AVAILABLE[j]=AVAILABLE[j]-Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
NEED[k][j]=NEED[k][j]-Request[j];
}
} ;
void rstordata( int k)
... {
int j;
for (j=0;j<N;j++)
...{
AVAILABLE[j]=AVAILABLE[j]+Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
NEED[k][j]=NEED[k][j]+Request[j];
}
} ;
int chkerr( int s)
... {
int WORK,FINISH[M],temp[M];
int i,j,k=0;
for(i=0;i<M;i++)FINISH[i]=FALSE;
for(j=0;j<N;j++)
...{
WORK=AVAILABLE[j];
i=s;
while(i<M)
...{
if (FINISH[i]==FALSE&&NEED[i][j]<=WORK)
...{
WORK=WORK+ALLOCATION[i][j];
FINISH[i]=TRUE;
temp[k]=i;
k++;
i=0;
}
else
...{
i++;
}
}
for(i=0;i<M;i++)
if(FINISH[i]==FALSE)
...{
printf(" ");
printf("系统不安全!!! 本次资源申请不成功!!! ");
printf(" ");
return 1;
}
}
printf(" ");
printf("经安全性检查,系统安全,本次分配成功。 ");
printf(" ");
printf(" 本次安全序列:");
for(i=0;i<M;i++)...{
printf("进程");
printf("%d",temp[i]);
printf("->");
}
printf(" ");
return 0;
}
#include
<
stdio.h
>
#define n 5 // 进程个数
#define m 3 // 资源种类
int Available[m] = ... {2,3,3} ,Alloc[n + 1 ][m] = ... {0,0,0,2,1,2,4,0,2,3,0,5,2,0,4,3,1,4} ,Need[n + 1 ][m] = ... {0,0,0,3,4,7,1,3,4,0,0,3,2,2,1,1,1,0} ;
int Available1[m],Need1[n][m],Alloc1[n][m];
int h;
/**/ /
int safede() // 安全状态判别算法
... {
int i,j,work[m],finish[n],tag=n;
for(i=0;i<m;i++)work[i]=Available1[i];
for(i=0;i<n;i++)finish[i]=0;
while(tag--)
...{
for(i=0;i<n;i++)
...{
if(finish[i]==0)
...{
for(j=0;j<m;j++)if(Need1[h][j]<=work[j])continue;
if(j==m)
...{
for(j=0;j<m;j++)
...{
work[j]=work[j]+Alloc1[h][j];
finish[j]=1;
}
}
}
}
}
for(i=0;i<n;i++)if(finish[i]==1)continue;
if(i==n)return 1;
else return 0;
}
/**/ ///
int main()
... {
int i,j,request[m];
while(1)
...{
printf("输入进程类型: P = ");
scanf("%d",&h);
printf("输入请求资源向量: ");
for(i=0;i<m;i++)scanf("%d",&request[i]);
for(i=0;i<m;i++)
...{
Available1[i]=Available[i];
Alloc1[h][i]=Alloc[h][i];
Need1[h][i]=Need[h][i];
}
for(i=0;i<m;i++)
...{
if (!(request[i]<=Need[h][i]))
...{
printf("非法请求!!! ");
break;
}
}
if(i==m)
...{
for(i=0;i<m;i++)
...{
if (!(request[i]<=Available[i]))
...{
printf("P%d阻塞!!! ",h);
break;
}
}
}
if(i==m)
...{
for(i=0;i<m;i++) //试探性分配
...{
Available1[i]=Available1[i] - request[i];
Alloc1[h][i]=Alloc1[h][i]+request[i];
Need1[h][i]=Need1[h][i]-request[i];
}
if(safede()==0) printf("资源分配后系统不是处于安全状态! "); //若新状态安全,则实际分配资源给Pi,否则取消试探性分配
else
...{
printf("资源分配成功! ");
for(i=0;i<m;i++)
...{
Available[i]=Available1[i];
Alloc[h][i]=Alloc1[h][i];
Need[h][i]=Need1[h][i];
}
}
}
printf("可利用资源: ");
for(i=0;i<m;i++)printf("%d ",Available[i]);
printf(" 分配资源: ");
for(i=1;i<=n;i++)
...{
for(j=0;j<m;j++)
printf("%d ",Alloc[i][j]);
printf(" ");
}
printf("需求矩阵: ");
for(i=1;i<=n;i++)
...{
for(j=0;j<m;j++)
printf("%d ",Need[i][j]);
printf(" ");
}
printf("请求结束! ");
printf(" ");
}
return 0;
}
#define n 5 // 进程个数
#define m 3 // 资源种类
int Available[m] = ... {2,3,3} ,Alloc[n + 1 ][m] = ... {0,0,0,2,1,2,4,0,2,3,0,5,2,0,4,3,1,4} ,Need[n + 1 ][m] = ... {0,0,0,3,4,7,1,3,4,0,0,3,2,2,1,1,1,0} ;
int Available1[m],Need1[n][m],Alloc1[n][m];
int h;
/**/ /
int safede() // 安全状态判别算法
... {
int i,j,work[m],finish[n],tag=n;
for(i=0;i<m;i++)work[i]=Available1[i];
for(i=0;i<n;i++)finish[i]=0;
while(tag--)
...{
for(i=0;i<n;i++)
...{
if(finish[i]==0)
...{
for(j=0;j<m;j++)if(Need1[h][j]<=work[j])continue;
if(j==m)
...{
for(j=0;j<m;j++)
...{
work[j]=work[j]+Alloc1[h][j];
finish[j]=1;
}
}
}
}
}
for(i=0;i<n;i++)if(finish[i]==1)continue;
if(i==n)return 1;
else return 0;
}
/**/ ///
int main()
... {
int i,j,request[m];
while(1)
...{
printf("输入进程类型: P = ");
scanf("%d",&h);
printf("输入请求资源向量: ");
for(i=0;i<m;i++)scanf("%d",&request[i]);
for(i=0;i<m;i++)
...{
Available1[i]=Available[i];
Alloc1[h][i]=Alloc[h][i];
Need1[h][i]=Need[h][i];
}
for(i=0;i<m;i++)
...{
if (!(request[i]<=Need[h][i]))
...{
printf("非法请求!!! ");
break;
}
}
if(i==m)
...{
for(i=0;i<m;i++)
...{
if (!(request[i]<=Available[i]))
...{
printf("P%d阻塞!!! ",h);
break;
}
}
}
if(i==m)
...{
for(i=0;i<m;i++) //试探性分配
...{
Available1[i]=Available1[i] - request[i];
Alloc1[h][i]=Alloc1[h][i]+request[i];
Need1[h][i]=Need1[h][i]-request[i];
}
if(safede()==0) printf("资源分配后系统不是处于安全状态! "); //若新状态安全,则实际分配资源给Pi,否则取消试探性分配
else
...{
printf("资源分配成功! ");
for(i=0;i<m;i++)
...{
Available[i]=Available1[i];
Alloc[h][i]=Alloc1[h][i];
Need[h][i]=Need1[h][i];
}
}
}
printf("可利用资源: ");
for(i=0;i<m;i++)printf("%d ",Available[i]);
printf(" 分配资源: ");
for(i=1;i<=n;i++)
...{
for(j=0;j<m;j++)
printf("%d ",Alloc[i][j]);
printf(" ");
}
printf("需求矩阵: ");
for(i=1;i<=n;i++)
...{
for(j=0;j<m;j++)
printf("%d ",Need[i][j]);
printf(" ");
}
printf("请求结束! ");
printf(" ");
}
return 0;
}