银行家算法

银行家算法
一、实验目的和要求
银行家算法是由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.代码规范性有待提高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值