操作系统:避免死锁的银行家算法及安全性算法/C++

(全部代码在最后)

需要定义的全局变量:

int Max[10][10];   //总共需要资源 
int alloc[10][10];  //已分配资源 
int need[10][10];  //现需要资源 
int avail[10];    //系统可用资源量 
bool finish[10];  //finish向量 
int work[10];   //work向量 
int reque[10][10];  //需求矩阵 
int a,b;   //a是进程数,b是资源种类数 
int tem[10]; //暂存向量 
int agree;  //存放完成的进程数 
bool one=true;   //初始work判断 
vector<int> list1; //存放安全队列 

 需要的函数:

//声明 
void init(int a,int b);  //初始化 
void banker(int j,int z);  //银行家算法 
int securityassess(int alloc1[][10],int need1[][10],int avail[10]);   //安全评估
void clear1(); //评估finish 

主函数:

int main(int argc, char** argv) 
{
    
    cout<<"请输入进程数和资源数:";
     
	cin>>a>>b;
	
	init(a,b);
	banker(a,b);
	return 0;
}

 1、初始化(利用void init(int a,int b);函数)

        1)首先在主函数中输入进程数a和资源数b。

        2)然后调用init( a , b) 函数进行初始化资源总量、Max[i][j]、Available[i]、Allocation[i][j]、Need[i][j]矩阵以及让Finish[i]向量组全为False。{注:均为全局变量}

        3)在 init( a , b) 函数里调用securityassess( alloc , need , avail )函数 { 注:3、中讲解该安全性函数 ;现知存在安全序列该函数返回1,不存在返回0即可}  进行安全性判断 , 若不存在安全性序列则返回 2),否则结束初始化。

void init(int a,int b)       //初始化 
{
	int i,l;
	while(1){
	cout<<"依次输入每个资源的数量:";  
	for(i=1;i<=b;i++)
	{
		cin>>avail[i]; 
	}
	cout<<"依次输入"<<a<<"个进程的最大需求:" <<endl;  //max矩阵 
	for(i=1;i<=a;i++)
	{
		for(l=1;l<=b;l++)
		{
			cin>>Max[i][l];
		}
	}
	cout<<"依次输入"<<a<<"个进程已分配给的数量:" <<endl; //分配矩阵 
	for(i=1;i<=a;i++)
	{
		for(l=1;l<=b;l++)
		{
			cin>>alloc[i][l];
		}
	}
	cout<<"需求矩阵为:" <<endl;
	for(i=1;i<=a;i++)
	{                       //需求矩阵 
		for(l=1;l<=b;l++)
		{
			need[i][l]=Max[i][l]-alloc[i][l];
			cout<<need[i][l]<<" ";
		}
		cout<<endl;
	}
	 
	for(i=1;i<=a;i++)
	{                         //初始 Finish 向量 
	   finish[i]=false;
	}
	
    //以下初始 可用资源 	                      
	for(i=1;i<=b;i++)  //资源数 
	{           
		for(l=1;l<=a;l++)  //进程数 
		{       
			tem[i]+=alloc[l][i]; 
		}
	}
	cout<<"可用资源为:"<<endl;
	for(l=1;l<=b;l++)
	{ 
	  avail[l]=avail[l]-tem[l];
	  cout<<avail[l]<<" ";
	}
	cout<<endl;
	cout<<"----------以上为初始数据------------"<<endl;
	cout<<endl;	
	
	if(!securityassess(alloc,need,avail))  //不安全则退回原值资源 
	  {
		cout<<"初始化不安全!!,请重新分配"<<endl;
		list1.clear();  //清空安全队列 
	    clear1();   //清空安全判定对finish的影响 
	    one=true;
		continue; 
	  }
	else
	 {
	 	cout<<endl;
	 	cout<<"初始化安全!!"<<endl;
	 	list1.clear();  //清空安全队列 
	    clear1();   //清空安全判定对finish的影响 
	    break;
     }
	  
    }
    
	cout<<"------------下面进行请求分析-----------"<<endl;	
}

2、调用void banker(int a ,int b )函数实现进程发出请求和银行家算法:

        1)输入发出请求的进程p,以及该进程的请求向量Request[ p ] [ j ],

首先进行合法性判断; 若{ Request [p][j]> need[p][j]  or  Request [p][j]> available[j] }则重复1),否则进行下一步。

void banker(int j,int z)
{ 
    
    int i,l,p,ju;  //p为发出请求的进程 
	int T=0,n1=0,n2=0,temneed[10][10],temalloc[10][10],temavail[10];
    while(1)
    {
      one=true;
      cout<<endl; 
	  cout<<"T"<<T<<"时刻请求进程为:";
	  T++;
	  cin>>p;
	  cout<<"进程"<<p<<"的请求为:";
	  for(i=1;i<=z;i++)       //进程某时刻 请求 
	  {
		cin>>reque[p][i];
	  }
	  //请求合法判断 
	  for(i=1;i<=z;i++)     
	  {
		if(reque[p][i]>need[p][i])
		   n1=1;
		if(reque[p][i]>avail[i])
		   n2=1;
	   }
	  if(n1)
	  {
		cout<<"出错!请求超出需求资源"<<endl;
		n1=0;
		n2=0;
		continue;
	  }
      if(n2)
	  {
		cout<<"出错!请求超出可用资源:"<<endl;
		cout<<"__________________________"<<endl;
		cout<<"|请求资源:              |"<<endl;
		cout<<"|"; 
		for(i=1;i<=z;i+
  • 9
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值