C语言实现银行家算法

// Author: Elin.Liu
// Date: 2022-11-15 10:09:07
// Last Modified by:   Elin.Liu
// Last Modified time: 2022-11-15 10:09:07

#include 
#include 
#include 

#define MAX_PROCESS 4
#define MAX_RESOURCE 4
const int ready = 0;
const int done = 1;

// 初始化进程结构体
struct Process
{
    int ID;                        // 定义进程ID
    int MAX_REQUIRE[MAX_RESOURCE]; // 定义进程最大资源需求量
    int ALLOCATED[MAX_RESOURCE];   // 定义进程已被分配的资源量
    int NEED[MAX_RESOURCE];        // 定义进程还需要的资源量
    int STATUS;                    // 定义进程状态
};

// 初始化系统资源量函数
void InitResource(int r[MAX_RESOURCE])
{
    for (int i = 0; i < MAX_RESOURCE; i++)
    {
        r[i] = rand() % 10 + 10;
    }
}

// 初始化进程初始化函数
void InitProcess(int n, struct Process *p)
{
    p->ID = n;
    for (int i = 0; i < MAX_RESOURCE; i++)
    {
        /*
            初始化进程最大资源需求量
            为了防止频繁出现系统资源不足以支持进程循行的情况
            因此我们将随机数限定在1-5这个范围内
        */
        p->MAX_REQUIRE[i] = rand() % 5 + 1;
        /*
            初始化进程已被分配的资源量
            这里使用随机量0-2进行初始化
        */
        p->ALLOCATED[i] = p->MAX_REQUIRE[i] - rand() % 2;
        p->NEED[i] = p->MAX_REQUIRE[i] - p->ALLOCATED[i];
        p->STATUS = ready;
    }
}

// 初始化加载资源函数
void LoadResource(int r[MAX_RESOURCE], struct Process *p)
{
    for (int i = 0; i < MAX_RESOURCE; i++)
    {
        r[i] = r[i] - p->ALLOCATED[i];
    }
}

// 初始化进程执行函数
void RunProcess(int r[MAX_RESOURCE], struct Process p)
{
    // 遍历资源池
    for (int i = 0; i < MAX_RESOURCE; i++)
    {
        // 当资源池中存在无法满足的资源时,进程执行失败
        if (p.NEED[i] > r[i])
        {
            printf("进程%d执行失败,系统资源不足!\n", p.ID);
            break;
        }
        else
        {
            // 将被分配的资源进行回收
            r[i] = r[i] + p.ALLOCATED[i];
        }
    }
    // 当遍历没有被中断时,进程执行成功,进程状态改为done
    p.STATUS = done;
    printf("进程%d执行成功,系统资源回收成功! ", p.ID);
}
void main(void)
{
    // 初始化随机种子
    srand((unsigned)time(NULL));
    // 初始化进程池指针
    struct Process *processPool = (struct Process *)malloc(sizeof(struct Process) * MAX_PROCESS);
    // 初始化资源池数组
    int resource[MAX_RESOURCE];
    // 备份当前资源状态
    int *resourceBackup;
    resourceBackup = resource;
    InitResource(resource);
    printf("系统资源量为:");
    for (int i = 0; i < MAX_RESOURCE; i++)
    {
        printf("%d ", resource[i]);
    }
    printf("\n");
    // 初始化进程池
    for (int i = 0; i < MAX_PROCESS; i++)
    {
        InitProcess(i, &processPool[i]);
    }
    // 打印进程池
    for (int i = 0; i < MAX_PROCESS; i++)
    {
        printf("进程%d的最大需求量为:", processPool[i].ID);
        for (int j = 0; j < MAX_RESOURCE; j++)
        {
            printf("%d ", processPool[i].MAX_REQUIRE[j]);
        }
        printf("\t已分配资源量为:");
        for (int j = 0; j < MAX_RESOURCE; j++)
        {
            printf("%d ", processPool[i].ALLOCATED[j]);
        }
        printf("\t还需要资源量为:");
        for (int j = 0; j < MAX_RESOURCE; j++)
        {
            printf("%d ", processPool[i].NEED[j]);
        }
        printf("\n");
    }
    // 加载资源
    for (int i = 0; i < MAX_PROCESS; i++)
    {
        LoadResource(resource, &processPool[i]);
    }
    printf("加载后系统资源量为:");
    for (int i = 0; i < MAX_RESOURCE; i++)
    {
        printf("%d ", resource[i]);
    }
    printf("\n");
    // 资源量检查
    for (int i = 0; i < MAX_RESOURCE; i++)
    {
        if (resource[i] < 0)
        {
            printf("资源不足,无法分配!\n");
            exit(-1);
        }
        else
        {
            ;
        }
    }
    // 执行进程
    for (int i = 0; i < MAX_PROCESS; i++)
    {
        RunProcess(resource, processPool[i]);
        printf("当前系统余量为:");
        for (int j = 0; j < MAX_RESOURCE; j++)
        {
            printf("%d ", resource[j]);
        }
        printf("\n");
        // 对最终资源进行检查
        if (i == MAX_PROCESS - 1)
        {
            for (int j = 0; j < MAX_RESOURCE; j++)
            {
                if (resource[j] != resourceBackup[j])
                {
                    printf("资源回收失败!\n");
                    exit(-1);
                }
                else
                {
                    ;
                }
            }
        }
    }
    printf("资源回收成功!\n");
    free(processPool);
}

你可能感兴趣的:(算法,c语言,c++)