1. 程式人生 > >【作業系統】小型銀行家演算法實現

【作業系統】小型銀行家演算法實現

一.銀行家演算法簡介: 

    銀行家演算法是一種避免死鎖的演算法。在避免死鎖方法中允許程序動態地申請資源,但系統在進行資源分配之前,應先j檢查並計算此次分配資源的安全性,若分配不恰當會導致導致系統進入不安全狀態,則等待.如果處於安全狀態則分配。

    輸入一些資源量,最大需要的資源量,已開闢的資源量,並且已知在程序裡面可分配資源的數量,當某一個程序請求時,判斷子請求是否合理。

我是用結構體存放資料的,我覺得這樣比較讓自己容易接受。

二.程式模組

      1.初始化模組。

      2.試探分配模組。

      3.資源回收模組。

      4.安全性檢查模組。

      5.資源請求分配模組。

      6.主函式,自己輸入資料測試。

三.程式流程圖

全部流程圖:

 


(2)安全性檢查流程圖


(3)資源分配流程圖      

                                                                                                                          開始



    程式碼:

#include <stdio.h>
#include <string.h>


#define false 0
#define All_Reource 50
#define Vallue     10


typedef struct
{
	int arr[Vallue];
	
}Resource;



int safe[All_Reource] = { 0 };


Resource ptr;
Resource Resource_Max[All_Reource] = { 0 };//最大需求矩陣
Resource Resource_Allocation[All_Reource] = { 0 };//已分配資源數矩陣
Resource Resource_Need[All_Reource] = { 0 };//需求矩陣


//可用資源向量
Resource Available;
Resource Work;

//int safe[All_Reource] = { 0 };
void Init(int Numz)
{
	int i;
	for (i = 0; i < Numz; i++)
	{   printf("請輸入可用資源向量Ava:\n");
		scanf("%d", &Available.arr[i]);
	}
}

void Resource_Max_Init(int Num, int Numz)

{
	for (int i = 0; i<Num; i++)
	{
		//printf("please input the P%d source\n", i);
		printf("please input  the number of P%d max source \n ", i);
		for (int j = 0; j < Numz; j++)
		{
			printf("請輸入 P%d 的%d類資源:\n", i, j);
			scanf("%d", &Resource_Max[i].arr[j]);
		}

	}
}

void Resource_Allocation_Init(int Num,int Numz)

{
	for (int i = 0; i < Num; i++)
	{
		printf("please input the P%d source\n", i);
		for (int j = 0; j < Numz; j++)
		{
			printf("請輸入 P%d 的%d類分配的資源:\n", i, j);
			scanf("%d", &Resource_Allocation[i].arr[j]);
		}
	}
}
//void Resource_Need_Init(int Num,int Numz)
//
//{
//	for (int i = 0; i<Num; i++)
//	{
//		printf("please input the P%d's source\n", i);
//		for (int j = 0; j < Numz; j++)
//		{
//			printf("請輸入 P%d 的%d類需要的資源:\n", i, j);
//			scanf("%d", &Resource_Need[i].arr[j]);
//		}
//	}
//}

void  Resource_Need_Init(int Num,int Numz)
{
	for (int i = 0; i < Num;i++)
	{
		for (int j = 0; j < Numz;j++)
		{
			Resource_Need[i].arr[j] = Resource_Max[i].arr[j] - Resource_Allocation[i].arr[j];
		}

	}
}


//試探分配
void ProbeAlloc(int process, Resource *res,int Numz)
{
	for (int i = 0; i < Numz; i++)
	{
		Available.arr[i] -= res->arr[i];
		Resource_Allocation[process].arr[i] += res->arr[i];
		Resource_Need[process].arr[i] -= res->arr[i];
	}
}

//若試探分配後進入不安全狀態,將以試分配的的資源回收
void RollBack(int process, Resource *res,int Numz)
{
	for (int i = 0; i < Numz; i++)
	{
		Available.arr[i] += res->arr[i];
		Resource_Allocation[process].arr[i] -= res->arr[i];
		Resource_Need[process].arr[i] += res->arr[i];
	}
}

