#include <stdio.h>
#include <stdlib.h>
#define M 3 // 资源数
#define N 4 // 进程数量
int Resource[M]; // 每个资源的总数
int Available[M]; // 每个资源的可用资源数
int MAX[N][M]; // 每个进程的最大资源需求
int Allocation[N][M]; // 每个进程已经分配的资源数
int Need[N][M]; // 每个进程还需要的资源数
void init_resources();
void check_init(int i, int Temp[M]);
int check_safety(int i);
void allocate_resources(int i);
int main(){
init_resources(); // 初始化值
return 0;
}
void init_resources() {
int i, j;
int v;
printf("请输入%d个资源的总数:\n", M);
for (j = 0; j < M; ++j) {
scanf("%d", &Resource[j]);
Available[j] = Resource[j];
}
printf("输入%d个进程需要的最大资源数:\n", N);
for (i = 0; i < N; ++i) {
for (j = 0; j < M; ++j) {
scanf("%d", &MAX[i][j]);
}
}
printf("输入%d个进程对%d个资源的已分配数:\n", N, M);
for (i = 0; i < N; ++i) {
printf("进程%d分配的%d类资源数:\n", i, M);
for (j = 0; j < M; j++) {
scanf("%d", &Allocation[i][j]);
Need[i][j] = MAX[i][j] - Allocation[i][j];
if (Need[i][j] < 0) {
Need[i][j] = 0;
}
check_init(i, Allocation[i]);
}
}
for (j = 0; j < M; j++) {
for (i = 0; i < N; i++) {
Available[j] -= Allocation[i][j];
}
}
printf("初始化序列为:\n");
printf("进程名称| 最大申请资源 | 已经申请资源 | 需要的资源 | 可用资源\n");
for (i = 0; i < N; i++)
{
if (i == 0)
{
printf("进程p%d \t %2d %2d %2d \t %2d %2d %2d \t %2d %2d %2d \t %2d %2d %2d\n", i + 1, MAX[i][0], MAX[i][1],
MAX[i][2], Allocation[i][0], Allocation[i][1], Allocation[i][2], Need[i][0], Need[i][1], Need[i][2],
Available[0], Available[1], Available[2]);
} else
{
printf("进程p%d \t %2d %2d %2d \t %2d %2d %2d \t %2d %2d %2d\n", i + 1, MAX[i][0], MAX[i][1], MAX[i][2],
Allocation[i][0], Allocation[i][1], Allocation[i][2], Need[i][0], Need[i][1], Need[i][2]);
}
}
for (i = 0; i < N; i++) {
if (check_safety(i) == M) {
v = i ;
allocate_resources(i);
}
}
// 添加新的功能
for (i = 0; i < v; i++) {
// 内部循环 从匹配到的进程开始反过来遍历匹配
if (check_safety(i) == M) {
v = i ;
allocate_resources(i);
}
}
}
void allocate_resources(int i) {
printf("匹配到进程%d,准备分配资源\n", i);
// 分配资源
for (int j = 0; j < M; j++) {
Allocation[i][j] += Available[j];
if (Allocation[i][j] >= MAX[i][j]) {
Available[j] += Allocation[i][j];
} else {
printf("分配给进程%d后的资源仍然不满足此进程的最大值\n", i);
break;
}
}
}
void check_init(int i, int Temp[M]) {
int j;
for (j = 0; j < M; ++j) {
if (Temp[j] > MAX[i][j]){
printf("输入错误:进程%d, 资源类别%d的已分配资源大于最大资源需求\n", i, j + 1);
exit(1);
} else if (Temp[j] > Resource[j]){
printf("输入错误:进程%d的已分配资源大于总可用资源\n", i);
exit(2);
} else if (MAX[i][j] > Resource[j]){
printf("输入错误:进程%d的最大资源需求大于总资源数\n", i);
exit(3);
}
}
}
int check_safety(int i) {
for(int j = 0; j < M; j++) {
if (Need[i][j] > Available[j]) {
return 0; // 该进程不能分配资源
}
}
return M; // 该进程可以分配资源
}