《操作系统原理》实验报告六资料.docx

上传人:b****1 文档编号:146852 上传时间:2023-04-28 格式:DOCX 页数:11 大小:31.24KB
下载 相关 举报
《操作系统原理》实验报告六资料.docx_第1页
第1页 / 共11页
《操作系统原理》实验报告六资料.docx_第2页
第2页 / 共11页
《操作系统原理》实验报告六资料.docx_第3页
第3页 / 共11页
《操作系统原理》实验报告六资料.docx_第4页
第4页 / 共11页
《操作系统原理》实验报告六资料.docx_第5页
第5页 / 共11页
《操作系统原理》实验报告六资料.docx_第6页
第6页 / 共11页
《操作系统原理》实验报告六资料.docx_第7页
第7页 / 共11页
《操作系统原理》实验报告六资料.docx_第8页
第8页 / 共11页
《操作系统原理》实验报告六资料.docx_第9页
第9页 / 共11页
《操作系统原理》实验报告六资料.docx_第10页
第10页 / 共11页
《操作系统原理》实验报告六资料.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

《操作系统原理》实验报告六资料.docx

《《操作系统原理》实验报告六资料.docx》由会员分享,可在线阅读,更多相关《《操作系统原理》实验报告六资料.docx(11页珍藏版)》请在冰点文库上搜索。

《操作系统原理》实验报告六资料.docx

《操作系统原理》实验报告六资料

 

 

 

2015——2016学年第二学期

 

专业

班级

学号

姓名

日期

 

题目

实验六银行家算法实验

实验目的

1、了解掌握银行家算法;

2、学会模拟实现资源分配,同时按要求编写和调试一个系统分配资源的简单模拟程序;

3、观察死锁产生的条件,并使用适当的算法,有效的防止和避免死锁的发生。

实验理论基础

设计要求:

编制银行家算法通用程序,并检测所给状态的系统安全性。

1.银行家算法:

设进程i提出请求Request[n],则银行家算法按如下规则进行判断。

(1)如果Request[n]>Need[i,n],则报错返回。

(2)如果Request[n]>Available,则进程i进入等待资源状态,返回。

(3)假设进程i的申请已获批准,于是修改系统状态:

Available=Available-Request

Allocation=Allocation+Request

Need=Need-Request

