当前位置:文档之家› 操作系统实验报告死锁的避免

操作系统实验报告死锁的避免

1.
使用C++实现模拟随机算法和银行家算法
2.
(1)了解死锁的产生原因(随机算法)
(2)理解死锁的解决办法(银行家算法)
3•
使用随机算法和银行家算法设计程序
4•
银行家算法流程图
安全性算法流程图
5•
#i nclude <stdio.h>
#i nclude<stdlib.h> typedef struct
{
Available.A += res->A;
Available.B += res->B;
Available.C += res->C;
Allocati on [process].A -= res->A;
Allocati on [process].B -= res->B;
Allocati on[ process].C -= res->C;
〃可分配资源
fscan f(fp1,"%d%d%d",&Available.A,&Available.B,&Available.C);
//最大需求矩阵MAX
for (i=O;i<PNUMBER;i++)
{
fsea nf(fp1,"%d%d%d",&Max[i].A,&Max[i].B,&Max[i].C);
Need[process].A += res->A;
Need[process].B += res->B;
Need[process].C += res->C; }//安全性检查
bool SafeCheck()
{
RES Work;
Work.A = Available.A;
Work.B = Available.B;
〃可分配资源
printf("输入可分配资源\n");
sca nf("%d%d%d",&Available.A,&Available.B,&Available.C);
//最大需求矩阵MAX
printf("输入最大需求矩阵%dx%d\n",PNUMBER,PNUMBER);
for (i=0;i<PNUMBER;i++)
}
void loadC on fig()
{
FILE *fp1;
if ((fp1=fope n("e on fig.txt","r"))==NULL)
{
printf("没有发现配置文件,请手动输入!!!\n"); setCo nfig();
}
else{
int i=0;
printf("发现配置文件,开始导入..\n");
Work.C = Available.C;
boolFi nish[PNUMBER] = {false,false,false};
inti;
intj = 0;
for (i = 0; i < PNUMBER; i++)
{
〃是否已检查过
if(Fini sh[i] == false)
{
//是否有足够的资源分配给该进程
RES Need[PNUMBER];
〃可用资源向量
RES Available={0,0,0};
//安全序列
int safe[PNUMBER];
void setCo nfig()
{
int i=0,j=0;
prin tf("================开始手动配置资源==================\n");
}
//需求矩阵
printf("输入需求矩阵%dx%d\n",PNUMBER,PNUMBER);
for (i=O;i<PNUMBER;i++)
{
sea nf("%d%d%d",&Need[i].A,&Need[i].B,&Need[i].C);
}
prin tf("================结束配置资源==================\n");
{
int A;
int B;
int C;
}RES;
#defi ne false 0
#defi ne true 1
〃系统中所有进程数量
#defi ne PNUMBER 3
//最大需求矩阵
RES Max[PNUMBER];
//已分配资源数矩阵
RES Allocatio n[ PNUMBER];
//需求矩阵
}
//已分配矩阵Alloc
for (i=O;i<PNUMBER;i++)
{
fsea nf(fp1,"%d%d%d",&Alloeatio n[i].A,&Alloeatio n[ i].B,&Alloeati on [i].C);
}
//需求矩阵
for (i=O;i<PNUMBER;i++)
{
fsea nf(fp1,"%d%d%d",&Need[i].A,&Need[i].B,&Need[i].C);
{
sca nf("%d%d%d",&Max[i] .A,&Max[i].B,&Max[i].C);
}
//已分配矩阵Alloc
printf("输入已分矩阵%dx%d\n",PNUMBER,PNUMBER);
for (i=0;i<PNUMBER;i++)
{
sca nf("%d%d%d",&Allocati on [i].A,&Allocatio n[ i].B,&Allocati on [i].C);
if(Need[i].A<=Work.A&&Need[i].B <= Work.B && Need[i].C <= Work.C)
{
〃有则使其执行完成,并将已分配给该进程的资源全部回收
Work.A+=Allocatio n[i].A;
Work.B += Allocatio n[i].B;
Work.C += Allocatio n[i].C;
Allocati on[ process].C += res->C;
Need[process].A -= res->A;
Need[process].B -= res->B;
Need[process].C -= res->C; } //若试探分配后进入不安全状态,将分配回滚void RollBack(i nt process,RES *res)
}
//试探分配
void ProbeAlloc(i nt process,RES *res) {
Available.A -= res->A;
Available.B -= res->B;
Available.C -= res->C;
Allocati on[ process].A += res->A;
Allocati on[ process].B += res->B;
相关主题