//安全性檢查
bool SafeCheck(int Num,int Numz)
{
	int num = 0;
	int Finish[All_Reource];
	for (; num < Num; num++)
	{
		Finish[num] = { false };
	}
	int		i;
	int		j = 0;
	Work = Available;
	for (i = 0; i < Num; i++)
	{
		//是否已檢查過
		if (Finish[i] == false)
		{
			int n = 0;
			//是否有足夠的資源分配給該程序
			for (n=0; n < Numz;)
			{
				if (Resource_Need[i].arr[n] <= Work.arr[n])
				{
					n++;
				}
				else
				{
					break;
				}
			}
			if (n==Numz)
			{
             for (int nb = 0; nb < Numz; nb++)
				  {
					Work.arr[nb] += Resource_Allocation[i].arr[nb];	
				  }
				Finish[i] = true;
				safe[j++] = i;
				i = -1;
			}
			

		}
	}

	//如果所有程序的Finish向量都為true則處於安全狀態,否則為不安全狀態
	for (i = 0; i < Num; i++)
	{
		if (Finish[i] == false)
		{
			return false;
		}
	}
	return true;
}

//資源分配請求
bool request(int process, Resource *res, int Num,int Numz)
{
	int j;
	int i;
	for (i = 0; i < Numz;)
	{
		if (res->arr[i] <= Resource_Need[process].arr[i])//請求量是否小於需求量
		{
			i++;
		}
		else
		{
			printf("請求量大於需求量\n");
			return false;
		}
	}

	for (j = 0; j < Numz;)
	{
		if (res->arr[j] <= Available.arr[j])//請求量是否小於系統的可用資源量
		{
			j++;
		}
		else
		{
			printf("請求量大於需可用量\n");
			return false;
		}
	}

	//試探分配
	ProbeAlloc(process, res,Numz);

	//如果安全檢查成立,則請求成功,否則將分配失敗並返回失敗
	if (SafeCheck(Num, Numz))
	{
		return true;
	}
	else
	{
		printf("安全性檢查失敗,系統將進入不安全狀態\n");
		RollBack(process, res,Numz);
		return false;
	}
	
			
}

void PrintfTable(int Numz)
{
	int i;
	printf("Ava :");
	for (i = 0; i < Numz; i++)
	{
		printf("%d  ",Available.arr[i]);
	}
	printf("\n");

}

int main()

{
	int y;
	int d;
	int	ch;
	
	int num = 0;
	int numz = 0;
	int i = 0;
	printf("請輸入程序總數: ");
	scanf("%d", &num);
	printf("請輸入資源種類: ");
	scanf("%d", &numz);
	for (i = 0; i < numz; i++)
	{
		ptr.arr[i] = i;
	}
	Init(numz);
	Resource_Max_Init(num, numz);
	Resource_Allocation_Init(num, numz);
	Resource_Need_Init(num, numz);
	printf("先檢查初始狀態是否安全\n");
    if (SafeCheck(num, numz))
	{
		//printf("系統處於安全狀態\n");
		printf("輸出安全序列:\n");
		for (d = 0; d < num; d++)
		{
			printf("p%d", safe[d]);
		}
		printf("\n");
	}
	else
	{
		printf("系統處於不安全狀態,程式將退出...\n");
		getchar();
		return -1;
	}
	do
	{
		int		process;
		Resource	res;
		PrintfTable(numz);
		printf("請輸入需要請求的程序數:");
		scanf("%d", &process);
		for (y = 0; y < numz; y++)
		{
			printf("請輸入程序數%d分配資源數量%d: ", process, y);
			scanf("%d", &res.arr[y]);
		}

		if (request(process, &res, num, numz))
		{
			int a;
			printf("分配成功。\n");
			printf("輸出安全序列:\n");
			for (a = 0; a < num; a++)
			{
				printf("p%d", safe[a]);
				printf("\n");
			}
			//PrintfTable(numz);
			int n1 = 0;
			for (int i = 0; i < numz;i++)
			{
				if (Resource_Need[process].arr[i]==0)
				{
					n1++;
				}
				else
				{
					break;
				}
			}
			if (n1 == numz)
			{
				for (int i = 0; i < numz;i++)
				{
					Available.arr[i] += Resource_Allocation[process].arr[i];
				}
			}
			
			PrintfTable(numz);
		}
		else
		{
			printf("分配失敗。\n");
		}
		printf("是否繼續分配?(Y/N):");
		fflush(stdin);				
		ch = getchar();
	} while (ch == 'Y' || ch == 'y');
	
	return 0;
}

     

(流程圖太大了,不好截圖,所以只能分開截圖)。