实验题目:用银行家算法和随机算法实现资源分配

实验题目:用银行家算法和随机算法实现资源分配

实验原理:
银行家算法的分配资源是:当某个进程提出资源申请时,假定先分配资源给它,然后查找各进程的剩余请求,检查系统剩余资源量是否由于进程的分配而导致系统死锁。若能,则让进程等待,否则,让进程的假分配变为真分配。
随机分配算法的分配原则:当进程申请资源时,如果进程现有资源数能满足进程的当前申请量,就把资源分配给进程,否则,让其等待。这样,随机算法可能引起死锁。
银行家代码:

#include<stdio.h>

//定义一个结构体 
struct PCB{
	char name[10];
	int Max[3];
	int Allocation[3];
	int Need[3];
	int label;
	int finish;
	int work[3]; 
	int wAllocation[3];
};

int ss=1;
//判断进程是否满足系统需求 
void Ready(PCB *p,int x,int *Available){
	if(Available[0]-p[x].Need[0]>=0&&Available[1]-p[x].Need[1]>=0&&Available[2]-p[x].Need[2]>=0)
	p[x].label=0;
	else p[x].label=1;
}

//进程完成后资源释放 
void add(PCB *p,int x,int *Available){
	for(int i=0;i<3;i++){
		p[x].work[i]=Available[i];
		Available[i]+=p[x].Allocation[i];
		p[x].wAllocation[i]=Available[i];
		p[x].finish=ss++;
	}
}

//对所有进程进行判断和资源处理 
void start(PCB *p,int *Available){
	for(int i=0;i<5;i++){
		Ready(p,i,Available);
		if(p[i].label==0&&p[i].finish==0)
		add(p,i,Available);		
	}
}

//对进程按照结束时间进行排序 
void sort(PCB *p){
	PCB temp;
	for(int i=0;i<4;i++)
	for(int j=i;j<5;j++){
		if(p[i].finish>p[j].finish){
			temp=p[i];
			p[i]=p[j];
			p[j]=temp;
		}
	}
}

//对结果进行输出,若无死锁,按照资源先后顺序输出 
void print(PCB *p){
    int temp=0;
    for(int i=0;i<5;i++)
	if(p[i].finish==0)
	temp=1;
	if(temp==0){
		sort(p);
		printf("\n安全序列为:\n"); 
		for(int i=0;i<5;i++)
		printf("%3s",p[i].name);
		printf("\n");
		printf("\n安全序列矩阵为:\n");
		printf(" 进程     work          Need      Allocation   Work+Allocation\n");
	for(int i=0;i<5;i++){
		printf("%4s%4d%4d%4d%6d%4d%4d%6d%4d%4d%6d%4d%4d\n",p[i].name,p[i].work[0],p[i].work[1],p[i].work[2],\
p[i].Need[0],p[i].Need[1],p[i].Need[2],p[i].Allocation[0],p[i].Allocation[1],p[i].Allocation[2],p[i].wAllocation[0],p[i].wAllocation[1],p[i].wAllocation[2]);
	}	
	}
	else if(temp==1)
	printf("出现死锁!\n"); 
}

//将所有进程和系统进行比较 
void Fin(PCB *p,int *Available){
	int k=0;
	//for(int k=0;k<5;k++){
	while(k<5){
	for(int i=0;i<5;i++)
		if(p[i].finish==0){
		start(p,Available);
		 break;
        }
    k++;
    }
    print(p);
}

//输入资源初始状态
void input(PCB *p,int *Available){
	printf("进程名  MAX      Allocation    Need\n"); 
FILE *r=fopen("2-1.txt","r");
for(int i=0;i<5;i++){ 
fscanf(r,"%4s%3d%3d%3d%3d%3d%3d%3d%3d%3d\n",p[i].name,&p[i].Max[0],&p[i].Max[1],&p[i].Max[2],\
&p[i].Allocation[0],&p[i].Allocation[1],&p[i].Allocation[2],&p[i].Need[0],&p[i].Need[1],&p[i].Need[2]);

printf("%4s%3d%3d%3d%6d%3d%3d%6d%3d%3d\n",p[i].name,p[i].Max[0],p[i].Max[1],p[i].Max[2],\
p[i].Allocation[0],p[i].Allocation[1],p[i].Allocation[2],p[i].Need[0],p[i].Need[1],p[i].Need[2]);

} 
fclose(r);	
for(int i=0;i<5;i++){
	p[i].label=0;
	p[i].finish=0;
}
	printf("\nAvailable:");
	for(int i=0;i<3;i++)
	printf("%3d",Available[i]);
	printf("\n"); 
} 

