程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C語言實現 操作系統 銀行家算法

C語言實現 操作系統 銀行家算法

編輯:關於C

嘿嘿,今晚心血來潮,在宿捨把銀行家算法實現了。


/**************************************************
銀行家算法: 
主要的思想是 捨大取小,先滿足小的,最後才滿足大的。

author: lyb
date: 2014/10/15
***************************************************/

#include 
#include 
#include 
#include 

// 進程運行狀態標志
#define TRUE	1
#define FALSE	0
#define WAIT	-1

/* version 1
#define	PMAX	20	// 假設最大的進程的數目
#define RMAX	20	// 假設最大的資源的分類數

int Resource[RMAX] = {0};				// 各類資源的總量
int Max[PMAX][RMAX] = {0};				// 各資源的最大需求量
int Need[PMAX][RMAX] = {0};				// 各進程需求的資源量
int Allocation[PMAX][RMAX] = {0};		// 已分配的資源量
int Available[RMAX] = {0};				// 剩余可用的資源量
*/

// version 2   采用動態分配數組,為了函數調用的方便,使用全局指針
int *Resource	= NULL;					// 各類資源的總量
int *Max		= NULL;					// 各資源的最大需求量
int *Need		= NULL;					// 各進程需求的資源量
int *Allocation = NULL; 				// 已分配的資源量
int *Available	= NULL; 				// 剩余可用的資源量


// 檢測此時的系統分配狀態是否安全 (核心函數)
int testStatus(const int P, const int R)
{
	int finish = 0;				// 運行完成的進程數
	int wait = 0;				// 等待的進程數
	
	int minR = 0;				// 最小的資源數
	int minP = 0;				// 最小需求資源的進程

	int i = 0;
	int j = 0;
	int k = 0;
	int l = 0;

	int *status = (int*)malloc(P*sizeof(int));  		// 進程的狀態
	int *Available_tmp = (int*)malloc(R*sizeof(int));	// Available_tmp 是 Available的一份拷貝

	if (status != NULL && Available_tmp != NULL)
	{
		// 所有進程狀態置零
		memset(status, FALSE, P*sizeof(int));

		// 這裡拷貝 Available
		memcpy(Available_tmp, Available, R*sizeof(int));
	}
	else
	{
		printf("pointer NULL\n");
		return FALSE;
	}

	
	while( finish != P && wait != P)
	{
		// 以第一類資源為基准,選取該資源需求量最小的進程
		minR = Resource[0];		// 這裡選取最大值,方便後面的比較獲取最小值
		minP = 0;

		for (i=0; i Available_tmp[j])
			{
				break;
			}
		}

		if (j == R)		// 能夠滿足
		{
			//printf("P%d\t", minP);   //打印成功分配的進程

			status[minP] = TRUE;
			finish++;

			// 如果資源能夠分配了,那麼進程就能夠運行結束,然後釋放資源,這裡需要回收資源
			for (l=0; l Available[i])		// 申請的資源比剩余的資源還多!
		{
			return FALSE;
		}
		else
		{
			testAllocate[pId*RCount + i] += reqSource[i];
		}
	}

	if (testStatus(PCount, RCount) == TRUE)    // 是一個安全狀態
	{
		// 正式分配
		memcpy(Allocation, testAllocate, PCount*RCount*sizeof(int));
		
		free(testAllocate);
		return TRUE;
	}
	else
	{
		free(testAllocate);
		return FALSE;
	}

}
	
// 釋放所有的內存空間
int destroy()
{
	if (Resource == NULL || Max == NULL || Need == NULL
		|| Allocation == NULL || Available == NULL)
	{
		return FALSE;
	}
	else
	{
		free(Resource);
		Resource = NULL;
		free(Max);
		Max = NULL;
		free(Need);
		Need = NULL;
		free(Allocation);
		Allocation = NULL;
		free(Available);
		Available = NULL;

		printf("Destroy\n");

		return TRUE;
	}

}

int main()
{
	int p = 0;		// 進程數
	int r = 0;		// 資源分類數

	int reqSource[3] = {0, 3, 4};

	readData(&p, &r);

	// test now status
	if (testStatus(p, r) == TRUE)
	{
		printf("Saft\n");
	}
	else
	{
		printf("nonSaft\n");
	}


	// for test   reqSource[3] = {0, 3, 4};
	if (request(p, r, 1, reqSource) == TRUE)
	{
		printf("Allocate\n");
	}
	else
	{
		printf("Non-Allocate\n");
	}
	

	// 釋放所有的內存空間
	destroy();	


	return 0;
}


/*  in.txt

5 3		 // 進程數  資源種類數
17 5 20  // 各類資源總數

// 最大需求量
5 5 9
5 3 6
4 0 11
4 2 5
4 2 4

// 已分配資源數
2 1 2
4 0 2
4 0 5
2 0 4
3 1 4

// 剩余的資源數
2 3 3    

*/


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved