操作系统银行家算法

一、实验目的:
通过对银行家算法的模拟加深对避免死锁的理解,掌握银行家算法和安全性测试算法;
二、实验内容:
系统中有m个同类资源,被n个进程共享,每个进程对资源的最大需求数分别为S1、S2、…、Sn,且Max(Si)<=m(i=1,2,…,n)。进程可以动态地申请资源和释放资源。编写一个程序,实现银行家算法模拟分配资源以及进行安全性检测。当系统将资源分配给某一进程而不会死锁时,就分配之。否则,推迟分配,并显示适当信息。
三、程序分析与设计:
1、算法思想和算法流程设计
系统在进行资源分配之前,应先计算此次资源分配的安全性,若此次分配不会导致系统进入不安全状态,才可将资源分配给进程,否则另进程等待。
在这里插入图片描述
四、源程序

#include <cstdlib>
#include <iostream>
using namespace std;
#define M 3  //M个资源 
#define N 5  //N个进程 

/**定义初始化数组 **/ 
int Available[M],//可利用资源向量 
    Max[N][M],//最大需求矩阵 定义了每一个进程对M类资源的最大需求 
    Allocation[N][M],//分配矩阵   定义了每一类资源当前已分配给每一进程的资源数 
    Need[N][M],//需求矩阵   表示每一个进程尚需的资源数 
    Request[M];//进程请求向量
	 
int ucjc;//用户选择的进程号
void sfp(int n);//进行试分配 
void Print();  //用于打印输出表格的函数
void tryfenpei(int i);//试分配函数
void refenpei(int i);//恢复数据函数
void safecheck(int s);//安全检测函数

/**
用户自定义进程
**/ 
void csf()
{
	int*p;
	p=(int*)malloc(M*sizeof(int));
	cout<<"请输入系统中现有资源个数,长度为3:"<<endl;
	int flag=1;
	while(flag){
		for(int i=0;i<M;i++)//用户自定义初始化Available[]可利用资源向量
		{
			cin>>Available[i];
		}
		flag=0;
		for(int j=0; j<M;j++){
			if(Available[j]<0)  {
		cout<<"**********输入的数字无效,请重新输入***********"<<endl;
		flag=1;
		break;	}
			}
		}

   for(int i=0;i<3;i++)
   {
     for(int j=0;j<N;j++)//N个进程 
		 {  
		 		if(i==0){//初始化最大需求矩阵 Max[][]
					int flag=1;
					while(flag){
						cout<<"请输入进程"<<j<<"需要的最大资源数,长度为3:";
						for(int m=0;m<M;m++)	
							{cin>>Max[j][m];}
						flag=0;
						for(int m=0;m<M;m++){
							if(Max[j][m]<0){
								cout<<"*********输入的数字无效,请重新输入*********"<<endl;
								flag=1;	break;
						    }	
						}				
					}
				}
				if(i==1){//初始化分配矩阵 Allocation[][]
							int flag=1;
							while(flag){
								cout<<"请输入进程"<<j<<"当前已分配的资源数,长度为3:";
								for(int m=0;m<M;m++)	
									{cin>>Allocation[j][m];}
								flag=0;
								for(int m=0;m<M;m++){
									if(Allocation[j][m]<0){
										cout<<"*********输入的数字无效,请重新输入*********"<<endl;
										flag=1;	break;
								    }	
								}				
							}
						}
                 if(i==2)//需求矩阵Need[][] 
                 	{
					 for(int m=0;m<M;m++)
                   		Need[j][m]= Max[j][m]-Allocation[j][m]; 
					}
           }
     } 
 }
/**
系统尝试分配资源 
	Available[M]可利用资源向量 
    Allocation[N][M]分配矩阵 
    Need[N][M]需求矩阵 
    Request[M]进程请求向量
**/ 
void sfp(int n)
  {
    for(int i=0;i<M;i++)
      {
         Available[i]=Available[i]-Request[i];
         Allocation[n][i]=Allocation[n][i]+Request[i];
         Need[n][i]=Need[n][i]-Request[i];
            }         
    } 
 /**
 安全检测 
 	work[]工作向量,表示系统可提供给进程继续运行所需的各类资源数目 
 	finish[] 表示系统是否有足够的资源分配给进程 
 **/  
int safecheck()
{
     int work[M],Finish[N],flag=1;
     for(int i=0;i<M;i++)
        work[i]=Available[i];
     for(int i=0;i<N;i++)
        Finish[i]=false;
     int a[N];
     for(int i=0;i<N;i++){  
         static int m=0,ci;
         for( ci=0;ci<N;ci++)
         //当进程获得资源后,可顺利执行直至完成,并释放出分配给它的资源 
        	if(Finish[ci]==false&&Need[ci][0]<=work[0]&&Need[ci][1]<=work[1]&&Need[ci][2]<=work[2]){ 
        	       for(int j=0;j<M;j++)
              	   work[j]=Allocation[ci][j]+work[j];
                   Finish[ci]=true;    
                   a[m++]=ci;
                    }                                                                       
      } 
      int i;
      for( i=0;i<N;i++) 
		 //如果所有进程的finish[]=true都满足,则表示系统处于安全状态,否则处于不安全状态  
          if(Finish[i]!=true) {  cout<<"*****系统不安全! 本次资源申请不成功!*****"<<endl; return 0;break;}
             if(i==N){
               Print();
               cout<<"得到安全序列:"; 
               for(int i=0;i<N;i++)
	                 if (i<N-1) cout<<"p"<<a[i]<<"->";
	                 else cout<<"p"<<a[i]<<endl;\
	                 return 1;
                }
     
}
/**
恢复数据函数
执行安全性算法,发现此次资源分配后系统处于不安全状态
将本次试探作废,恢复成原来的资源分配状态 
**/
void refenpei(int i)
{
 for(int f=0;f<M;f++)
 {
     Available[f] = Available[f] + Request[f];
     Allocation[i][f] = Allocation[i][f] - Request[f];
     Need[i][f] = Need[i][f]+Request[f];
  }
}

