发布时间:2025-12-09 13:38:14 浏览次数:3
银行家算法(Banker’sAlgorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。
—百度百科
当一个进程申请使用资源的时候,银行家算法通过先试探分配给该进程资源,然后通过安全性算法判断分配后的系统是否处于安全状态,若不安全则试探分配作废,让该进程继续等待。
安全性算法是判断分配后的系统是否会进入不安全状态,若不存在安全序列,则判定系统已经进入不安全状态。如果不按照安全序列分配资源,则系统可能会由安全状态进入不安全状态。
#include<stdio.h>#include<string.h>#define M 10#define N 50int Available[M];struct job{ char name[5]; int Max[M];int Allocation[M];int Need[M];int flag; //每次是否达到运行要求的标志int finish; //是否运行完成};int safe(struct job jobs[N],int n,int m,int Available[M]){ char t_name[5];int t_Max;int t_Allocation;int t_Need;int t_flag;int i,j,k;for(i=0;i<n;i++){ for(j=i;j<n;j++) //遍历后面的所有作业,寻找满足的作业{ for(k=0;k<m;k++) //判断作业是否能够执行{ if(jobs[j].Need[k]>Available[k])jobs[j].flag=0;}if(jobs[j].flag==1) //如果满足要求,执行之后释放所有资源{ for(k=0;k<m;k++){ jobs[j].Need[k]=0;jobs[j].Allocation[k]=0;Available[k]+=jobs[j].Max[k];jobs[j].finish=1;}//将第j个作业和第i个作业互换位置strcpy(t_name,jobs[j].name);//交换作业名strcpy(jobs[j].name,jobs[i].name);strcpy(jobs[i].name,t_name);t_flag=jobs[j].flag; //交换flagjobs[j].flag=jobs[i].flag;jobs[i].flag=t_flag;t_flag=jobs[j].finish; //交换finishjobs[j].finish=jobs[i].finish;jobs[i].finish=t_flag;for(k=0;k<m;k++)//交换其他值{ t_Max=jobs[j].Max[k]; //交换最大需求jobs[j].Max[k]=jobs[i].Max[k];jobs[i].Max[k]=t_Max;t_Need=jobs[j].Need[k]; //交换还需要的资源量jobs[j].Need[k]=jobs[i].Need[k];jobs[i].Need[k]=t_Need;t_Allocation=jobs[j].Allocation[k]; //交换已分配的资源jobs[j].Allocation[k]=jobs[i].Allocation[k];jobs[i].Allocation[k]=t_Allocation;}break;}}for(j=i+1;j<n;j++) //遍历后面的所有作业,将flag重新初始化为1{ jobs[j].flag=1;}}for(i=0;i<n;i++){ if(jobs[i].finish==0){ printf("不存在安全序列");return 0;}}printf("存在安全序列为:");for(i=0;i<n;i++){ printf("%s ",jobs[i].name);}printf("\n");return 1;}void print(struct job jobs[N],int n,int m){ int i,k;printf("进程名称\tMax\t\tAllocation\tNeed\n");for(i=0;i<n;i++){ printf("%s\t\t",jobs[i].name);for(k=0;k<m;k++){ printf("%d ",jobs[i].Max[k]);}printf(" \t");for(k=0;k<m;k++){ printf("%d ",jobs[i].Allocation[k]);}printf(" \t");for(k=0;k<m;k++){ printf("%d ",jobs[i].Need[k]);}printf("\n");}printf("\n");printf("当前可分配资源为:");for(k=0;k<m;k++){ printf("%d ",Available[k]);}printf("\n");printf("\n");}int judge(struct job jobs[N],int n,int m){ int i,k;for(i=0;i<n;i++){ for(k=0;k<m;k++){ if(jobs[i].Max[k]<0||jobs[i].Allocation[k]<0||jobs[i].Need[k]<0)return 0;}}for(k=0;k<m;k++){ if(Available[k]<0)return 0;}return 1;}int main(){ struct job jobs[N];int i,k,m,n;int I,t;int A[M];printf("请输入资源的种数:");scanf("%d",&m);printf("请输入进程的个数:");scanf("%d",&n);printf("\n");for(i=0;i<n;i++){ printf("请输入第%d个进程的名称:",i+1);scanf("%s",jobs[i].name);printf("请输入第%d个进程所需最大的资源(各种资源数用空格隔开):",i+1);for(k=0;k<m;k++){ scanf("%d",&jobs[i].Max[k]);}printf("请输入第%d个进程已经分配的资源(各种资源数用空格隔开):",i+1);for(k=0;k<m;k++){ scanf("%d",&jobs[i].Allocation[k]);jobs[i].Need[k]=jobs[i].Max[k]-jobs[i].Allocation[k];}jobs[i].flag=1;jobs[i].finish=0;printf("\n");}printf("请输入当前系统剩余可进行分配的资源(各种资源数用空格隔开):",i+1);for(k=0;k<m;k++){ scanf("%d",&Available[k]);}printf("\n");if(judge(jobs,n,m)==0){ printf("输入有误!\n");return 0;}printf("当前资源分配情况如下:\n");print(jobs,n,m);printf("请输入要请求资源的进程是第几个:");scanf("%d",&I);I--;printf("请输入要请求的资源(各种资源数用空格隔开):");for(k=0;k<m;k++){ scanf("%d",&A[k]);}for(k=0;k<m;k++){ jobs[I].Allocation[k]=jobs[I].Allocation[k]+A[k];jobs[I].Need[k]=jobs[I].Need[k]-A[k];Available[k]=Available[k]-A[k];}printf("\n");if(judge(jobs,n,m)==0){ printf("输入有误!\n");return 0;}printf("分配后资源情况如下:\n");print(jobs,n,m);printf("分配后系统");t=safe(jobs,n,m,Available);printf("\n");if(t==1){ printf("分配成功");}elseprintf("分配失败");printf("\n");printf("\n");printf("\n");printf("按Enter退出\n");getchar();getchar();}