论坛首页 编程语言技术论坛

C语言模拟银行家算法

浏览 4006 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2009-04-07  
C
代码有问题,见谅!
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#define randomize() srand((unsigned)time(NULL)) //定义一个宏
#define uint unsigned int
#define uchar unsigned char
#define RES 3			//系统资源数
#define MAX_P 5			//进程数

//PCB结构体定义部分
typedef struct PCB
{
	/* 进程标识符 */
	uint id;
	/* 每一个进程需求M类资源的最大数目 */
	uint max[RES];
	/* 已分配的资源数 */
	uint allocation[RES];
	/* 当前进程还需要的资源个数 */
	uint need[RES];
	/* 当前进程请求资源 */
	uint request[RES];
	/* 标志进程是否可执行完成 */
	uint finish;
};

/* 系统中R资源的个数 */
uint available[RES];
uint work[RES];
uchar finish[RES],flag;
struct PCB process[MAX_P];

void init(void);
bool check(void);
void out();
void main(void) 							///////////主函数/////////////
{
	int i,j;
	init();
	printf("===============banker===============\n");
	out();
	while(!flag)
	{
		randomize();     //随机函数
		for(i=0;i<MAX_P;i++)
		{
			process[i].finish = 0;
			for(j=0;j<RES;j++)
			{
				process[i].request[j] = rand()%5;//i进程申请j资源随机个
				if(process[i].request[j] < process[i].need[j])
					if(process[i].request[j] < available[j])
					{
						work[j] = available[j];
						//finish = 0;
					    if(check()) //安全性检查
						{
							available[j] = available[j] - process[i].request[j];
							process[i].allocation[j] = process[i].allocation[j] + process[i].request[j];
							process[i].need[j] = process[i].need[j] - process[i].request[j];
							printf("distribute....\n");
							out();
							flag = 1;
						}
						else
							printf("wait...\n");
					}
					else
						printf("wait...\n");
				else
					printf(".....error...\n");
			}
		}
		for(i=0;i<MAX_P;i++)
			for(j=0;j<RES;j++)
			{
				
			}
	}
}
void out(void)
{
	//printf("##############资源情况###################\n");
	printf("\n进程\tMax\tAllocation\tNeed\tAvailable\tFinish\n");
	printf("----------------------------------------------------------------|\n");
	int i;
	for(i=0;i<MAX_P;i++)
	{	
		printf("%d\t%d,%d,%d\t%d,%d,%d\t\t%d,%d,%d\t%d,%d,%d\t\t%d       |\n",process[i].id,process[i].max[0],process[i].max[1],process[i].max[2],process[i].allocation[0],process[i].allocation[1],process[i].allocation[2],process[i].need[0],process[i].need[1],process[i].need[2],available[0],available[1],available[2],process[i].finish);
		if(i==4)
			printf("----------------------------------------------------------------|\n");
	}
}
/* 安全性检查 */
bool check(void)
{
	int i,j;
	for(i=0;i<MAX_P;i++)
		for(j=0;j<RES;j++)
		{
			if(!process[i].finish && process[i].need[j]<=work[j])
			{
				work[j] += process[i].allocation[j];
				process[i].finish = 1;
				printf("...not safe....\n");
			}
			else
				printf("...not safe....\n");
		}
	out();
	return true;
}
/** 初始化 **/
void init(void)
{
	int i = 0;
	int j = 0;
	flag = 0;
	randomize();
	//随机产生各资源的个数
	for(i=0;i<RES;i++)
		available[i] = rand()%5+6;	
	//初始化各进程
	for(i=0;i<MAX_P;i++)
	{
		//初始化进程ID
		process[i].id = i+1;
		//各进程对资源的最大需求,随机产生:0~10
		//已分配0个资源
		//请求资源0个
		//尚需 max - allocation
		for(j=0;j<RES;j++)
		{
			process[i].max[j] = rand()%10; 
			process[i].allocation[j] = 0;
			process[i].request[j] = 0;
			process[i].need[j] = process[i].max[j]-process[i].allocation[j];
		}
	}
}
   发表时间:2009-04-07  
囧rz,刚刚看过,你这一写,我发现我已经忘记了。。。。
0 请登录后投票
   发表时间:2009-10-22  
我还是一个新手,不很懂……
但还是谢谢分享……
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics