#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
int *available;
int *allocation;
int *max;
int *need;
int *request;
int resNum, proNum;
int requestPro;
//获取初始情况下各进程资源情况
void inputRes()
{
int i,j;
int res;
printf("请输入进程数:");
scanf("%d", &proNum);
printf("请输入资源数:");
scanf("%d", &resNum);
available = (int*)malloc(sizeof(int) * resNum);
allocation = (int*)malloc(sizeof(int) * resNum * proNum);
max = (int*)malloc(sizeof(int) * resNum * proNum);
need = (int*)malloc(sizeof(int) * resNum * proNum);
fflush(stdin);
printf("请输入各进程所需的最大资源数/n");
for (i = 0; i < proNum; i++){
printf("P%d", i);
for (j = 0; j < resNum; j++){
printf(" ");
res = (getch() - 48);
*(max + (i * resNum) + j) = res;
printf("%d", res);
fflush(stdin);
}
printf("/n");
}
printf("请输入各进程已分配资源数/n");
for (i = 0; i < proNum; i++){
printf("P%d", i);
for (j = 0; j < resNum; j++){
printf(" ");
res = (getch() - 48);
*(allocation + (i * resNum) + j) = res;
printf("%d", res);
fflush(stdin);
}
printf("/n");
}
printf("各进程还需要的资源数/n");
for (i = 0; i < proNum; i++){
printf("P%d", i);
for (j = 0; j < resNum; j++){
*(need + (i * resNum) + j) = *(max + (i * resNum) + j) - *(allocation + (i * resNum) + j);
printf("%6d",*(need + (i * resNum) + j));
}
printf("/n");
}
printf("系统可用资源数/n");
for (i = 0; i < resNum; i++){
printf(" ");
res = (getch() - 48);
available[i] = res;
printf("%d", res);
fflush(stdin);
}
printf("/n");
}
//输出各进程的资源情况
void outputRes()
{
int i, j;
printf("%12s %15s %10s %15s/n", "Max", "Allocation", "Need", "Available");
for (i = 0; i < proNum; i++){
printf("P%d",i);
printf(" |");
for (j = 0; j < resNum; j++){
printf("%3d", (*(max + (i * resNum) + j)));
}
printf(" |");
for (j = 0; j < resNum; j++){
printf("%3d", (*(allocation + (i * resNum) + j)));
}
printf(" |");
for (j = 0; j < resNum; j++){
printf("%3d", (*(need + (i * resNum) + j)));
}
printf(" |");
for (j = 0; j < resNum; j++){
printf("%3d", available[j]);
}
printf("/n");
}
}
//获得请求分配资源进程对各资源的请求数量
void getRequestRes()
{
int i;
int res;
printf("请输入请求资源的进程号:");
scanf("%d", &requestPro);
printf("请输入%d对各资源的请求数量:", requestPro);
request = (int*)malloc(sizeof(int) * resNum);
for (i = 0; i < resNum; i++){
printf(" ");
res = (getch() - 48);
request[i] = res;
printf("%d", res);
fflush(stdin);
}
printf("/n");
}
//为请求分配资源的进程分配请求的资源
int assignRes()
{
int i;
getRequestRes();
//判断请求的资源是否大于该进程所需要的资源
for (i = 0; i < resNum; i++){
if (request[i] > *(need + (requestPro * resNum) + i)){
printf("请求资源大于所需资源数,无法分配/n");
return 0;
}
}
//判断请求的资源是否大于系统可用资源
for (i = 0; i < resNum; i++){
if (request[i] > available[i]){
printf("请求资源大于可用资源数,无法分配/n");
return 0;
}
}
//分配资源后修改相应资源状况
for (i = 0; i < resNum; i++){
*(allocation + (requestPro * resNum) + i) += request[i];
*(need + (requestPro * resNum) + i) -= request[i];
available[i] -= request[i];
}
return 1;
}
//给请求分配资源的进程分配资源后进行安全性检查
int secureCheck()
{
int *work;
bool *finish;
int i, j;
bool finishflag, findrun;
work = (int*)malloc(sizeof(int) * resNum);
finish = (bool*)malloc(sizeof(int) * proNum);
finishflag = false;
findrun = false;
for (i = 0; i < resNum; i++){
work[i] = available[i];
}
for (i = 0; i < proNum; i ++){
finish[i] = false;
}
while(!finishflag){
finishflag = true;
for (i = 0; i < proNum; i++){
if (!finish[i]){
for (j = 0; j < resNum; j++){
if (*(need + (i * resNum) + j) <= work[j])
findrun = true;
else{
findrun = false;
break;
}
}
if (findrun){
for (j = 0; j < resNum; j++)
work[j] = work[j] + *(allocation + (i * resNum) + j);
finish[i] = true;
finishflag = false;
}
else{
for (int k = 0; k < proNum; k++){
if (k != i){
if (!finish[k]){
for (int l = 0; l < resNum; l++){
if (*(need + (k * resNum) + l) <= work[l])
findrun = true;
else{
findrun = false;
break;
}
}
if (findrun){
for (j = 0; j < resNum; j++)
work[j] = work[j] + *(allocation + (k * resNum) + j);
finish[k] = true;
finishflag = false;
break; //跳出for循环
}
}
}
else
continue;//如果是请求量大于系统能提供量的那个进程则跳过
}
if (!findrun){//如果资源分配不安全,则将请求的资源还给系统
for (int l = 0; l < resNum; l++){
*(allocation + (requestPro * resNum) + l) -= request[l];
*(need + (requestPro * resNum) + l) += request[l];
available[l] += request[l];
}
return 0;
}
}
}
}
}
return 1;
}
void main()
{
char ch;
inputRes();
printf("/n");
printf("是否需要分配资源(Y//N):");
while ((ch = getchar()) != 'N'){
if (!assignRes()){
printf("是否需要分配资源(Y//N):");
continue;
}
printf("虚拟分配请求资源后/n");
outputRes();
if (!secureCheck()){
printf("资源分配不安全,不能对%d进行资源分配/n", requestPro);
}
else{
printf("%d请求的资源成功分配/n", requestPro);
outputRes();
}
printf("是否需要分配资源(Y//N):");
}
free(max);
free(available);
free(allocation);
free(need);
free(request);
getchar();
}