// 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 <stdio.h>
#include <stdlib.h>
#include <time.h>
#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);
}
09-23
2101
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
01-18