银行家算法 实验

《操作系统》实验
实验二 银行家算法

一.实验目的
1、理解死锁的定义、原因和必要条件。
2、掌握银行家算法和安全性算法的基本思想。
3、能够编程模拟利用银行家算法和安全性算法避免死锁的实现过程。
二.使用的设备和仪器
计算机+Windows XP +Visual C++6.0
三.实验内容及要求
编写一程序,能够模拟银行家算法和安全算法来避免死锁。假设系统资源有A、B、C三种,可以运行4个进程。该程序具备的基本功能为:
1、程序可以输入3种资源的数目,4个进程对3种资源的最大需求量、已分配量和需求量。
2、能够判断某一时刻系统是否处于安全状态,如果处于安全状态能够给出安全序列。
3、当某进程提出资源申请时,能够判断是否能把资源分配给申请进程。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define index_max 5

//线程
typedef struct PCB{
    
    
	int id;
	int Max[3];
	int allocation[3];
	int Need[3];
}PCB;
PCB  MY_PCB[index_max]={
    
    0};//定义max个线程初始化为0

//初始化资源数量
int Availabl[3]={
    
    2,3,3};

//分配
void distribution(){
    
    
	for(int i=0;i<index_max;i++){
    
    
		MY_PCB[i].id=i+1;
		printf("请输入第%d个进程的MAX(A B C)用空格隔开\n",i+1);
		scanf("%d %d %d",&MY_PCB[i].Max[0],&MY_PCB[i].Max[1],&MY_PCB[i].Max[2]);
		getchar();
		printf("请输入第%d个进程的allocation(A B C)用空格隔开\n",i+1);
		scanf("%d %d %d",&MY_PCB[i].allocation[0],&MY_PCB[i].allocation[1],&MY_PCB[i].allocation[2]);
		getchar();
		printf("请输入第%d个进程的Need(A B C)用空格隔开\n",i+1);
		scanf("%d %d %d",&MY_PCB[i].Need[0],&MY_PCB[i].Need[1],&MY_PCB[i].Need[2]);
		getchar();
	}
	printf("请输入剩下的Availabl的资源数(A B C)用空格隔开\n");
	scanf("%d %d %d",&Availabl[0],&Availabl[1],&Availabl[2]);
	getchar();


}
//核心算法
void algorithm(){
    
    
	int l=0;
	int r=0;//双指针
	int falg=0;//标志
	while(l<=r){
    
    
		if(l>=index_max|| falg==1) break;
		if(r>=index_max){
    
     r=l; falg=1; }
		int a = MY_PCB[r].Need[0]<=Availabl[0];
		int b = MY_PCB[r].Need[1]<=Availabl[1];
		int c = MY_PCB[r].Need[2]<=Availabl[2];

		if(a&&b&&c){
    
    
			PCB tep=MY_PCB[l];
			MY_PCB[l]=MY_PCB[r];
			MY_PCB[r]=tep;
			/*******************/
			Availabl[0]+=MY_PCB[l].allocation[0];
			Availabl[1]+=MY_PCB[l].allocation[1];
			Availabl[2]+=MY_PCB[l].allocation[2];
			l++;
			r=l;
		}else{
    
    
			r++;
		}
	}//while
	if(falg==1){
    
    
		printf("此时线程不安全");
		return;//退出;
	}else{
    
    
		printf("此时线程安全可,可按照如下线程执行:\n");
		for(int i=0;i<index_max-1;i++){
    
    
			printf("%d-->",MY_PCB[i]);
		}
		printf("%d",MY_PCB[index_max-1]);
	}

}


int main(){
    
    
	printf("银行家算法======= 班级:计科204 学号:208612 姓名:奉海龙\n");
	distribution();
	algorithm();
	getchar();
	return 0;
}

截图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_52062043/article/details/124800973