《操作系统原理》实验报告六.docx
《《操作系统原理》实验报告六.docx》由会员分享,可在线阅读,更多相关《《操作系统原理》实验报告六.docx(10页珍藏版)》请在冰豆网上搜索。
《操作系统原理》实验报告六
福建工程学院软件学院
实验报告
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;iprintf("%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;ifor(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;jprintf(j?
"-->":
"");
printf("p%d",path[j]);
}
puts("");
puts("*****************************************************************");
puts("*WorkNeedAllocationWork+AllocationFinish*");
puts("*ABCABCABCABC*");
for(j=0;jwork[j]=available[j];
}
for(j=0;jinti=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时刻的系统资源分配情况,写出其执行安全性检查和银行家算法的结果,分多种情况说明。
实验总结