?? banker.c
字號:
#include<stdio.h>
#include <string.h>
#define RES 3
#define PRO 5
int Security();
int rqt[PRO][RES];
int mx[PRO][RES]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int alloc[PRO][RES]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
int avl[RES]={3,3,2};
int ned[PRO][RES]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
int Work[RES]; /*工作數(shù)組*/
int tempWork[PRO][RES];
int Finish[PRO];
int p[PRO]; /*記錄序列*/
int static Flag=0;
void PrintHead()
{
printf(" ----------------------------------------------------------------------\n");
printf(" | Max | Allocation | Need | Available |\n");
printf(" ----------------------------------------------------------------------\n");
printf(" | A B C | A B C | A B C | A B C |\n");
printf(" ----------------------------------------------------------------------\n");
}
void List()
{
int i;
for(i=0;i<PRO;i++)
if (i==0)
printf("P%d| %d %d %d | %d %d %d | %d %d %d | %d %d %d |\n",i,mx[i][0],mx[i][1],mx[i][2],alloc[i][0],alloc[i][1],alloc[i][2],ned[i][0],ned[i][1],ned[i][2],avl[0],avl[1],avl[2]);
else
printf("P%d| %d %d %d | %d %d %d | %d %d %d | |\n",i,mx[i][0],mx[i][1],mx[i][2],alloc[i][0],alloc[i][1],alloc[i][2],ned[i][0],ned[i][1],ned[i][2]);
printf(" ----------------------------------------------------------------------\n");
printf(" T0時刻的資源分配表 \n");
}
void Print()
{
printf(" -------------------------------------------------------------------------\n");
printf(" | Work | Need | Allocation | Work+Allocation | | \n");
printf(" ---------------------------------------------------------------| Finish |\n");
printf(" | A B C | A B C | A B C | A B C | |\n");
printf(" -------------------------------------------------------------------------\n");
}
void Success()
{
int j;
int i;
int k;
int temp_work[1][3];
for(j=0;j<PRO;j++)
{
i=p[j];
if (j==PRO-1)
{
for (k=0;k<3;k++)
{
temp_work[0][k]=tempWork[i][k]+alloc[i][k];
}
printf("P%d| %d %d %d | %d %d %d | %d %d %d | %d %d %d |",i,tempWork[i][0],tempWork[i][1],tempWork[i][2],ned[i][0],ned[i][1],ned[i][2],alloc[i][0],alloc[i][1],alloc[i][2],temp_work[0][0],temp_work[0][1],temp_work[0][2]);
}
else
printf("P%d| %d %d %d | %d %d %d | %d %d %d | %d %d %d |",i,tempWork[i][0],tempWork[i][1],tempWork[i][2],ned[i][0],ned[i][1],ned[i][2],alloc[i][0],alloc[i][1],alloc[i][2],tempWork[p[j+1]][0],tempWork[p[j+1]][1],tempWork[p[j+1]][2]);
if (Finish[i]==1) printf(" true |");
else printf(" false |");
printf("\n");
}
printf(" -------------------------------------------------------------------------\n");
printf(" T0時刻的安全序列 \n");
}
int Security() /*安全性算法*/
{
int i,j,k,l=0;
int tempflag=0;
for(i=0;i<RES;i++)
Work[i]=avl[i];
for(i=0;i<PRO;i++)
{
Finish[i]=0;
}
for(i=0;i<PRO;i++)
{
if(Finish[i]==1)
{
continue;
}
else
{
for(j=0;j<RES;j++)
{
if(ned[i][j]>Work[j])
{
break;
}
}
if(j==RES)
{
Finish[i]=1;
if (tempflag==0)
{
for (k=0;k<RES;k++)
tempWork[i][k]=avl[k];
}
for(k=0;k<RES;k++)
{
Work[k]+=alloc[i][k];
if (tempflag!=0)
{
tempWork[i][k]=tempWork[p[l-1]][k]+alloc[p[l-1]][k];
}
}
tempflag++;
p[l++]=i;
i=-1;
}
else
{
continue;
}
}
if(l==PRO)
{
printf(" 系統(tǒng)是安全的\n");
printf(" 安全序列:");
for(i=0;i<l;i++)
{
printf("%d",p[i]);
if(i!=l-1)
{
printf("-->");
}
}
printf("\n");
if (Flag==0)
{
Print();
Success();
}
Flag++;
return 1;
}
}
printf(" 系統(tǒng)是不安全的\n");
return 0;
}
void Banker() /*銀行家算法*/
{
int i,ProId;
char again;
while(1)
{
temp:printf(" 請輸入要申請資源的進程號 ");
scanf("%d",&ProId);
printf(" 請輸入進程所請求的各資源的數(shù)量 Request(A B C) ");
scanf("%d %d %d",&rqt[ProId][0],&rqt[ProId][1],&rqt[ProId][2]);
for(i=0;i<RES;i++)
{
if(rqt[ProId][i]>ned[ProId][i])
{
printf(" 您輸入的請求數(shù)超過進程的需求量,請重新輸入!\n");
goto temp;
}
if(rqt[ProId][i]>avl[i])
{
printf(" 您輸入的請求數(shù)超過系統(tǒng)有的資源數(shù),請重新輸入!\n");
goto temp;
}
}
for(i=0;i<RES;i++)
{
avl[i]-=rqt[ProId][i];
alloc[ProId][i]+=rqt[ProId][i];
ned[ProId][i]-=rqt[ProId][i];
}
if(Security())
{
printf(" 資源請求分配成功!\n");
}
else
{
printf(" 您的請求被拒絕!\n");
}
for(i=0;i<PRO;i++)
{
Finish[i]=0;
}
for(i=0;i<RES;i++) //資源回收
{
avl[i]+=rqt[ProId][i];
alloc[ProId][i]-=rqt[ProId][i];
ned[ProId][i]+=rqt[ProId][i];
}
printf(" 您還想再次請求分配嗎?是請按y/Y,否請按其它鍵");
getchar();
scanf("%c",&again);
if(again=='y'||again=='Y')
{
continue;
}
break;
}
}
int main()
{
int i=0,j=0,k;
printf(" ----------------------------------------------------------------------\n");
printf(" | |\n");
printf(" | |\n");
printf(" | 銀行家算法 0500303132 |\n");
printf(" | 05計算機1 周文兵 |\n");
printf(" | |\n");
printf(" ----------------------------------------------------------------------\n");
printf("\n");
printf("\n");
PrintHead();
List();
k=Security();
if (k==1)
{
Banker();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -