c语言实现银行家算法

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
# define m 50
 
int no1;  //进程数
int no2;  //资源数
int r;
int allocation[m][m],need[m][m],available[m],max[m][m]; 
char name1[m],name2[m];                               //定义全局变量
void main()
{
	void check();
	void print();
	int i,j,p=0,q=0;
	char c;
	int request[m],allocation1[m][m],need1[m][m],available1[m];
	printf("**********************************************\n");
	printf("*           银行家算法的设计与实现           *\n");
    printf("**********************************************\n");
	printf("请输入进程总数:\n");
	scanf("%d",&no1);
	printf("请输入资源种类数:\n");
	scanf("%d",&no2);
    printf("请输入Max矩阵:\n");
	for(i=0;i<no1;i++)
		for(j=0;j<no2;j++)
			scanf("%d",&max[i][j]);   //输入已知进程最大资源需求量

	printf("请输入Allocation矩阵:\n");
	for(i=0;i<no1;i++)
		for(j=0;j<no2;j++)
			scanf("%d",&allocation[i][j]);  //输入已知的进程已分配的资源数
    
	for(i=0;i<no1;i++)
		for(j=0;j<no2;j++)
			need[i][j]=max[i][j]-allocation[i][j]; //根据输入的两个数组计算出need矩阵的值
   
	printf("请输入Available矩阵\n");
	for(i=0;i<no2;i++)
		scanf("%d",&available[i]);       //输入已知的可用资源数
	
	print();  //输出已知条件
	check();  //检测T0时刻已知条件的安全状态

	if(r==1)  //如果安全则执行以下代码
	{
		do{ 
q=0;
            p=0;
printf("\n请输入请求资源的进程号(0~4):\n");
			for(j=0;j<=10;j++)
			{
				scanf("%d",&i);
				if(i>=no1)
				{
					printf("输入错误,请重新输入:\n");
				    continue;      
				}
				else break;
			}
			printf("\n请输入该进程所请求的资源数request[j]:\n");
			for(j=0;j<no2;j++)
				scanf("%d",&request[j]);
			for(j=0;j<no2;j++)
				if(request[j]>need[i][j]) p=1;  
				//判断请求是否超过该进程所需要的资源数
				if(p)
					printf("请求资源超过该进程资源需求量,请求失败!\n");
				else
				{
					for(j=0;j<no2;j++)
					if(request[j]>available[j]) q=1;  
//判断请求是否超过可用资源数
					if(q) 
						printf("没有做够的资源分配,请求失败!\n");

					else                             //请求满足条件
					{
						for(j=0;j<no2;j++)  
						{
							available1[j]=available[j];  
							allocation1[i][j]=allocation[i][j];
							need1[i][j]=need[i][j];    
					//保存原已分配的资源数,仍需要的资源数和可用的资源数

							available[j]=available[j]-request[j];  
							allocation[i][j]+=request[j];
							need[i][j]=need[i][j]-request[j];
                            //系统尝试把资源分配给请求的进程
						}
						print();
						check();     //检测分配后的安全性
						if(r==0)   //如果分配后系统不安全
						{
							for(j=0;j<no2;j++)
							{
								available[j]=available1[j];  
							    allocation[i][j]=allocation1[i][j];
							    need[i][j]=need1[i][j];
                    //还原已分配的资源数,仍需要的资源数和可用的资源数
							}
							printf("返回分配前资源数\n");
							print();
						}
					}
				}printf("\n你还要继续分配吗?Y or N ?\n");   
				//判断是否继续进行资源分配
					scanf(" %c",&c);
		}while(c=='y'||c=='Y');
	}

}

void check()   //安全算法函数
{
	int k,f,v=0,i,j;
	int work[m],a[m];
	bool finish[m];
	r=1;
	for(i=0;i<no1;i++)
		finish[i]=false;   // 初始化进程均没得到足够资源数并完成
	for(i=0;i<no2;i++)
	    work[i]=available[i];//work[i]表示可提供进程继续运行的各类资源数
	k=no1;
	do{
		for(i=0;i<no1;i++)
		{
			if(finish[i]==false)
			{
				f=1;
				for(j=0;j<no2;j++)
					if(need[i][j]>work[j])
						f=0;
					if(f==1)      //找到还没有完成且需求数小于可提供进程继续运行的资源数的进程
					{
						finish[i]=true;
						a[v++]=i;   //记录安全序列号
						for(j=0;j<no2;j++)
							work[j]+=allocation[i][j];  //释放该进程已分配的资源
					}
			}
		}
		k--;      //每完成一个进程分配,未完成的进程数就减1
	}while(k>0);
	f=1;
	for(i=0;i<no1;i++)    //判断是否所有的进程都完成
	{
		if(finish[i]==false)   
		{
			f=0;
			break;
		}
	}
	if(f==0)       //若有进程没完成,则为不安全状态
	{
		printf("系统处在不安全状态!");
		r=0;
	}
	else
	{
		printf("\n系统当前为安全状态,安全序列为:\n");
		for(i=0;i<no1;i++)
			printf("p%d  ",a[i]);  //输出安全序列
	}

}