void Print()
{
 int i,j;
 cout<<" 进程个数 : "<<N<<"  资源个数: "<<M<<endl;
 cout<<endl;
 cout<<"|*****|***********|***********|**********|***********|"<<endl;
 cout<<"|****|最大需求矩阵|已分配矩阵-|-需求矩阵-可用资源向量|"<<endl;
 cout<<"| 资源|   Max    | Allocation |    Need  | Available |"<<endl;
 cout<<"|     | A  B  C  |  A  B  C   |  A  B  C |   A  B  C |"<<endl;
 cout<<"|进程 |          |            |          |           |"<<endl;
 cout<<"|*****|**********|************|**********|***********|"<<endl;
 for(i=0;i<5;i++){
	  cout<<"|  p"<<i<<" | ";
	  for(j=0;j<3;j++)
	  {
		   cout<<Max[i][j]<<"  ";
	  }
	  cout<<"|";
	  for(j=0;j<3;j++) 
	  {
		   cout<<"  "<<Allocation[i][j];
	  }
	  cout<<"   |";
	  for(j=0;j<3;j++)
	  {
		   cout<<"  "<<Need[i][j];
	  }
	  cout<<" |";
	  if(i==0)
	  {
		   for(j=0;j<3;j++)
		   {
			    cout<<"  "<<Available[j];
		   }
		   cout<<"  |";
	  }
	  if(i>0)
	  {
		   cout<<"           |";
	  }
	  cout<<endl;
	 }
	cout<<"|*****|**********|************|**********|***********|"<<endl;     
}


int main(int argc, char *argv[])
{   
    char log;
    int flag=1;
    int work[M];
    int finish[N];
    int i;
    cout<<"********准备输入初始化数据资源 *******"<<endl;
    csf();  
    cout<<"***********初始化数据资源完成*************"<<endl;
    cout<<"***********检测当前系统资源是否安全***********"<<endl;
    
     for(int i=0;i<M;i++)
	      work[i]=Available[i];
     for(int i=0;i<N;i++)
	      finish[i]=false;
     int a[N];
     for(int i=0;i<N;i++)
       {  
	     static int m=0,ci;
	     for( ci=0;ci<N;ci++)
	     if(finish[ci]==false&&Need[ci][0]<=work[0]&&Need[ci][1]<=work[1]&&Need[ci][2]<=work[2])
	          { 
	          for(int j=0;j<M;j++)
	                work[j]=Allocation[ci][j]+work[j];
	          finish[ci]=true;    
	          a[m++]=ci;
	                      }                                                                       
         } 
         
         for( i=0;i<N;i++)  
            if(finish[i]!=true) {  cout<<"*****系统不安全! 本次资源申请不成功!*****"<<endl;break;}
             if(i==N)
             {
               Print();
               cout<<"得到安全序列:"; 
               for(int i=0;i<N;i++)
	                 if (i<N-1) cout<<"p"<<a[i]<<"->";
	                 else cout<<"p"<<a[i]<<endl;
                }
    


    cout<<"***********请输入发起请求的进程号P[0-4]*********"<<endl;
          while(cin>>ucjc)   
           {
               if(ucjc>4||ucjc<0) 
               cout<<"*********请求的进程号无效,请重新输入!"<<endl;
               else break;            
             }
          cout<<"您输入的进程为P["<<ucjc<<"]进程"<<endl;
          cout<<"P["<<ucjc<<"]"<<"的需求量为:";
          for(int i=0;i<M;i++)
          cout<<Need[ucjc][i]<<" ";
          cout<<endl;
          cout<<"输入请求资源向量:";
          for(int i=0;i<M;i++)
          { while(cin>>Request[i])   
            {
                if(Request[i]<0) 
  cout<<"*********输入的数字无效,请重新输入!"<<endl;
    else  if(Request[i]>Need[ucjc][i]) cout<<"错误!超出进程需求量"<<endl; 
       else if(Request[i]>Available[i]) cout<<"错误!系统还没有足够的可用资源量满足进程需要"<<endl;
                            else   break;            
            } 
            }
    cout<<"输入成功,您输入的是:"<<Request[0]<<"  "<<Request[1]<<"  "<<Request[2]<<endl;
    cout<<"开始执行银行家算法,下面进行试分配"<<endl;
    sfp(ucjc);//进行试分配 
    cout<<"**********试分配完成!**********"<<endl;
    cout<<"**********进行安全性检测!**********"<<endl;
    if(!safecheck()){
	refenpei(ucjc);
    cout<<"***** 恢复数据,恢复后的状态为:*****"<<endl;
    Print(); 
	}; 
    system("PAUSE");
    return EXIT_SUCCESS;
}
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设计一个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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值