银行家算法课程设计(附源代码)

死锁会引起计算机工作僵死,因此操作系统中必须防止。本实验提供了一个系统动态分配资源的简单模拟程序,用于了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生。

一、实验要求

设计有n个进程共享m个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。
系统能显示各个进程申请和释放资源,以及系统动态分配资源的过程,便于用户观察和分析;

二、银行家算法

Request i 是进程Pi 的请求向量。Request i(j)=k表示进程Pi请求分配Rj类资源k个。当Pi发出资源请求后,系统按下述步骤进行检查:
1.如果Request i≤Need,则转向步骤2;否则,认为出错,因为它所请求的资源数已超过它当前的最大需求量。
2.如果Request i≤Available,则转向步骤3;否则,表示系统中尚无足够的资源满足Pi的申请,Pi必须等待。
3.系统试探性地把资源分配给进程Pi,并修改下面数据结构中的数值:
Available = Available - Request i
Allocation i= Allocation i+ Request i
Need i= Need i - Request i
4.系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。如果安全才正式将资源分配给进程Pi,以完成本次分配;否则,将试探分配作废,恢复原来的资源分配状态,让进程Pi等待。

三、安全性算法

1.设置两个向量。
Work:它表示系统可提供给进程继续运行的各类资源数目,它包含m个元素,开始执行安全性算法时,Work = Available。
Finish:它表示系统是否有足够的资源分配给进程,使之运行完成,开始Finish(i)=false;当有足够资源分配给进程Pi时,令Finish(i)=true;
2.从进程集合中找到一个能满足下述条件的进程。
Finish(i)= = false;
Need i ≤work;
如找到则执行步骤3;否则,执行步骤4;
3.当进程Pi获得资源后,可顺利执行直到完成,并释放出分配给它的资源,故应执行
Work = work + Allocation i
Finish(i)=true;转向步骤2;
4.若所有进程的Finish(i)都为true,则表示系统处于安全状态;否则,系统处于不安全状态。
假定系统有5个进程(p0,p1,p2,p3,p4)和三类资源(A,B,C),各种资源的数量分别为10,5,7,在T0时刻的资源分配情况如下图:
在这里插入图片描述

四、问题

1.T0时刻系统是否安全?如果安全,给出安全序列。
安全。安全序列为:

Max          Allocation             Need          Work+Allocation
A  B  C         A  B  C            A  B  C       	A  B  C
P0   7  5  3          0  1  0             7  4  3        	5  3  2
P1   3  2  2          2  0  0             1  2  2           7  4  3
P2   9  0  2          3  0  2             6  0  0           7  4  5
P3   2  2  2          2  1  1             0  1  1          10  4  7P4   4  3  3          0  0  2             4  3  1          10  5  7

2.如果某时刻T1,P1请求资源:Request1(1,0,2),系统是否分配?为什么?
分配。因为Request1(1,0,2)≤Need1(1,2,2),而且Request1(1,0,2)≤Available(3,3,2)
安全序列为{P1,P3,P4,P2,P0}

3.P1请求处理完毕后,如果某时刻T2, P4请求资源: Request4(3,3,0),系统是否分配?为什么?
不分配。因为 Request4(3,3,0)≤Need4(4,3,1); Request4(3,3,0)>Available(2,3,0),让P4等待。

4.打开“Microsoft Visual C++ 6.0”,输入相关代码,同时在源程序同一目录下新建“input1.txt”文件,根据代码要求,正确输入T0时刻的系统状态,并对程序行进编译运行。根据提示将前述的三个问题的相关数据依次输入,然后运行:

input1.text的内容如下:
在这里插入图片描述
运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5.输出的结果与你所写的一致否?如果不一致,理解之后,修改你的结果,给出“input1.txt”的内容。 一致。



#include<stdio.h>
#include<conio.h>   
#include<iostream>   
using namespace std;
typedef struct Max{
	int m_a;
	int m_b;
	int m_c;
}Max;
typedef struct Allocation{
	int a_a;
	int a_b;
	int a_c;
}Allocation;
typedef struct Need{
	int n_a;
	int n_b;
	int n_c;
}Need;
struct Available{
	int av_a;
	int av_b;
	int av_c;
}q;
struct pr{
	char name;
	Max max;
	Allocation allocation;
	Need need;
	int finishflag;
}p[5];
char na[5];
void init(){  
	cout<<"各进程还需要的资源数NEED: "<<endl;
	FILE *fp;
	fp=fopen("input1.txt","r+");
	for(int i=0; i<5;i++){
		fscanf(fp,"%c %d %d %d %d %d %d\n",&p[i].name,&p[i].max.m_a,&p[i].max.m_b,&p[i].max.m_c,&p[i].allocation.a_a,&p[i].allocation.a_b,&p[i].allocation.a_c);
		p[i].need.n_a=p[i].max.m_a-p[i].allocation.a_a;   
		p[i].need.n_b=p[i].max.m_b-p[i].allocation.a_b;  
		p[i].need.n_c=p[i].max.m_c-p[i].allocation.a_c;
		cout<<p[i].name<<": "<<p[i].need.n_a<<" "<<p[i].need.n_b<<" "<<p[i].need.n_c<<endl;
	}
	fclose(fp);  
}

