操作系统之--银行家算法2
来源:互联网 发布:淘宝网上买白酒 编辑:程序博客网 时间:2024/05/16 06:42
#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;
}
- 操作系统之--银行家算法2
- 操作系统之银行家算法
- 操作系统之银行家算法
- 操作系统之银行家算法
- 操作系统 之 银行家算法
- 操作系统之银行家算法
- 操作系统之银行家算法
- 操作系统算法 之 银行家算法
- 操作系统之--银行家算法1
- 操作系统实验之银行家算法
- 避免死锁之银行家算法 银行家算法 操作系统
- 操作系统实验之银行家算法模拟
- 操作系统之死锁概述与银行家算法
- 操作系统--银行家算法设计
- 操作系统课程设计银行家算法
- 操作系统课程设计银行家算法
- 操作系统::银行家算法
- 操作系统银行家算法
- 在桌面中嵌入窗体
- 实现海量数据和小数据量的通用分页显示存储过程
- 操作系统之--银行家算法1
- HOOK专题
- Lest We Remember: Cold Boot Attacks on Encryption Keys
- 操作系统之--银行家算法2
- 编译原理--实验一 词法分析
- WebDateChooser客户端设置日期
- POSIX 线程详解
- 一种注入进程,获得完全操控的方法之一[先贴过来,等下研究一下,看起来不错]
- SQL语句学习手册实例
- 如何用C++ Builder 6快速开发MSN机器人
- 取石子游戏
- 向数据库批量添加数据