📄 mybanker.c
字号:
#include <stdio.h>
#include <stdlib.h>
//#define ResourceNum 4 // 磊盔 荐
//#define ProcessNum 5 // 橇肺技胶 荐
//Max : 橇肺技胶狼 弥措 夸备 摹
//Allocation : 泅犁 亲寸茄 磊盔
//Available : 荤侩啊瓷 磊盔
//Need : 阿 橇肺技胶狼 巢篮 夸备
//Global Variable
/*int Available[ResourceNum]={1,5,2,0};
int Max[ProcessNum][ResourceNum]={{0, 0, 1, 2},{1, 7, 5, 0}, {2, 3, 5, 6}, {0, 6, 5, 2}, {0, 6, 5, 6}};
int Allocation[ProcessNum][ResourceNum]={{0, 0, 1, 2}, {1, 0, 0, 0}, {1, 3, 5, 4}, {0, 6, 3, 2}, {0, 0, 1, 4}};
int Need[ProcessNum][ResourceNum];
int Work[ResourceNum];
*/
int** Max; // 弥措 夸备摹
int** Allocation; //泅犁 且寸 磊盔
int** Need; //夸备
int* Work; //篮青盔 舅绊府硫俊 静捞绰 吝酶
int* Available; // 啊瓷 磊盔
int* ProcessSet; // 橇肺技胶 笼钦
int* Request; //夸没 磊盔
int ResourceNum ; // 磊盔 荐
int ProcessNum ; // 橇肺技胶 荐
/* 盔夯 焊粮 鞘夸 (墨乔夯)*/
int** MaxTemp;
int** AllocationTemp;
int** NeedTemp;
int* WorkTemp;
int* AvailableTemp;
/*
int AvailableTemp[ResourceNum]={1,5,2,0};
int MaxTemp[ProcessNum][ResourceNum]={{0, 0, 1, 2},{1, 7, 5, 0}, {2, 3, 5, 6}, {0, 6, 5, 2}, {0, 6, 5, 6}};
int AllocationTemp[ProcessNum][ResourceNum]={{0, 0, 1, 2}, {1, 0, 0, 0}, {1, 3, 5, 4}, {0, 6, 3, 2}, {0, 0, 1, 4}};
int NeedTemp[ProcessNum][ResourceNum];
int ProcessSet[ProcessNum];
int Request[ResourceNum];
*/
int count = 0 ; // 己傍 墨款飘
//Function
void calNeed(); // 阿 橇肺技胶狼 巢篮 夸备 绝单捞飘
void printNeed();
void restoreValue(); // 盔夯蔼栏肺 汗备
int checkRe(); // 硅凯 蔼 吝汗 八荤
// Step 1: if (Requesti <= Needi ) go to Step2
// Step 2 : if (Requesti <= Available) go to Step3
// Step 3 : Available -= Requesti
// Allocation += Requesti
// Needi -= Requesti
void requestGet(int processN); // copy current Process's request to Request[]
int step1(int processN);
int step2(int processN);
void step3(int processN);
int checkValid(int processN); // 救沥 惑怕 八荤 舅绊府硫狼 炼扒 八荤
void workAdd(processN);
//int checkSafe(int * Process);
void setWork(); //Work 俊 Available蔼 汗荤
void printTable(); // 钎 免仿
int bankerAlgoritm (int processN) ; //篮青盔 舅绊府硫
void printProcess();
void copyValue ();
void readValue();
void main()
{
int i,j,k,l,m,n;
int flag = 0;
readValue();
copyValue ();
calNeed(); // 鞘夸摹 拌魂
for (j=0; j<ProcessNum; j++)
{
for (k = 0; k<ProcessNum; k++)
{
for (l = 0; l<ProcessNum; l++)
{
for (m = 0; m<ProcessNum; m++)
{
for (n = 0 ; n<ProcessNum; n++)
{
ProcessSet[0] = j;
ProcessSet[1] = k;
ProcessSet[2] = l;
ProcessSet[3] = m;
ProcessSet[4] = n;
if (checkRe()) // 吝汗 酒聪搁 ..
{
for (i=0; i<ProcessNum; i++)
{
if (!bankerAlgoritm (ProcessSet[i]))
{
flag = 1 ; //茄锅捞扼档 角菩窍搁
break;
}
}
if (!flag) // 己傍窍搁
{
printProcess();
count++;
flag = 0;
restoreValue(); // 茄锅 窍绊 唱搁 汗备 秦 林绢具 窃 ^^:
calNeed();
}
else //角菩
{
flag = 0;
restoreValue(); // 茄锅 窍绊 唱搁 汗备 秦 林绢具 窃 ^^:
calNeed();
}
}
}
}
}
}
}
printTable();
printf("\n醚 啊瘤荐 %d",count);
getchar(); // pause
}
int bankerAlgoritm (int processN)
{
//int Finish[ProcessNum]={0, 0, 0, 0, 0};
int check ;
int i;
requestGet(processN); // 窃荐 捞抚 官厕
check = step1(processN);
if (!check)
{
// printf("夸没磊盔荐啊 鞘夸磊盔荐焊促 臭嚼聪促 !! Error \n");
return 0;
}
check = step2(processN);
if (!check)
{
//printf("荤侩啊瓷 磊盔焊促 夸没窍绰 磊盔捞 歹 腹嚼聪促 !! Error \n");
return 0;
}
step3(processN); //update
setWork();//惑怕 八荤傈 檬扁拳
//救沥惑怕 八荤 start
for (i=0; i<ResourceNum ; i++) // 葛电 磊盔阑 捣促
{
if (Need[processN][i] <= Work[i]) // 炼扒 嘎绰瘤
{
Work[i] += Allocation[processN][i];
}
else //救沥惑怕啊 酒聪骨肺 狐廉唱咳 角菩 ...
{
restoreValue(); // 盔贰 蔼 汗备
// printf("橇肺技胶 %d篮 救沥惑怕啊 酒凑聪促 " , processN);
return 0 ; //角菩
}
}
for (i=0; i<ResourceNum ; i++) // 己傍矫 磊盔篮 眠啊 凳 ...
{
Available[i] = Work[i] ;
}
return 1; // 己傍
//printf("橇肺技胶 %d篮 救沥惑怕 涝聪促 ",processN);
//isSafe = checkSafe(Finish);
//救沥惑怕 八荤 end
}
void calNeed() {
int i,j;
for (i=0; i<ProcessNum; i++){
for (j=0; j<ResourceNum; j++){
Need[i][j] = Max[i][j] - Allocation[i][j] ;
}
}
}
void printNeed() {
int i, j;
for (i=0; i<ProcessNum; i++){
for (j=0; j<ResourceNum; j++){
printf("%d ",Need[i][j]);
}
printf("\n");
}
}
void requestGet(int processN) // copy current Process's request to Request[]
{
int i;
for (i=0; i<ResourceNum; i++)
Request[i] = Need[processN][i] ;
}
int step1(int processN) {
int i;
requestGet(processN); //
for (i = 0; i<ResourceNum ; i++) // Check Step1
{
if (Request[i] > Need[processN][i])
return 0; // 角菩
}
return 1; //己傍
}
int step2(int processN) {
int i;
for (i = 0; i<ResourceNum ; i++) // Check Step1
{
if (Request[i] > Available[i])
return 0; // 角菩
}
return 1;
}
void step3(int processN){
int i;
for (i = 0; i<ResourceNum ; i++) // step3
{
Available[i] -= Request[i];
Allocation[processN][i] += Request[i];
Need[processN][i] -= Request[i];
}
}
void restoreValue()
{
int i, j;
for (i=0; i<ProcessNum ; i++)
{
for (j=0; j<ResourceNum; j++)
{
Max[i][j] = MaxTemp[i][j];
Allocation[i][j] = AllocationTemp [i][j];
Need[i][j] = NeedTemp [i][j];
}
Available[i] = AvailableTemp[i];
}
}
//鞘夸绝澜
int checkSafe(int * Process){
int i;
for (i =0 ; i<ProcessNum ; i++)
if (Process[i] !=1 ) return 0; //NonSafe
return 1; //Safe
}
void setWork()
{
int i;
for (i=0 ; i<ResourceNum ; i++)
Work[i] = Available[i];
}
void printTable()
{
int i,j;
//咯扁绰 巩力啊 乐澜 .. 畴啊促
printf("\n\n\n");
printf(" Allocation Max Available \n");
printf("---------------------------------------------------------------\n");
printf("\tA B C D \tA B C D \tA B C D\n");
//咯扁绰 沥惑
for (i=0; i<ProcessNum ; i++)
{
printf("P%d\t",i);
for (j=0; j<ResourceNum; j++)
printf("%d ",Allocation[i][j]);
printf("\t");
for (j=0; j<ResourceNum; j++)
printf("%d ",Max[i][j]);
printf("\t");
if (i==0)
{
for (j=0; j<ResourceNum; j++)
printf("%d ",Available[j]);
}
printf("\n");
}
}
int checkRe()
{
int i,j;
for (i=0; i<ProcessNum; i++)
{
for (j=i+1; j<ProcessNum; j++)
{
if (ProcessSet[i]==ProcessSet[j])
return 0; // 吝汗 乐促.
}
}
return 1;
}
void printProcess()
{
int i;
printf(" 救沥等 惑怕甫 蜡瘤且 荐 乐绰 橇肺技胶甸狼 荐青鉴辑 : ");
for (i = 0; i< ProcessNum; i++)
printf("%d ",ProcessSet[i]);
printf("\n\n");
}
void copyValue ()
{
int i, j;
for (i=0; i<ProcessNum ; i++)
{
for (j=0; j<ResourceNum; j++)
{
MaxTemp[i][j] = Max[i][j];
AllocationTemp [i][j] = Allocation[i][j];
NeedTemp [i][j] = Need[i][j] ;
}
AvailableTemp[i] = Available[i] ;
}
}
void readValue()
{
FILE * fp ;
int i,j;
fp = fopen ("table.txt","rt");
fscanf(fp, "%d", &ResourceNum); // 磊盔 荐
fscanf(fp, "%d", &ProcessNum); // 橇肺技胶 荐
Max = (int **)malloc(sizeof(int *)* ProcessNum);
Allocation = (int **)malloc(sizeof(int *)* ProcessNum);
Need = (int **)malloc(sizeof(int *)* ProcessNum);
Available = (int *)malloc(sizeof(int) * ResourceNum);
Work = (int *)malloc(sizeof(int) * ResourceNum);
ProcessSet = (int *)malloc(sizeof(int) * ProcessNum);
Request = (int *)malloc(sizeof(int) * ResourceNum);
MaxTemp = (int **)malloc(sizeof(int *)* ProcessNum);
AllocationTemp = (int **)malloc(sizeof(int *)* ProcessNum);
NeedTemp = (int **)malloc(sizeof(int *)* ProcessNum);
AvailableTemp = (int *)malloc(sizeof(int) * ResourceNum);
WorkTemp = (int *)malloc(sizeof(int) * ResourceNum);
for (i = 0 ; i<ProcessNum ; i++) {
Max[i] = (int* )malloc(sizeof(int)* ResourceNum);
Allocation[i] = (int* )malloc(sizeof(int)* ResourceNum);
Need[i] = (int* )malloc(sizeof(int)* ResourceNum);
MaxTemp[i] = (int* )malloc(sizeof(int)* ResourceNum);
AllocationTemp[i] = (int* )malloc(sizeof(int)* ResourceNum);
NeedTemp[i] = (int* )malloc(sizeof(int)* ResourceNum);
}
//咯扁辑 何磐 蔼 檬扁拳
//Allocation 檬扁拳
for (i=0; i<ProcessNum ; i++)
{
for (j=0; j<ResourceNum ; j++)
{
fscanf(fp, "%d", &Allocation[i][j]);
}
}
//Max 蔼
for (i=0; i<ProcessNum ; i++) {
for (j=0; j<ResourceNum ; j++)
fscanf(fp, "%d", &Max[i][j]);
}
//Available 蔼
for (i=0; i<ResourceNum ; i++)
fscanf(fp, "%d", &Available[i]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -