操作系统c实现银行家算法

#include<cstdio>
#include<cstring>
using namespace std;
#define MAX_PROCESS 100
#define MAX_RESOURCE 100
int Available[MAX_RESOURCE];                    //可用资源数组  
int Max[MAX_PROCESS][MAX_RESOURCE];            //最大需求矩阵  
int Allocation[MAX_PROCESS][MAX_RESOURCE];    //分配矩阵 
int Need[MAX_PROCESS][MAX_RESOURCE];     //需求矩阵  
int Request[MAX_PROCESS][MAX_RESOURCE];        //进程需要资源数 
int p[MAX_PROCESS];                             //记录序列
int n,m;                                    //n个进程,m个资源  
void Init()                //初始化算法  
{  
    int i,j;  
    printf("请输入进程的数目:\n");
	scanf("%d",&n); 
	printf("请输入资源的种类:\n"); 
    scanf("%d",&m);
    printf("请输入每个进程最多所需的各资源数,按照%dx%d矩阵从左到右、从上到下输入:\n",n,m);  
    for(i=0;i<n;i++)
    {
    	for(j=0;j<m;j++)
    	{
    		scanf("%d",&Max[i][j]);
		}
    }
    printf("请输入每个进程已分配的各资源数,也按照%dx%d矩阵从左到右、从上到下输入:\n",n,m);  
    for(i=0;i<n;i++)  
    {  
        for(j=0;j<m;j++)  
        {  
            scanf("%d",&Allocation[i][j]); 
            Need[i][j]=Max[i][j]-Allocation[i][j]; 
	 		if(Need[i][j]<0)  
            {  
                printf("您输入的第%d个进程所拥有的第%d个资源数错误,请重新输入:\n",i+1,j+1);  
                j--;  
                continue;  
            }  
        }  
    }  
    printf("请输入各个资源现有的数目:\n");  
    for(i=0;i<m;i++)  
    {  
      	scanf("%d",&Available[i]);
    } 	 
}  
bool Safe()    //安全性算法
{  
    int i,j,k,l=0;  
    int Work[MAX_RESOURCE]; //工作数组,他表示系统可提供给进程继续运行所需的各类资源数目  
    int Finish[MAX_PROCESS];  //系统是否有足够的资源分配给进程,使之运行完成 
    for(i=0;i<m;i++)   //工作数组初始化 
	{
		Work[i]=Available[i];
	}  
    //Finish每个进程是否安全
 
    memset(Finish,0,sizeof(Finish)); 
    for(i=0;i<n;i++)  
    {    
       if(Finish[i]) continue;
		for(j=0;j<m;j++)//循环查找第i个进程需要的各个资源数是否超过系统现有的对应的资源数  
		{
			//第i个进程需要的第j个资源数 > 系统现有的第j个资源数 
			if(Need[i][j]>Work[j]) break;
		}
		if(j==m)//如果第i个进程所需的各个资源数都没有超过系统现有的对应资源数  
        {   
        	Finish[i]=1;//给该进程的FINISH标记为true  
        	for(k=0;k<m;k++)  
        	{  
       	    	Work[k]+=Allocation[i][k];//将Work赋值为 第i个进程各个已分配资源数+系统现有的对应资源数(因为当改进程全部资源数都满足时线程结束并将资源返还给系统)  
        	}  
        	p[l++]=i;//记录进程号  
        	i=-1; 
    	}
    	else continue; //如果超过继续循环下一个进程 
        if(l==n)//当所有进程都能够被满足运行时  
        {  
            printf("系统是安全的\n");
            printf("安全序列为:\n");  
            for(k=0;k<l-1;k++) 
            {  
                printf("%d-->",p[k]);   
            }  
            printf("%d\n",p[l-1]);           
            return true;  
        }  
    }
    printf("系统是不安全的\n");  
    return false;  
}  

void Bank()                //银行家算法  
{  
    int i,num;  
    while(1)
    {
		printf("请输入要申请资源的进程号(注:第1个进程号为0,依次类推)");  
	    scanf("%d",&num);
        printf("请输入进程所请求的各资源的数量:\n");  
        for(i=0;i<m;i++)  
        {  
            scanf("%d",&Request[num][i]); 
            if(Request[num][i]>Need[num][i])//如果用户选择的线程的第i个资源请求数>该线程该资源所需的数量  
            {  
                printf("您输入的请求数超过该进程对该资源的需求量!请重新输入!");
                i--;
                continue;
            }  
            if(Request[num][i]>Available[i])//如果用户选择的线程的第i个资源请求数>系统现有的第i个资源的数量  
            {  
                printf("您输入的请求数超过系统拥有该资源的数目!请重新输入!");  
                i--;
                continue;  
            }  
            //如果请求合理,接着执行
            Available[i]-=Request[num][i];//系统可用资源减去申请了的  
            Allocation[num][i]+=Request[num][i];//线程被分配的资源加上已申请了的  
            Need[num][i]-=Request[num][i];//线程还需要的资源减去已申请得到的  
        }
       if(Safe())//AVAILABLE  ALLOCATION  NEED变动之后,是否会导致不安全  
        { 
        	printf("同意分配请求!\n");
        }    
        else  
       	{  
       		printf("您的请求被拒绝!\n");  
        	for(i=0;i<m;i++)  
           	{  
            	Available[i]+=Request[num][i];  
            	Allocation[num][i]-=Request[num][i];  
               	Need[num][i]+=Request[num][i];  
           	}  
       	}   
    }
}  
int main()
{
	Init();
	Bank(); 
	return 0;
}

    原文作者:银行家问题
    原文地址: https://blog.csdn.net/moonlululu/article/details/51386974
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