⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mybanker.c

📁 Banker Algorithm You shoud make table by textfile
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
//#define ResourceNum 4 // 磊盔 荐 
//#define ProcessNum 5  // 橇肺技胶 荐 


//Max : 橇肺技胶狼 弥措 夸备 摹 
//Allocation : 泅犁 亲寸茄 磊盔 
//Available : 荤侩啊瓷 磊盔 
//Need : 阿 橇肺技胶狼 巢篮 夸备 


//Global Variable 
/*int Available[ResourceNum]={1,5,2,0};
int Max[ProcessNum][ResourceNum]={{0, 0, 1, 2},{1, 7, 5, 0}, {2, 3, 5, 6}, {0, 6, 5, 2}, {0, 6, 5, 6}};
int Allocation[ProcessNum][ResourceNum]={{0, 0, 1, 2}, {1, 0, 0, 0}, {1, 3, 5, 4}, {0, 6, 3, 2}, {0, 0, 1, 4}};

	int Need[ProcessNum][ResourceNum];
	int Work[ResourceNum];
*/


int** Max; // 弥措 夸备摹 
int** Allocation; //泅犁 且寸 磊盔 
int** Need; //夸备 
int* Work; //篮青盔 舅绊府硫俊 静捞绰 吝酶 
int* Available; // 啊瓷 磊盔 
int* ProcessSet; // 橇肺技胶 笼钦 

int* Request;  //夸没 磊盔 

int  ResourceNum ; // 磊盔 荐 
int  ProcessNum ;  // 橇肺技胶 荐 


/*  盔夯 焊粮 鞘夸  (墨乔夯)*/

int** MaxTemp;
int** AllocationTemp;
int** NeedTemp;
int* WorkTemp;
int* AvailableTemp;

/*
int AvailableTemp[ResourceNum]={1,5,2,0};
int MaxTemp[ProcessNum][ResourceNum]={{0, 0, 1, 2},{1, 7, 5, 0}, {2, 3, 5, 6}, {0, 6, 5, 2}, {0, 6, 5, 6}};
int AllocationTemp[ProcessNum][ResourceNum]={{0, 0, 1, 2}, {1, 0, 0, 0}, {1, 3, 5, 4}, {0, 6, 3, 2}, {0, 0, 1, 4}};
int NeedTemp[ProcessNum][ResourceNum];
int ProcessSet[ProcessNum];
int Request[ResourceNum];  
*/
  int count = 0 ;  // 己傍 墨款飘

//Function 
void calNeed(); // 阿 橇肺技胶狼 巢篮 夸备 绝单捞飘 
void printNeed();
void restoreValue(); // 盔夯蔼栏肺 汗备 
int checkRe(); // 硅凯 蔼 吝汗 八荤 
// Step 1: if (Requesti <= Needi ) go to Step2
// Step 2 : if (Requesti <= Available) go to Step3
// Step 3 : Available -= Requesti
//			Allocation += Requesti
//			Needi -= Requesti
void requestGet(int processN); // copy current Process's request to Request[]
int step1(int processN); 
int step2(int processN);
void step3(int processN);
int checkValid(int processN); // 救沥 惑怕 八荤 舅绊府硫狼 炼扒 八荤  
void workAdd(processN);
//int checkSafe(int * Process);
void setWork(); //Work 俊 Available蔼 汗荤 
void printTable(); // 钎 免仿 
int bankerAlgoritm (int processN) ; //篮青盔 舅绊府硫 
void printProcess();
void copyValue ();
void readValue();


void main()

{

	
	
	
	int i,j,k,l,m,n;

	int flag = 0;
	readValue();
	copyValue ();
	calNeed(); // 鞘夸摹 拌魂 


	for (j=0; j<ProcessNum; j++)
	{
				
		for (k = 0; k<ProcessNum; k++)
		{
						
			for (l = 0; l<ProcessNum; l++)
			{
								
				for (m = 0; m<ProcessNum; m++)
				{
					
					for (n = 0 ; n<ProcessNum; n++)
					{
																	
						ProcessSet[0] = j;	
						ProcessSet[1] = k; 
						ProcessSet[2] = l; 
						ProcessSet[3] = m; 
						ProcessSet[4] = n; 

	
						if (checkRe()) // 吝汗 酒聪搁 .. 
						{

							for (i=0; i<ProcessNum; i++) 
							{

								if (!bankerAlgoritm (ProcessSet[i])) 
								{
									flag = 1 ; //茄锅捞扼档 角菩窍搁 
									break;
								}

							}

							
							if (!flag) // 己傍窍搁 
							{	
								printProcess();
								count++;
								flag = 0;
								restoreValue(); // 茄锅 窍绊 唱搁 汗备 秦 林绢具 窃 ^^:
								calNeed();
							}
							else //角菩 
							{
								flag = 0; 
								restoreValue(); // 茄锅 窍绊 唱搁 汗备 秦 林绢具 窃 ^^:
								calNeed();

							}


						}

							

							
						
						

					}
					
					
					
					
				}
				
			}
		}
	}
	
	
	


	printTable();	
	
	printf("\n醚 啊瘤荐 %d",count);
	getchar(); // pause 


}