int fenpei(){
	cout<<"Available: ";
	cout<<q.av_a<<" "<<q.av_b<<" "<<q.av_c<<endl;
	int finishcnt=0, k=0,count=0;   
	for(int j=0; j<5;j++){
		p[j].finishflag=0;
	}   
	while(finishcnt<5){
		for(int i=0; i<5; i++){
			if(p[i].finishflag==0&&q.av_a>=p[i].need.n_a&&q.av_b>=p[i].need.n_b&&q.av_c>=p[i].need.n_c){
				 q.av_a+=p[i].allocation.a_a;   
				 q.av_b+=p[i].allocation.a_b;   
				 q.av_c+=p[i].allocation.a_c;
				 p[i].finishflag=1;
				 finishcnt++;
				 na[k++]=p[i].name;
				 break;
			}
		}
		count++;   
		if(count>5){		
			return 0;
		}
	}
	return 1;
}

int shq(){
	int m=0,i=0,j=0,k=0;  
	cout<<"请输入进程号和请求资源的数目!"<<endl;
	cout<<"如:进程号 资源A B C"<<endl;
	cout<<"  0  202"<<endl;
	cin>>m>>i>>j>>k;
	if(i<=p[m].need.n_a&&j<=p[m].need.n_b&&k<=p[m].need.n_c){
		if(i<=q.av_a&&j<=q.av_b&&k<=q.av_c){
			p[m].allocation.a_a+=i;
			p[m].allocation.a_b+=j;
			p[m].allocation.a_c+=k;
			p[m].need.n_a=p[m].max.m_a-p[m].allocation.a_a;  
			p[m].need.n_b=p[m].max.m_b-p[m].allocation.a_b;  
			p[m].need.n_c=p[m].max.m_c-p[m].allocation.a_c;  
			cout<<"各进程还需要的资源数NEED:"<<'\n';   
			for(int w=0;w<5;w++){
				cout<<p[w].name<<": "<<p[w].need.n_a<<" "<<p[w].need.n_b<<" "<<p[w].need.n_c<<endl;
			}
			return 1;
		}
		else{
			cout<<"Request>Available让进程"<<m<<"等待......"<<endl;
		}
	}
	else{	
		cout<<"Request>Available让进程"<<m<<"等待......"<<endl;
	}
	return 0;
}
 void main(){
	int flag;
	char c;
	cout<<"               /********* 银 行 家 算 法 *********/ "<<endl;
	cout<<"确认已经在\"input1.txt\"文档中正确输入各进程的有关信息后按回车键"<<endl;
	getch();
	init();
	q.av_a=10;  
	q.av_b=5;
	q.av_c=7;
	while(flag){
		for(int i=0; i<5;i++){
			q.av_a-=p[i].allocation.a_a;
			q.av_b-=p[i].allocation.a_b;
			q.av_c-=p[i].allocation.a_c;
		}
		if(fenpei()){
			cout<<"这样配置资源是安全的!"<<endl;
			cout<<"其安全序列是:";
			for(int k=0;k<5;k++){
				cout<<"->"<<na[k];
			}
			cout<<endl;
			cout<<"有进程发出 Request请求向量吗?(Enter y or Y)"<<endl;
			cout<<endl;
			c=getch();
			if(c=='y'||c=='Y'){
				if(shq())
					continue;
				else
					break;
			}
			else
				flag=0;
		}
		else{
			flag=0;
			cout<<"不安全!!"<<endl;
		}
	}
} 

思古之圣贤,与我同为丈夫,彼何以百世可师,我何以一身瓦裂。

  • 25
    点赞
  • 212
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
设计一个n个并发进程共享m个系统资源的程序以实现银行家算法。要求: 1) 简单的选择界面; 2) 能显示当前系统资源的占用和剩余情况。 3) 为进程分配资源,如果进程要求的资源大于系统剩余的资源,不与分配并且提示分配不成功; 4) 撤销作业,释放资源。 编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁的发生。 银行家算法分配资源的原则是:系统掌握每个进程对资源的最大需求量,当进程要求申请资源时,系统就测试该进程尚需资源的最大量,如果系统中现存的资源数大于或等于该进程尚需求资源最大量时,就满足进程的当前申请。这样就可以保证至少有一个进程可能得到全部资源而执行到结束,然后归还它所占有的全部资源供其它进程使用。 银行家算法中的数据结构 (1)可利用资源向量Available(一维数组) 是一个含有m个元素,其中的每一个元素代表一类可利用的资源数目,其初值是系统中所配置的该类全部可用资源数目。如果Available[j]=k, 表示系统中现有Rj类资源k个。 (2)最大需求矩阵Max(二维数组) m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max(i,j)=k, 表示进程i需要Rj类资源的最大数目为k。 (3)分配矩阵Allocation(二维数组) m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation(i,j)=k, 表示进程i当前已分得Rj类资源k个。 (4)需求矩阵Need (二维数组) 是一个含有n*m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need(i,j)=k, 表示进程i还需要Rj类资源k个,方能完成其任务。 Need(i,j)= Max(i,j)-Allocation(i,j)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

振华OPPO

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值