银行家算法

/*银行家算法&安全性算法*/
#include<stdio.h>
#include<malloc.h>
#include<windows.h>
#define N 100
int Available[N]={-1};//可利用资源向量
int Max[N][N]={-1};//最大需求矩阵
int Allocation[N][N]={-1};//分配矩阵
int Need[N][N]={-1};//需求矩阵
bool Finish[N]={false};//检测矩阵
int Work[N];//工作向量
int Request[N]={0};//请求矩阵
int SafeQueue[N]={-1};//安全队列
int step=0;//计步器
bool CheckFinalSafe(bool a[],int n){//最终检测
for(int i=0;i<n;i++){
if(a[i]==false){
return false;
}
}
return true;
}
bool ChackSafe(int num,int now){//安全性算法
for(int i=0;i<num;i++){
if(Finish[now]==true||Need[now][i]>Work[i]){
return false;
}
}
for(int j=0;j<num;j++){
Work[j]=Work[j]+Allocation[now][j];
}
Finish[now]=true;
return true;
}
bool FirstTestCheck(int n,int num){//银行家算法
for(int i=0;i<num;i++){
if(Request[i]>Need[n][i]){
printf("需要资源数已经大于它宣布的最大值\n");
return false;
}
}
for(int j=0;j<num;j++){
if(Request[j]>Available[j]){
printf("无足够资源分配\n");
return false;
}
}
for(int l=0;l<num;l++){
Available[l]=Available[l]-Request[l];
Allocation[n][l]=Allocation[n][l]+Request[l];
Need[n][l]=Need[n][l]-Request[l];
Work[l]=Available[l];
}
return true;
}
void Print(int n,int num){//输出函数
for(int k=0;k<num;k++){
printf("%2d  ",Work[k]);
}
for(int i=0;i<num;i++){
printf("%2d  ",Need[n][i]);
}
for(int j=0;j<num;j++){
printf("%2d   ",Allocation[n][j]);
}
if(Finish[n]){
printf("  true");
}
printf("\n");
}
int main(){
int num,n;
int w,s;
printf("资源的个数:");
scanf("%d",&num);
printf("进程的个数:");
scanf("%d",&n);
for(int k=0;k<num;k++){
printf("%d类资源数目:",k+1);
scanf("%d",Available+k);
}
for(int i=0;i<n;i++){
for(int j=0;j<num;j++){
printf("进程%d,%d类资源的MAX ALLOCATION NEED:",i+1,j+1);
scanf("%d %d %d",(Max[i])+j,(Allocation[i])+j,(Need[i])+j);
}
}
printf("是否为某一进程请求申请资源 0/1:");
scanf("%d",&s);
if(s){
printf("申请资源的进程:");
scanf("%d",&w);
printf("申请的资源量:");
for(int m=0;m<num;m++){
scanf("%d",Request+m);
}
}
system("CLS");
printf("进程   Available      Need      Allocation    Finish\n");
if(FirstTestCheck(w-1,num)){ //数据初始化
for(int x=0;x<n;x++){
for(int k=0;k<n;k++){
if(ChackSafe(num,k)){
SafeQueue[step]=k+1;   
printf("%2d    ",SafeQueue[step]);
Print(SafeQueue[step]-1,num);
step++;
break;
}
}
}
}
if(CheckFinalSafe(Finish,n)){//安全序列检测
printf("safe!\n安全序列为:");
for(int y=0;y<step;y++){
printf("%d ",SafeQueue[y]);
}
printf("\n");
}
else{
printf("not safe!\n");
}
return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值