银行家算法
一、实验目的和要求
银行家算法是由Dijkstra设计的最具有代表性的避免死锁的算法。本实验要求用高级语言编写一个银行家的模拟算法。通过本实验可以对预防死锁和银行家算法有更深刻的认识。
二、实验内容
1、 设置数据结构 包括可利用资源向量(Availiable),最大需求矩阵(Max),分配矩阵(Allocation),需求矩阵(Need) 2、 设计安全性算法 设置工作向量Work 表示系统可提供进程继续运行可利用资源数目,Finish 表示系统是否有足够的资源分配给进程
三、实现思路
针对一个资源分配矩阵,我们给出一个安全序列并给出具体的各个阶段的矩阵内容(体现资源分配的变化)。矩阵列表包括进程名字(pname),需要的最大资源(max),需要的资源(need),已分配的资源(allocation)共四项,同时,资源种类可以多种,这里为了体现算法本身的特点,我们选取了三种不同的资源(A B C)。
四、主要的数据结构:一个矩阵
矩阵信息使用文件存储,程序需要读取文件来获得信息。
struct process
{
char pname[5];
int max[3];
int alloc[3];
int need[3];
bool finish;
};
这里程序使用用户给出的文件中的信息 bank.txt内容:
代码:
// banker.c input file name:banker.txt
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define busize 25
struct process
{
char pname[5];
int max[3];
int alloc[3];
int need[3];
bool finish;
};
int main ( void )
{
int filechar, i, j, prolen = 0, pronum = 0; // the read char and the process length
int fin = 1, ra = 3, rb = 3, rc = 2, counter = 0, recounter = 0; // three kinds of resources
// counter: the finished process recounter : the number of the result array
char * buffer = ( char *)malloc(sizeof(char) * busize);// file process
FILE * infor = fopen( "banker.txt", "r"); // open the input file, no check step
while ( (filechar = fgetc(infor)) != EOF)
if ( filechar == '\n')
prolen++;
prolen += 1; // get the length of the processes
char corlist[prolen][5]; // store the result.
struct process * plist= (struct process * )malloc(sizeof(struct process) * prolen ); // allocation for the processes
// store the file's information into the structure array;
rewind( infor ); // return to the beginning of the file.
while ( fgets(buffer, busize, infor) != NULL )
{
for ( i = 0; buffer[i] != ' '; i++ )
plist[pronum].pname[i] = buffer[i];
plist[pronum].pname[i] = '\0'; // finish reading pname
i++; // i = 4
for ( j = 0; j < 3; j++, i += 2 )
plist[pronum].max[j] = atoi(buffer + i);
for ( j = 0; j < 3; j++, i += 2 )
plist[pronum].alloc[j] = atoi(buffer + i);
for ( j = 0; j < 3; j++, i += 2 )
plist[pronum].need[j] = atoi(buffer + i);
plist[pronum].finish = 0;// 0: not finish. 1 : finish
pronum++;// next structure
}// finish reading the process list
while ( fin )
{
fin = 0;
for ( i = 0; i < prolen; i++ )
{
if ( plist[i].finish == 1 )
; // finish
else
{
if ( plist[i].need[0] <= ra && plist[i].need[1] <= rb
&& plist[i].need[2] <= rc ) // the work process
{
plist[i].finish = 1;
printf ("The process: name:%s, max:%d, %d, %d; alloc:%d, %d, %d; need:%d, %d, %d.\n",
plist[i].pname, plist[i].max[0], plist[i].max[1], plist[i].max[2],
plist[i].alloc[0], plist[i].alloc[1], plist[i].alloc[2],
plist[i].need[0], plist[i].need[1], plist[i].need[2]);
ra += plist[i].alloc[0], rb += plist[i].alloc[1],
rc += plist[i].alloc[2]; // update ra, rb, rc
strcpy ( corlist[recounter++], plist[i].pname );
fin = 1,counter++;
}
else
;
}
}
}
if ( counter == prolen )
{
printf ( "Succeed! The result:\n");
for ( i = 0; i < prolen; i++ )
printf ( "%s ", corlist[i]);
}
else
printf ( "Error.\n");
return 0;
}
改进方向:
1.文件读取放在main函数里处理比较复杂,最好可以使用一个函数实现
2.不知道是否有更好的文件处理函数,自己的代码比较繁琐
3.代码规范性有待提高