银行家算法
给进程分配资源,是系统处于安全状态;当进程向系统申请资源时,系统要预判分配资源后是否还存在安全状态,如果存在则分配,否则不分配。先看效果再附源码
运行结果
源代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 10
struct POC{
char JobName;//进程名
int Allocation[3];//已拥有资源数
int Need[3];//还需求资源数
int Pass;//是否已经过 1是 0否
}job[N]={{'A', 0,1,0, 7,4,3 ,0},//3:7 5 3
{'B', 2,0,0, 1,2,2 ,0},//1:5 3 2
{'C', 3,0,2, 6,0,0 ,0},//4:10 5 5
{'D', 2,1,1, 0,1,1 ,0},//2:7 4 3
{'E', 0,0,1, 4,3,1 ,0} //5:10 5 6
};//3 3 2
int Number=5,SafetySequenceNumber;
int Available[3]={3,3,2};
struct POC{
char JobName;//进程名
int Allocation[3];//已拥有资源数
int Need[3];//还需求资源数
int Pass;//是否已经过 1是 0否
}job[N]={{'A', 0,1,0, 7,4,3 ,0},//3:7 5 3
{'B', 2,0,0, 1,2,2 ,0},//1:5 3 2
{'C', 3,0,2, 6,0,0 ,0},//4:10 5 5
{'D', 2,1,1, 0,1,1 ,0},//2:7 4 3
{'E', 0,0,1, 4,3,1 ,0} //5:10 5 6
};//3 3 2
int Number=5,SafetySequenceNumber;
int Available[3]={3,3,2};
//1.1安全序列
void SafetySequence(char c[N],int k){
int j;
for(j=0;j<Number;j++){
if(Available[0]>=job[j].Need[0]&&Available[1]>=job[j].Need[1]&&Available[2]>=job[j].Need[2]&&
(job[j].Need[0]!=0||job[j].Need[1]!=0||job[j].Need[2]!=0)&&job[j].Pass==0){
job[j].Pass=1;
for(int n=0;n<3;n++){
Available[n]=job[j].Allocation[n]+Available[n];
}
c[k]=job[j].JobName;
k++;
//已经找到一个安全序列,输出
if(k==Number){
SafetySequenceNumber++;
for(int i=0;i<Number;i++){
printf("->%c",c[i]);
}
printf("\n");
}else{
//递归继续查找
SafetySequence(c,k);
}
//恢复数据,回溯
k--;
for(int n=0;n<3;n++){
Available[n]-=job[j].Allocation[n];
}
job[j].Pass=0;
}
}
}
//1.是否安全
int IsSafety(){
int i,k=0;
char c[Number];
printf("\n进程名\t已有资源\t仍需资源");
for(i=0;i<Number;i++){
printf("\n%c\t %d %d %d\t\t %d %d %d",job[i].JobName,job[i].Allocation[0],job[i].Allocation[1],job[i].Allocation[2],
job[i].Need[0],job[i].Need[1],job[i].Need[2]);
}
printf("\n可用资源:%d %d %d\n\n",Available[0],Available[1],Available[2]);
for(i=0;i<Number;i++){
if(job[i].Need[0]==0&&job[i].Need[1]==0&&job[i].Need[2]==0){
c[k]=job[i].JobName;
k++;
}
}
SafetySequenceNumber=0;
SafetySequence(c,k);
if(SafetySequenceNumber!=0){
printf("\n存在%d个安全序列",SafetySequenceNumber);
return 1;
}
else{
printf("不存在安全序列");
return 0;
}
}
//2.请求处理
void Resqust(){
char RJN;
int i,RRN[3];
printf("\n输入请求进程名(如:A):");
scanf("%s",&RJN);
printf("输入请求资源数(如:1 1 1):");
scanf("%d %d %d",&RRN[0],&RRN[1],&RRN[2]);
if(RRN[0]>Available[0]||RRN[1]>Available[1]||RRN[2]>Available[2]||RRN[0]<0||RRN[1]<0||RRN[2]<0){
printf("\n请求资源大于可用资源or小于0\n");
}
else{
for(i=0;i<Number;i++){
if(job[i].JobName==RJN){
//如果请求资源大于等于需求资源,则完成进程释放资源
if(RRN[0]>=job[i].Need[0]&&RRN[1]>=job[i].Need[1]&&RRN[2]>=job[i].Need[2]){
for(int k=0;k<3;k++){
Available[k]+=job[i].Allocation[k];
job[i].Need[k]=0;
job[i].Allocation[k]=0;
}
//否则分配资源
}else{
for(int j=0;j<3;j++){
Available[j]-=RRN[j];
job[i].Need[j]-=RRN[j];
job[i].Allocation[j]+=RRN[j];
}
}
break;
}
}
if(i==Number){
printf("进程名有误\n");
return;
}
printf("\n预判:\n");
//如果存在安全序列
if(IsSafety()==1){
//分配资源
for(i=0;i<Number;i++){
//如果请求资源>=需求资源,则删除进程
if(job[i].JobName==RJN&&RRN[0]>=job[i].Need[0]&&RRN[1]>=job[i].Need[1]&&RRN[2]>=job[i].Need[2]){//未完成的进程
for(int j=i;i<Number;i++){
job[i].JobName=job[i+1].JobName;
for(int k=0;k<3;k++){
job[i].Allocation[k]=job[i+1].Allocation[k];
job[i].Need[k]=job[i+1].Need[k];
}
}
Number--;
break;
}
}
printf(",已分配\n");
}
else{
printf(",不能分配!\n");
for(int i=0;i<3;i++){
Available[i]+=RRN[i];
}
}
}
}
//0.主函数
int main(){
int k;
do {
printf("\n\n");
printf("\t\t 银行家算法 \n");
printf("\t\t*****************************\n");
printf("\t\t* *\n");
printf("\t\t* 1----当前状态 *\n");
printf("\t\t* 2----请求资源 *\n");
printf("\t\t* 0----退 出 *\n");
printf("\t\t* *\n");
printf("\t\t*****************************\n");
printf("\t\t 请选择菜单项(0-2):");
scanf("%d",&k);
switch(k)
{
case 1:
printf("当前状态:\n");
IsSafety();
break;
case 2:
printf("\n请求资源:\n");
Resqust();
break;
default:
break;
}
}while (k!=0);
return 0;
}
来源:CSDN
作者:Bule_coast_lkj
链接:https://blog.csdn.net/qq_41553370/article/details/103855354