银行家.docx
《银行家.docx》由会员分享,可在线阅读,更多相关《银行家.docx(14页珍藏版)》请在冰豆网上搜索。
银行家
银行家算法
#include"malloc.h"
#include"stdio.h"
#include"stdlib.h"
#definealloclensizeof(structallocation)
#definemaxlensizeof(structmax)
#defineavalensizeof(structavailable)
#defineneedlensizeof(structneed)
#definefinilensizeof(structfinish)
#definepathlensizeof(structpath)
structallocation
{
intvalue;
structallocation*next;
};
structmax
{
intvalue;
structmax*next;
};
structavailable/*可用资源数*/
{
intvalue;
structavailable*next;
};
structneed/*需求资源数*/
{
intvalue;
structneed*next;
};
structpath
{
intvalue;
structpath*next;
};
structfinish
{
intstat;
structfinish*next;
};
intmain()
{
introw,colum,status=0,i,j,t,temp,processtest;
structallocation*allochead,*alloc1,*alloc2,*alloctemp;
structmax*maxhead,*maxium1,*maxium2,*maxtemp;
structavailable*avahead,*available1,*available2,*workhead,*work1,*work2,*worktemp,*worktemp1;
structneed*needhead,*need1,*need2,*needtemp;
structfinish*finihead,*finish1,*finish2,*finishtemp;
structpath*pathhead,*path1,*path2;
printf("\n请输入系统资源的种类数:
");
scanf("%d",&colum);
printf("请输入现时内存中的进程数:
");
scanf("%d",&row);
printf("请输入已分配资源矩阵:
\n");
for(i=0;i{
for(j=0;j{
printf("请输入已分配给进程p%d的%c种系统资源:
",i,'A'+j);
if(status==0)
{
allochead=alloc1=alloc2=(structallocation*)malloc(alloclen);
alloc1->next=alloc2->next=NULL;
scanf("%d",&allochead->value);
status++;
}
else
{
alloc2=(structallocation*)malloc(alloclen);
scanf("%d,%d",&alloc2->value);
if(status==1)
{
allochead->next=alloc2;
status++;
}
alloc1->next=alloc2;
alloc1=alloc2;
}
}
}
alloc2->next=NULL;
status=0;
printf("请输入最大需求矩阵:
\n");
for(i=0;i{
for(j=0;j{
printf("请输入进程p%d种类%c系统资源最大需求:
",i,'A'+j);
if(status==0)
{
maxhead=maxium1=maxium2=(structmax*)malloc(maxlen);
maxium1->next=maxium2->next=NULL;
scanf("%d",&maxium1->value);
status++;
}
else
{
maxium2=(structmax*)malloc(maxlen);
scanf("%d,%d",&maxium2->value);
if(status==1)
{
maxhead->next=maxium2;
status++;
}
maxium1->next=maxium2;
maxium1=maxium2;
}
}
}
maxium2->next=NULL;
status=0;
printf("请输入现时系统剩余的资源矩阵:
\n");
for(j=0;j{
printf("种类%c的系统资源剩余:
",'A'+j);
if(status==0)
{
avahead=available1=available2=(structavailable*)malloc(avalen);
workhead=work1=work2=(structavailable*)malloc(avalen);
available1->next=available2->next=NULL;
work1->next=work2->next=NULL;
scanf("%d",&available1->value);
work1->value=available1->value;
status++;
}
else
{
available2=(structavailable*)malloc(avalen);
work2=(structavailable*)malloc(avalen);
scanf("%d,%d",&available2->value);
work2->value=available2->value;
if(status==1)
{
avahead->next=available2;
workhead->next=work2;
status++;
}
available1->next=available2;
available1=available2;
work1->next=work2;
work1=work2;
}
}
available2->next=NULL;
work2->next=NULL;
status=0;
alloctemp=allochead;
maxtemp=maxhead;
for(i=0;ifor(j=0;j{
if(status==0)
{
needhead=need1=need2=(structneed*)malloc(needlen);
need1->next=need2->next=NULL;
need1->value=maxtemp->value-alloctemp->value;
status++;
}
else
{
need2=(structneed*)malloc(needlen);
need2->value=(maxtemp->value)-(alloctemp->value);
if(status==1)
{
needhead->next=need2;
status++;
}
need1->next=need2;
need1=need2;
}
maxtemp=maxtemp->next;
alloctemp=alloctemp->next;
}
need2->next=NULL;
status=0;
for(i=0;i{
if(status==0)
{
finihead=finish1=finish2=(structfinish*)malloc(finilen);
finish1->next=finish2->next=NULL;
finish1->stat=0;
status++;
}
else
{
finish2=(structfinish*)malloc(finilen);
finish2->stat=0;
if(status==1)
{
finihead->next=finish2;
status++;
}
finish1->next=finish2;
finish1=finish2;
}
}
finish2->next=NULL;/*Initializationcompleated*/
status=0;
processtest=0;
for(temp=0;temp{
alloctemp=allochead;
needtemp=needhead;
finishtemp=finihead;
worktemp=workhead;
for(i=0;i{
worktemp1=worktemp;
if(finishtemp->stat==0)
{
for(j=0;jnext,worktemp=worktemp->next)
if(needtemp->value<=worktemp->value)
processtest++;
if(processtest==colum)
{
for(j=0;j{
worktemp1->value+=alloctemp->value;
worktemp1=worktemp1->next;
alloctemp=alloctemp->next;
}
if(status==0)
{
pathhead=path1=path2=(structpath*)malloc(pathlen);
path1->next=path2->next=NULL;
path1->value=i;
status++;
}
else
{
path2=(structpath*)malloc(pathlen);
path2->value=i;
if(status==1)
{
pathhead->next=path2;
status++;
}
path1->next=path2;
path1=path2;
}
finishtemp->stat=1;
}
else
{
for(t=0;talloctemp=alloctemp->next;
finishtemp->stat=0;
}
}
else
for(t=0;t{
needtemp=needtemp->next;
alloctemp=alloctemp->next;
}
processtest=0;
worktemp=workhead;
finishtemp=finishtemp->next;
}
}
path2->next=NULL;
finishtemp=finihead;
for(temp=0;temp{
if(finishtemp->stat==0)
{
printf("\n系统处于非安全状态!
\n");
exit(0);
}
finishtemp=finishtemp->next;
}
printf("\n系统处于安全状态.\n");
printf("\n安全序列为:
\n");
do
{
printf("p%d",pathhead->value);
}
while(pathhead=pathhead->next);
printf("\n");
return0;
}
Togetstarted,selectMATLABHelporDemosfromtheHelpmenu.
?
?
?
Errorusing==>mrdivide
Matrixdimensionsmustagree.
Errorin==>touruchanchuat4
x=b/d
x=
139.2801
267.6056
208.1377
>>dx=inv(b)
dx=
1.34590.25040.3443
0.56341.26760.4930
0.43820.43041.2167
?
?
?
Inputargument"b"isundefined.
Errorin==>jacobiat7
N=length(b);
>>A=[4,1,-1;1,-5,-1;2,-1,-6]
b=[13;-8;-2]
P=[0;0;0]
X=jacobi(A,b,P,10^(-4),20)
A=
41-1
1-5-1
2-1-6
b=
13
-8
-2
P=
0
0
0
k=
9
err=
2.5713e-005
X=
3.0000
2.0000
1.0000
>>A=[1,-9,-10;-9,1,5;8,7,1]
A=
1-9-10
-915
871
>>a=[-1,0,4]
a=
-104
>>p=[1,1,1]
p=
111
>>X=jacobi(A,b,P,10^(-4),20)
k=
20
err=
4.3622e+018
X=
1.0e+018*
-2.7077
2.7842
-0.2643
>>X=jacobi(A,b,P,10^(-4),20)
k=
20
err=
4.3622e+018
X=
1.0e+018*
-2.7077
2.7842
-0.2643
>>X=jacobi(A,b,P,10^(-4),20)
k=
20
err=
4.3622e+018
X=
1.0e+018*
-2.7077
2.7842
-0.2643
>>
A=[10,4,5;4,10,7;5,7,10]
b=[-1,4,0]
p=[1,1,1]
X=jacobi(A,b,P,10^(-4),20)
A=[5,-1,13;-1,2,4;-3,4,15]
b=[-1,0,4]
p=[1,1,1]
X=jacobi(A,b,P,10^(-4),20)
functionX=jacobi(A,b,P,delta,max1)
%A是n维非奇异阵
%B是n维向量
%P是初值
%delta是误差界
%X为所求的方程组AX=B的近似解
N=length(b);
fork=1:
max1
forj=1:
N
X(j)=(b(j)-A(j,[1:
j-1,j+1:
N])*P([1:
j-1,j+1:
N]))/A(j,j);
end
err=abs(norm(X'-P));
P=X';
if(errbreak
end
end
X=X';k,err
|
|
|
|
|
|
|