版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
洛阳理工学院实验报告
学院计信学院班级学号姓名
课程名称操作系统实验日期10.17
实验名称实验二银行家算法成绩
实验目的:
1.了解进程产生死锁的原因,了解为什么要进行死锁的避免。
2.掌握银行家算法的数据结构,了解算法的执行过程,加深对银行家算法
的理解。
实验原理:
n个并发进程共享m个系统资源的系统,进程可动态申请资源和释放资源。
系统按各进程的申请动态的分配资源,先对用户提出的请求进行合法性检查,
再进行预分配,利用安全性检测算法进行安全性检测,如果系统分配资源,系
统进入安全状态,则预分配就是正式分配,如果系统分配资源,系统进入不安
全状态,则撤销预分配。
实验内容:
4include<stdio.h>
与include<stdlib.h>
「defineTRUE1
4defineFALSE0
inti,j,k,1;
intflag;
charc;
typedefstructBanker{
int"Available;〃可利用资源向量
int**Max;〃最大需求矩阵
int**A1location;〃分配矩阵
int**Need;〃需求矩阵
int**Rcqust;〃申请各类资源数量
int*Work;〃工作向量
int*Finish:〃结束向量
(Process;
intBank(Process"process,intm,intn);
intSafe(Process*process,intm,intn);
voidMax(Process*process,intm,intn);
voidNeed(Process"process,intm,intn);
voidAllocation(Process*process,intm,intn);
voidAvailable(Process^process,intn);
intRcqust(Process*process,intm,intn);
intBank(Process*process,intm,intn)
(
do〃资源请求失败或者系统不安全时flag=0,并重新输入。
(
if((flag=Requst(process,m,n))==1)
{
printf("请求并试分配成功。\n〃);
for(j=0;j<n;j++)
(
(proccss->Available)[j]_=(proccss->Requst)[1][j];
(process->A11ocation)[1][j]+=(process->Requst)[1][j];
(process->Need)[1][j]-=(process->Requst)[1][j];
)
)
if(flag==l&&(flag=Safe(process,m,n))==0)//系统不安全,撤销资源
试分配
{
prinif("撤销资源试分配。\n〃);
for(j=0;j<n;j++)
(process->Available)[j]+=(proccss->Rcqust)[1][j];
(process->Allocation)[1][j]-=(process->Requst)[1][j];
(process->Need)[1][j]+=(process->Requst)[1][j];
)
}
}while(flag==0);
if(flag==l)
(
printf("分配成功。\n");
printf(〃是否继续请求资源分配?输入Y继续,输入y结束:\n〃);
getchar();
c=getchar();
if(c==,Y')return1;
if(c==,y')return0:
)
(
intSafe(Process"process,intm,intn)
(
(process->Work)=(int*)mal1oc(sizeof(int)*n);
for(j=0;j<n;j++)
(process->Work)[j]=(process->Available)[j];//系统可提供给进程
继续运行所需的各类资源数目
(process->Finish)=(int*)nicilloc(sizeof(int)*m);
for(i=0;i<m;i++)
(process->Finish)[i]:FALSE;
k=m;
intflagl;//当有不符合条件的资源时标记为0
intflag2;〃当所有进程不都分配成功时标记为0
int*s=(int*)malloc(sizeof(int)*m);〃记录安全序列
do
for(i=0;i<m;i++)//一轮分配
if((process->Finish)[i]二二FALSE)
(
flagl=l;
for(j=0;j<n;j++)
if((process->Need)[i][j]>(process->Work)[j])
flagl=0;//有不符合条件的资源
if(flagl==l)
(
for(j=0;j<n;j++)
*((process->Work)+j)+=*((process->Allocation)[i]+j);
(process->Finish)[i]=TRUE;
*s=i;
s++;
)
}
k--;〃每完成一次进程分配时k减1,以便跳出循环和防止死循环
}while(k>0);
flag2=l;
for(i=Oi〈叫i++)〃判断是否所有进程都完成
(
if((process->Finish)[i]—FALSE)
{
flag2=0;
break;
)
)
if(flag2==0)
printf(〃当前状态不安全!\n");
return0;
)
else
(
printf("当前状态安全!\n");
for(i=0;i<m;i++)s-;
printf("安全序列为:”);
for(i=0;i<m;i++)
printf(*P%d
printf(〃\n〃);
free(s);
return1;
)
(
voidMax(Process*process,intm,intn)
(
process->Max=(int**)malloc(sizcof(int〃分配m个指针,用来
指向数组的首地址
for(i=0;i<m;i++)
(process->Max)[i]=(int*)malloc(sizeof(int)*n);//为每个数组分
配n个指针元素
printf(“输入各进程对各类资源的最大需求量:\n〃);
for(i=0;i<m;i++)
(
printfC'P%d:\n",i);
for(j=0;j<n;j++)
scanf("%d”,((process->Max)[i]+j));
)
}
(
voidNeed(Process*process,intm,intn)
process->Need=(int**)malloc(sizeof(int
for(i=0;i<m;i++)
(process->Need)[i]=(int*)malloc(sizeof(int)*n);
printf(〃输入各进程对各类资源的需求量:\n〃);
for(i=0;i<m;i++)
(
printf("P%d:\n”,i);
for(j=0;j<n;j++)
{
scanf(*%dz,,((process->Need)[i]+j));
)
(
(
voidAllocation(Process*process,intm,intn)
(
process->Allocation=(intloc(sizeof(int
for(i=0;i<m;i++)
(process->Allocation)[i]=(int*)malloc(sizeof(int)*n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
*((process->Allocation)[i]+j)=(*((process->Max)[i]+j))-(*((proces
s->Need)[i]+j));
}
voidAvai1able(Processxprocess,inrn)
process->Avai1able=(int*)malloc(sizeof(int)*n);
printf(〃输入系统可用资源数:\n〃);
for(i=0;i<n;i++)
scanf&(process->Available)[i]);
intRequst(Process*process,intm,intn)
(
process->Requst=(int**)malloc(sizeof(int
for(i=0;i<m;i++)
(process->Requst)[i]=(int*)malloc(sizeof(int)*n);
printf("输入进程名及其资源请求量:\n〃);
scanf&i);
l=i;
for(j=0;j<n;j++)
scanf("%d〃,(process->Requst)[i]+j);
intfla弁1=1;〃申请量大于需求量时标记为0
intflag2=l;〃申请量大于可利用资源量时标记为0
for(j=0;j〈n;j++)〃检查申请量是否小于等于需求量
if((process->Requst)[i][j]>(process->Need)[i][j])
flagl=0;
if(flagl==0)
(
printf(〃不允许申请量大于需求量!请重新输入。\n〃);
return0;
)
if(flagl==l)
(
for(产O;j<n;j++)〃检查申请量是否小于等于系统中的可利用资源量
if((process->Requst)[i][j]>(process->Available)[j])
flag2=0;
if(flag2==0)
printf(〃不允许申请量大于可利用资源量!请重新输入。\n〃);
return0;
)
elsereturn1;
}
}
intmain()
(
Processprocess;
intm,n;
printf(“请输入进程数:”);
scanf&m);
printf("请输入资源种类数:〃);
scanf("%d",&n);
Max(&process,m,n);
Need(&process,m,n);
Allocation(&process,m,n);
Available(&process,n);
Safe(&process,m,n);
while(Bank(&process,m,n));
return0;
}
实验结果:
请输入替源种黑l:3
修入各进程对各类资源的最大需求员:安全序列为:PlP3P4P0P2
输入进程名及其资源请求后:
p3
3122002
请求并试分配成功。
g62当前状态安全!
安全序列为:
1322
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上海纽约大学《基础写作教程》2025-2026学年期末试卷
- 沈阳药科大学《幼儿美术教育与活动指导》2025-2026学年期末试卷
- 防爆电气作业理论知识机考试题及答案
- Calcium-L-Threonate-Standard-生命科学试剂-MCE
- 淡水水生植物繁育工岗前激励考核试卷含答案
- 传输机务员岗前核心管理考核试卷含答案
- 电线电缆挤塑工安全文化模拟考核试卷含答案
- 真空垂熔工持续改进知识考核试卷含答案
- 井下采煤工复试能力考核试卷含答案
- 绝缘子制造工安全宣传水平考核试卷含答案
- 返工返修作业培训
- 2025年安徽水利水电职业技术学院单招职业技能考试题库往年题考
- 幼儿园中班美术《青花瓷瓶》课件
- 水稻收购订单合同范例
- 五十二个中医护理方案
- 04S519小型排水构筑物(含隔油池)图集
- 连铸工职业技能大赛考试题库500题(含各题型)
- 预应力钢筒混凝土管(pccp)专项施工方案
- 《离子型稀土矿山开采污染物排放-标准编制说明》
- 金融银行数据治理体系详细方案(技术方案)
- 2024劳动合同正规范本
评论
0/150
提交评论