(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

2.安全性检查

(1)设置两个工作向量Work=Available;Finish[M]=False

(2)从进程集合中找到一个满足下述条件的进程,

Finish[i]=False

Need<=Work

如找到,执行(3);否则,执行(4)

(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。

Work=Work+Allocation

Finish=True

GOTO2

(4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。

实验内容和步骤

1、本试验设计的目的是通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。

要求如下:

(1) 模拟一个银行家算法;

(2) 初始化时让系统拥有一定的资源;

(3) 用键盘输入的方式申请资源;

(4) 如果预分配后,系统处于安全状态,则修改系统的资源分配情况;

(5) 如果预分配后,系统处于不安全状态,则提示不能满足请求。

以下提供了部分该实例的源代码,要求同学们根据理论基础部分内容分析该源代码,并将缺失的程序代码补充完整,然后调试这段程序,最终按要求给出相应的结论。

#include

#include

#include

#include

#defineM3//资源种类m种

#defineN4//进程个数n

intneed[10][3];//进程还需资源矩阵

intmax[10][3];//进程最大需求矩阵

intallocation[10][3];//已分配资源矩阵

intavailable[3];//可用资源向量

intwork[3];//可用资源向量

intfinish[10],finish1[10];//记录进程申请的资源是否能分配

intpath[10]={0,1,2,3,4,5,6,7,8,9};//记录安全序列

intis_save;//是否产生安全序列

intmark[10];//记录某进程是否已分配资源

 

voiddisplay(int*a,intn)//显示一维数组

{inti;

for(i=0;i

printf("%3d",a[i]);

}

voiddisp()//显示资源列表

{inti;

printf("Nnumber\tMax\t\tneed\t\tallocation\tavalible\n");

for(i=0;i

{printf("p%d\t",i);//--分别显示P0,P1,P2的Max,Need,Allocation,Avalible

display(max[i],M);

printf("\t");

display(need[i],M);

printf("\t");

display(allocation[i],M);

printf("\t");

if(i==0)

display(available,M);

printf("\n");

}

}

voidinit(){

inti,j;

srand(time(NULL));

for(i=0;i

for(j=0;j

{

allocation[i][j]=rand()%10;

need[i][j]=rand()%10;

max[i][j]=allocation[i][j]+need[i][j];

}

for(i=0;i

{

available[i]=rand()%12;

}

disp();

is_save=0;

}

 

voidshowMenu(){

puts("\n*****************************************************");

puts("*0.初始化数据1.安全性算法2.银行家算法3.退出*");

puts("*******************************************************");

}

intsafe()//检查安全序列

{

inti,j,k=1;//k用来结束安全序列的查找

intflag=1;//flag=0表示当前可用资源<进程申请资源数

intr=0,r1=0;//记录所需资源能被满足的进程数;

 

for(j=0;j

{

work[j]=available[j];

}

printf("现在进行安全性检查......\n");

for(i=0;i

{

finish[i]=-1;

finish1[i]=-1;

}

//请在此处插入完成安全性检查算法的代码!

if(r>=4){

printf("-----找到安全序列-----\n");

for(i=0;i

{

if(i!

=N-1)

printf("p%d->",path[i]);

else

printf("p%d\n",path[i]);

}

return1;

}

else{

printf("进行安全性检查后.....\n");

printf("当前状态不安全!

\n");

return0;

}

}

 

voidprint_sav_seq(){

inti,j;

printf("安全序列如下:

");

for(j=0;j

printf(j?

"-->":

"");

printf("p%d",path[j]);

}

puts("");

puts("*****************************************************************");

puts("*WorkNeedAllocationWork+AllocationFinish*");

puts("*ABCABCABCABC*");

for(j=0;j

work[j]=available[j];

}

for(j=0;j

inti=path[j];

printf("*P%d",i);

printf("%3d%3d%3d",work[0],work[1],work[2]);

printf("%3d%3d%3d",need[i][0],need[i][1],need[i][2]);

printf("%3d%3d%3d",allocation[i][0],allocation[i][1],allocation[i][2]);

work[0]+=allocation[i][0];

work[1]+=allocation[i][1];

work[2]+=allocation[i][2];

printf("%3d%3d%3dtrue*\n",work[0],work[1],work[2]);

}

puts("*****************************************************************");

printf("可用资源:

A->%d;B->%d;C->%d\n\n\n",available[0],available[1],available[2]);

}

 

voidbanker(){

intoper,i,j,flag1=0,flag2=0;//用来比较request[j]>need[i][j]和request[j]>available[j]

intrequest[3];

while

(1){

flag1=flag2=0;

printf("请输入要操作的进程号:

");

scanf("%d",&i);

if(i>N||i<0){

printf("你输入的进程号不存在!

");

break;

}

printf("请输入各类资源的请求数:

");

scanf("%d%d%d",&request[0],&request[1],&request[2]);

//请在此处插入银行家算法实现的代码!

puts("1.继续操作2.退出");

scanf("%d",&oper);

if(oper==2){

break;

}

}

}

intmain(){

intoper;

while

(1){

showMenu();

printf("请选择接下来的操作:

");

scanf("%d",&oper);

switch(oper){

case0:

init();

break;

case1:

if(safe()==1)is_save=1;

if(is_save==1){

print_sav_seq();

}else{

puts("无法找到安全序列,请重新生成数据再运行程序");

return0;

}

break;

case2:

banker();

break;

case3:

return0;

default:

puts("输入有误,清重试");

break;

}

}

return0;

}

 

2、运行示例及结果截图

假设TO时刻的系统资源分配情况,写出其执行安全性检查和银行家算法的结果,分多种情况说明。

 

实验总结

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2