void print()  //输出函数
{
	int i,j;
	printf("\n");
	printf("*************此时刻资源分配情况*********************\n");
	printf("进程名/号   |   Max     | Allocation  |     Need    |\n");
    for (i = 0; i < no1; i++)	
		{
			printf("   p%d/%d      ",i,i);
			    
         	for (j = 0; j < no2; j++) 
            	{printf("%d   ",max[i][j]);}

			for (j = 0; j < no2; j++) 
			    {printf(" %d   ",allocation[i][j]);}
			
			for (j = 0; j < no2; j++)
			    {printf(" %d   ",need[i][j]);}
	
			printf("\n");
		}
	    printf("\n");
		printf("各类资源可利用的资源数为:");
		for (j = 0; j < no2; j++) 
		    {printf(" %d",available[j]);}
		printf("\n");
}

运行结果:

  • 17
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
银行家算法是避免死锁的一种重要方法,本程序用java编程语言对其进行了实现。 当用户申请一组资源时,系统必须做出判断,如果把这些资源分出去,系统是否还处于安全状态。 若是,就可以分出这些资源;否则,该申请暂不予满足。 1.数据结构 假设有M个进程N类资源,则有如下数据结构: MAX[M*N] M个进程对N类资源的最大需求量 AVAILABLE[N] 系统可用资源数 ALLOCATION[M*N] M个进程已经得到N类资源的资源量 NEED[M*N] M个进程还需要N类资源的资源量 2.银行家算法 设进程I提出请求Request[N],则银行家算法按如下规则进行判断。 (1)如果Request[N]<=NEED[I,N],则转(2);否则,出错。 (2)如果Request[N]<=AVAILABLE,则转(3);否则,出错。 (3)系统试探分配资源,修改相关数据: AVAILABLE=AVAILABLE-REQUEST ALLOCATION=ALLOCATION+REQUEST NEED=NEED-REQUEST (4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。 3.安全性检查 (1)设置两个工作向量WORK=AVAILABLE;FINISH[M]=FALSE (2)从进程集合中找到一个满足下述条件的进程, FINISH[i]=FALSE NEED<=WORK 如找到,执行(3);否则,执行(4) (3)设进程获得资源,可顺利执行,直至完成,从而释放资源。 WORK=WORK+ALLOCATION FINISH=TRUE GO TO 2 (4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。
银行家算法是一种避免死锁的算法,它通过动态地分配资源来避免进程死锁。下面是一个简单的C语言实现: ```c #include <stdio.h> #include <stdbool.h> // 定义最大进程数和资源数 #define MAX_PROCESS 10 #define MAX_RESOURCE 10 // 定义进程和资源的数量 int num_process, num_resource; // 定义可用资源和最大需求矩阵 int available[MAX_RESOURCE], max_need[MAX_PROCESS][MAX_RESOURCE]; // 定义已分配和需求矩阵 int allocation[MAX_PROCESS][MAX_RESOURCE], need[MAX_PROCESS][MAX_RESOURCE]; // 定义安全序列 int safe_sequence[MAX_PROCESS]; // 检查进程是否可以分配资源 bool is_safe(int process) { // 检查进程的需求是否小于等于可用资源 for (int i = 0; i < num_resource; i++) { if (need[process][i] > available[i]) { return false; } } return true; } // 银行家算法 bool banker_algorithm() { // 初始化工作 int work[MAX_RESOURCE]; for (int i = 0; i < num_resource; i++) { work[i] = available[i]; } bool finish[MAX_PROCESS] = {false}; // 找到一个安全序列 int count = 0; while (count < num_process) { bool found = false; for (int i = 0; i < num_process; i++) { if (!finish[i] && is_safe(i)) { // 找到一个可以分配资源的进程 for (int j = 0; j < num_resource; j++) { work[j] += allocation[i][j]; } safe_sequence[count++] = i; finish[i] = true; found = true; } } if (!found) { // 没有找到可以分配资源的进程 return false; } } return true; } int main() { // 输入进程和资源的数量 printf("Enter the number of processes: "); scanf("%d", &num_process); printf("Enter the number of resources: "); scanf("%d", &num_resource); // 输入可用资源和最大需求矩阵 printf("Enter the available resources: "); for (int i = 0; i < num_resource; i++) { scanf("%d", &available[i]); } printf("Enter the maximum need matrix:\n"); for (int i = 0; i < num_process; i++) { printf("Process %d: ", i); for (int j = 0; j < num_resource; j++) { scanf("%d", &max_need[i][j]); } } // 输入已分配矩阵并计算需求矩阵 printf("Enter the allocation matrix:\n"); for (int i = 0; i < num_process; i++) { printf("Process %d: ", i); for (int j = 0; j < num_resource; j++) { scanf("%d", &allocation[i][j]); need[i][j] = max_need[i][j] - allocation[i][j]; } } // 运行银行家算法 if (banker_algorithm()) { printf("Safe sequence: "); for (int i = 0; i < num_process; i++) { printf("%d ", safe_sequence[i]); } printf("\n"); } else { printf("Unsafe state\n"); } return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值