//发出请求信号的初始化 
void Request(PCB *q,int *nAvailable){
	int pp;
	int request[3];
	printf("输出需要请求的资源:\n");
	scanf("%d",&pp);
	printf("输入request:\n");
	for(int i=0;i<3;i++)
	scanf("%d",&request[i]); 
	if(q[pp].Need[0]>=request[0]&&q[pp].Need[1]>=request[1]&&q[pp].Need[2]>=request[2]){
			for(int i=0;i<3;i++){
				nAvailable[i]=nAvailable[i]-request[i];
				q[pp].Allocation[i]=q[pp].Allocation[i]+request[i];
				q[pp].Need[i]=q[pp].Need[i]-request[i];
			}			
			Fin(q,nAvailable);
	}
else printf("ERROR!");	
}

//主函数 
int main(){
	PCB p[5];
	PCB q[5];
	int Available[3]={3,3,2};
	int nAvailable[3];
	input(p,Available);
	for(int i=0;i<5;i++)
	q[i]=p[i];
	for(int i=0;i<3;i++)
	nAvailable[i]=Available[i];
	Fin(p,Available);
	Request(q,nAvailable);
} 

在这里插入图片描述
在这里插入图片描述

随机算法代码:

#include<stdio.h>

//定义一个结构体 
struct PCB{
	char name[10];
	int Max[3];
	int Allocation[3];
	int Need[3];
	int label;
	int finish;
	int work[3]; 
	int wAllocation[3];
};

int ss=1;
//判断进程是否满足系统需求 
void Ready(PCB *p,int x,int *Available){
	if(Available[0]-p[x].Need[0]>=0&&Available[1]-p[x].Need[1]>=0&&Available[2]-p[x].Need[2]>=0)
	p[x].label=0;
	else p[x].label=1;
}

//进程完成后资源释放 
void add(PCB *p,int x,int *Available){
	for(int i=0;i<3;i++){
		p[x].work[i]=Available[i];
		Available[i]+=p[x].Allocation[i];
		p[x].wAllocation[i]=Available[i];
		p[x].finish=ss++;
	}
}

//对所有进程进行判断和资源处理 
void start(PCB *p,int *Available){
	for(int i=0;i<5;i++){
		Ready(p,i,Available);
		if(p[i].label==0&&p[i].finish==0)
		add(p,i,Available);		
	}
}

//对进程按照结束时间进行排序 
void sort(PCB *p){
	PCB temp;
	for(int i=0;i<4;i++)
	for(int j=i;j<5;j++){
		if(p[i].finish>p[j].finish){
			temp=p[i];
			p[i]=p[j];
			p[j]=temp;
		}
	}
}

//对结果进行输出,若无死锁,按照资源先后顺序输出 
void print(PCB *p){
    int temp=0;
    for(int i=0;i<5;i++)
	if(p[i].finish==0)
	temp=1;
	if(temp==0){
		sort(p);
		printf("\n安全序列为:\n"); 
		for(int i=0;i<5;i++)
		printf("%3s",p[i].name);
		printf("\n");	
	}
	else if(temp==1){
	printf("出现死锁!\n"); 
	printf("已完成进程为:\n");
	for(int i=0;i<5;i++)
	if(p[i].finish!=0)
	printf("%3s",p[i].name);
}
}

//将所有进程和系统进行比较 
void Fin(PCB *p,int *Available){
	int k=0;
	//for(int k=0;k<5;k++){
	while(k<5){
	for(int i=0;i<5;i++)
		if(p[i].finish==0){
		start(p,Available);
		 break;
        }
    k++;
    }
    print(p);
}

//输入资源初始状态
void input(PCB *p,int *Available){
	printf("进程名  MAX      Allocation    Need\n"); 
FILE *r=fopen("2-1.txt","r");
for(int i=0;i<5;i++){ 
fscanf(r,"%4s%3d%3d%3d%3d%3d%3d%3d%3d%3d\n",p[i].name,&p[i].Max[0],&p[i].Max[1],&p[i].Max[2],\
&p[i].Allocation[0],&p[i].Allocation[1],&p[i].Allocation[2],&p[i].Need[0],&p[i].Need[1],&p[i].Need[2]);

printf("%4s%3d%3d%3d%6d%3d%3d%6d%3d%3d\n",p[i].name,p[i].Max[0],p[i].Max[1],p[i].Max[2],\
p[i].Allocation[0],p[i].Allocation[1],p[i].Allocation[2],p[i].Need[0],p[i].Need[1],p[i].Need[2]);

} 
fclose(r);	
for(int i=0;i<5;i++){
	p[i].label=0;
	p[i].finish=0;
}
	printf("\nAvailable:");
	for(int i=0;i<3;i++)
	printf("%3d",Available[i]);
	printf("\n"); 
} 

//主函数 
int main(){
	PCB p[5];
	int Available[3]={0,1,1};
	input(p,Available);
	Fin(p,Available);
} 

代码当中初始化内容中读入文件内容如下:
在这里插入图片描述
实验结果如下:
在这里插入图片描述

  • 0
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值