int bankerAlgoritm (int processN)
{
	
	
	//int Finish[ProcessNum]={0, 0, 0, 0, 0};
	
	
	int check ; 
	int i;
	
	requestGet(processN); // 窃荐 捞抚 官厕 

	check = step1(processN);
	if (!check) 
	{
	//	printf("夸没磊盔荐啊 鞘夸磊盔荐焊促 臭嚼聪促 !! Error \n");
		return 0;
	}
	check = step2(processN); 
	
	if (!check) 
	{
		//printf("荤侩啊瓷 磊盔焊促 夸没窍绰 磊盔捞 歹 腹嚼聪促 !! Error \n");
		return 0;
	}
	
	step3(processN); //update 
	
	setWork();//惑怕 八荤傈 檬扁拳 
	
	//救沥惑怕 八荤 start  
	

	for (i=0; i<ResourceNum ; i++) // 葛电 磊盔阑 捣促 
	{
		
		
		if (Need[processN][i] <= Work[i]) // 炼扒 嘎绰瘤 
		{	
			
			Work[i] += Allocation[processN][i];
			
		}
		
		else //救沥惑怕啊 酒聪骨肺 狐廉唱咳 角菩 ... 
		{

			restoreValue(); // 盔贰 蔼 汗备 
		//	printf("橇肺技胶 %d篮 救沥惑怕啊 酒凑聪促 " , processN);
			return 0 ; //角菩 
		}
		
	}
	
	for (i=0; i<ResourceNum ; i++) // 己傍矫 磊盔篮 眠啊 凳 ... 
	{
		Available[i] = Work[i] ; 
	}

	return 1;  // 己傍 
	//printf("橇肺技胶 %d篮 救沥惑怕 涝聪促 ",processN); 
	//isSafe = checkSafe(Finish);
	
	//救沥惑怕 八荤 end 
	
	
	
	
}





void calNeed() { 

	int i,j;
	
	for (i=0; i<ProcessNum; i++){
		for (j=0; j<ResourceNum; j++){
			Need[i][j] = Max[i][j] - Allocation[i][j] ;
		}
	}
	
}

void printNeed() {
	int i, j;
	
	for (i=0; i<ProcessNum; i++){
		for (j=0; j<ResourceNum; j++){
			printf("%d ",Need[i][j]);
		}
		printf("\n");
	}
	
}


void requestGet(int processN) // copy current Process's request to Request[]
{
	 
	int i;

	for (i=0; i<ResourceNum; i++)
		Request[i] = Need[processN][i] ;

}

int step1(int processN) { 
	
	int i;
	
	requestGet(processN); // 
	
	for (i = 0; i<ResourceNum ; i++) // Check Step1 
	{
		if (Request[i] > Need[processN][i])
			return 0; // 角菩 
		
	}
	
	return 1; //己傍 
	
}


int step2(int processN) {
	
	int i;
	
	
	for (i = 0; i<ResourceNum ; i++) // Check Step1 
	{
		if (Request[i] > Available[i])
			return 0; // 角菩 

		
	}
	
	return 1;
	
	
	
}



void step3(int processN){
	
	int i;
	
	
	for (i = 0; i<ResourceNum ; i++) // step3  
	{
		Available[i] -= Request[i];
		Allocation[processN][i] += Request[i];
		Need[processN][i]  -= Request[i];
	}
	
	
	
}







void restoreValue()
{
	
	int i, j;
	for (i=0; i<ProcessNum ; i++)
	{
		for (j=0; j<ResourceNum; j++)
		{
			Max[i][j] = MaxTemp[i][j];
			Allocation[i][j] = AllocationTemp [i][j];
			Need[i][j] = NeedTemp [i][j];
		}
		
		Available[i] = AvailableTemp[i];
		
	}
	

	
}
//鞘夸绝澜 
int checkSafe(int * Process){
	
	int i;
	
	for (i =0 ; i<ProcessNum ; i++)
		if (Process[i] !=1 ) return 0; //NonSafe 
		
		return 1; //Safe 
		
		
}



void setWork()
{
	int i;
	for (i=0 ; i<ResourceNum ; i++)
		Work[i] = Available[i];
}


void printTable()
{
	
	
	int i,j; 
	
	//咯扁绰 巩力啊 乐澜 .. 畴啊促 
	printf("\n\n\n");
	printf("      Allocation	Max		Available \n");
	printf("---------------------------------------------------------------\n");
	printf("\tA B C D \tA B C D \tA B C D\n");
	
	//咯扁绰 沥惑 
	for (i=0; i<ProcessNum ; i++)
	{
		
		printf("P%d\t",i);
		for (j=0; j<ResourceNum; j++)
			printf("%d ",Allocation[i][j]);
		
		
		printf("\t");
		for (j=0; j<ResourceNum; j++)
			printf("%d ",Max[i][j]);
		
		printf("\t");
		if (i==0)
		{
			for (j=0; j<ResourceNum; j++)
				printf("%d ",Available[j]);
			
			
		}
		
		printf("\n");
		
	}
	
	
	
	
	
	
}


int checkRe()
{

	int i,j;
	
	for (i=0; i<ProcessNum; i++)
	{
		for (j=i+1; j<ProcessNum; j++)
		{
			if (ProcessSet[i]==ProcessSet[j])
				return 0; // 吝汗 乐促. 
		

		}

	}


	return 1;


}


void printProcess()
{
	int i;

	printf(" 救沥等 惑怕甫 蜡瘤且 荐 乐绰 橇肺技胶甸狼 荐青鉴辑 : ");
	for (i = 0; i< ProcessNum; i++)
		printf("%d ",ProcessSet[i]);

	printf("\n\n");


}












void copyValue ()
{


	int i, j;
	for (i=0; i<ProcessNum ; i++)
	{
		for (j=0; j<ResourceNum; j++)
		{
			MaxTemp[i][j] = Max[i][j]; 
			AllocationTemp [i][j] = Allocation[i][j];
			NeedTemp [i][j] = Need[i][j] ;
		}
		
		AvailableTemp[i] = Available[i] ;
		
	}



}



void readValue()
{

	
	FILE * fp ;
	int i,j;


	
	fp = fopen ("table.txt","rt");

	fscanf(fp, "%d", &ResourceNum); // 磊盔 荐 
	fscanf(fp, "%d", &ProcessNum); // 橇肺技胶 荐

	
		
	Max = (int **)malloc(sizeof(int *)* ProcessNum);
	Allocation = (int **)malloc(sizeof(int *)* ProcessNum);
	Need = (int **)malloc(sizeof(int *)* ProcessNum);
	Available = (int *)malloc(sizeof(int) * ResourceNum);
	Work = (int *)malloc(sizeof(int) * ResourceNum);
	ProcessSet = (int *)malloc(sizeof(int) * ProcessNum);
	Request = (int *)malloc(sizeof(int) * ResourceNum);  
	
	MaxTemp = (int **)malloc(sizeof(int *)* ProcessNum);
	AllocationTemp = (int **)malloc(sizeof(int *)* ProcessNum);
	NeedTemp = (int **)malloc(sizeof(int *)* ProcessNum);
	AvailableTemp = (int *)malloc(sizeof(int) * ResourceNum);
	WorkTemp = (int *)malloc(sizeof(int) * ResourceNum);

	
	for (i = 0 ; i<ProcessNum ; i++) {
		Max[i] = (int* )malloc(sizeof(int)* ResourceNum);
		Allocation[i] = (int* )malloc(sizeof(int)* ResourceNum);
		Need[i] = (int* )malloc(sizeof(int)* ResourceNum);
		MaxTemp[i] = (int* )malloc(sizeof(int)* ResourceNum);
		AllocationTemp[i] = (int* )malloc(sizeof(int)* ResourceNum);
		NeedTemp[i] = (int* )malloc(sizeof(int)* ResourceNum);

	}
	
	//咯扁辑 何磐 蔼 檬扁拳 

 


	//Allocation 檬扁拳 
	for (i=0; i<ProcessNum ; i++) 
	{
		for (j=0; j<ResourceNum ; j++)
		{
			fscanf(fp, "%d", &Allocation[i][j]);
		}

	}


	//Max 蔼 
	for (i=0; i<ProcessNum ; i++) {
		for (j=0; j<ResourceNum ; j++)
			fscanf(fp, "%d", &Max[i][j]);

	}

	//Available 蔼 
	for (i=0; i<ResourceNum ; i++)
		fscanf(fp, "%d", &Available[i]);
	
	

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -