操作系统实验报告银行家算法.docx
《操作系统实验报告银行家算法.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告银行家算法.docx(11页珍藏版)》请在冰豆网上搜索。
操作系统实验报告银行家算法
操作系统实验报告-银行家算法
南昌大学实验报告
---,3~编程实现银行家安全算法学生姓名:
张虹学号:
6100409033专业班级:
电?
091班实验类型:
?
验证?
综合?
设计?
创新实验日期:
实验成绩:
一、实验目的
通过实验加强对银行家安全算法的理解和掌握。
二、实验内容
熟悉避免死锁发生的方法,死锁与安全序列的关系,编程实现银行家算法,要求输出进程的安
全序列。
三、实验要求
1、需写出设计说明;
2、设计实现代码及说明
3、运行结果;
四、主要实验步骤
1、分析银行家算法结构;
2、画出银行家算法的流程图,即设计说明;
3、根据画出的流程图使用C语言编写相应的代码(代码过长,放到最后);
程序主要由main函数和以下几个函数组成:
voidinput();用户输入银行家算法的初始数据;
voidoutput();输出当前系统资源分配情况;
voidchange();当请求资源满足要求时,进行分配,系统资源发生改变;
intcheck();安全性算法,检查是否存在安全序列;
voidoutputsafe();输出安全序列的资源分配表。
4、检查代码,将编出的代码编译、链接,验证其正确性。
开始
输入银行
家算法初
始数据
N数据是否正确
Y
执行安全性算
法输出当前资
源分配表
NY执行算法的Y是否存在安全序列是否为初始数据
系统将资源分配给PiYN
输出安全序列
的资源情况Y
N请求资源是否进程Pi需等待小于系统资源资源分配无
效,恢复分配
前的系统资源Y情况输入进程是否有进程请求资源是否YPi发出的发出请求向量小于需求资源请求向量
NN
结束
五、实验数据及处理结果
六、实验体会或对改进实验的建议
体会:
编写银行家算法需要较好分析能力,C语言也要掌握的很好,而且需要细心和极大地耐心。
我的程序在最开始编出来的第一份代码编译时大大小小一堆错误,有些是一个小错误导致了下面全错,这些小错误在一百多行里找起来非常费劲。
然后小错误全部找出来以后,再编译,错误没有了,但是得到的结果却是错误的,这样又要开始一行一行分析,看是哪里出了问题。
到最后得到了想要的结果以后,程序还需要修饰,至少要输出要简洁明朗,要让别人一运行这个程序就知道自己在什么时候该输入什么数据,数据是什么作用,而不是只有自己知道输进去的是什么东西。
七、参考资料
《计算机操作系统》
《C程序设计》
《C语言程序设计_现代方法》
八、实验代码
#include//本实验中使用到的库函数
#include
#include
intmax[5][3];//开始定义银行家算法中需要用到的数据
intallocation[5][3];
intneed[5][3];
intavailable[3];
intrequest[5][3];
char*finish[5];
intsafe[5];
intn,i,m;
intk=0;
intj=0;
intwork[3];
intworks[5][3];
voidline()//美化程序,使程序运行时更加明朗美观{
printf("------------------------------------------------------------------\n");
}
voidstart()//表示银行家算法开始
{
line();
printf("银行家算法开始\n");
printf("——DesignedbyZhangHong\n");
line();
}
voidend()//表示银行家算法结束
{
line();
printf("银行家算法结束,谢谢使用\n");
line();
}
voidinput()//输入银行家算法起始各项数据
{
for(n=0;n<5;n++)
{
printf("请输入进程P%d的相关信息:
\n",n);
printf("Max:
");
for(m=0;m<3;m++)
scanf("%d",&max[n][m]);
printf("Allocation:
");
for(m=0;m<3;m++)
scanf("%d",&allocation[n][m]);
for(m=0;m<3;m++)
need[n][m]=max[n][m]-allocation[n][m];
}
printf("请输入系统可利用资源数Available:
");
for(m=0;m<3;m++)
scanf("%d",&available[m]);}
voidoutput()//输出系统现有资源情况
{
line();
printf("资源情况MaxAllocationNeedAvailable\n");
printf("进程ABCABCABCABC\n");
line();
for(n=0;n<5;n++)
{
printf("P%d%9d%3d%3d%5d%3d%3d%6d%3d%3d",n,max[n][0],max[n][1],max[n][2],allocation[n][
0],allocation[n][1],allocation[n][2],need[n][0],need[n][1],need[n][2]);
if(n==0)
printf("%6d%3d%3d\n",available[0],available[1],available[2]);
else
printf("\n");
}
line();
}
voidchange()//当Request[i,j]<=Available[j]时,系统把资源分配给进程P[i],Available[j]和Need[i,j]
发生改变
{
for(m=0;m<3;m++)
{
available[m]-=request[i][m];
allocation[i][m]+=request[i][m];
need[i][m]-=request[i][m];
}
}
voidoutputsafe()//输出安全序列的资源分配表
{
printf("该安全序列的资源分配图如下:
\n");
line();
printf("资源情况WorkNeedAllocationWork+AllocationFinish\n");
printf("进程ABCABCABCABC\n");
line();
for(n=0;n<5;n++)
printf("P%d%9d%3d%3d%5d%3d%3d%5d%3d%3d%6d%3d%3d%12s\n",safe[n],works[safe[n]][0],works[safe[n]][1],works[safe[n]][2],need[safe[n]][0],need[safe[n]][1],need[safe[n]][2],allocation[safe[n]][0
],allocation[safe[n]][1],allocation[safe[n]][2],works[safe[n]][0]+allocation[safe[n]][0],works[safe[n]][1]+al
location[safe[n]][1],works[safe[n]][2]+allocation[safe[n]][2],finish[n]);
line();
}
intcheck()//安全性算法
{
printf("开始执行安全性算法……\n");
for(m=0;m<3;m++)//数组work和finish初始化
work[m]=available[m];
for(n=0;n<5;n++)
{
finish[n]="false";
safe[n]=0;
}
k=0;
for(m=0;m<5;m++)
for(n=0;n<5;n++)
if(strcmp(finish[n],"false")==0&&need[n][0]<=work[0]&&need[n][1]<=work[1]&&
need[n][2]<=work[2])//查找可以分配资源但尚未分配到资源的进程
{
safe[k]=n;//以数组safe[k]记下各个进程得到分配的资源的顺序
works[safe[k]][0]=work[0];
works[safe[k]][1]=work[1];
works[safe[k]][2]=work[2];
work[0]+=allocation[n][0];//进程执行后释放出分配给它的资源
work[1]+=allocation[n][1];
work[2]+=allocation[n][2];
finish[n]="ture";//finish[n]变为1以示该进程完成本次分
k++;
}
for(m=0;m<5;m++)//判断是否所有进程分配资源完成
{
if(strcmp(finish[m],"false")==0)
{
printf("找不到安全序列,系统处于不安全状态。
\n");
return0;//找不到安全序列,结束check函数,返回0
}
else
if(m==4)//此处m=4表示所有数组finish的所有元素都为ture
{
printf("找到安全序列P%d->P%d->P%d->P%d->P%d,系统是安全的
\n",safe[0],safe[1],safe[2],safe[3],safe[4]);
j=1;
outputsafe();//输出安全序列的资源分配表
}
}
return1;
}
voidmain()//主程序开始
{
start();
for(;j==0;)//确认输入数据的正确性,若输入错误,重新输入
{
input();
printf("以下为进程资源情况,请确认其是否正确:
\n");
output();
printf("数据是否无误:
\n正确:
输入1\n错误:
输入0\n请输入:
");
scanf("%d",&j);
}
printf("数据确认无误,算法继续。
\n");
if(check()==0)//若check函数返回值为0,表示输入的初始数据找不到安全序列,无法进
行下一步,程序结束
{
end();
exit(0);
}
for(;j==1;)//当有多个进程请求资源时,循环开始
{
printf("请输入请求资源的进程i(0、1、2、3、4):
");//输入发出请求向量的进程及请求向
量
scanf("%d",&i);
printf("请输入进程P%d的请求向量Request%d:
",i,i);
for(n=0;n<3;n++)
scanf("%d",&request[i][n]);
for(;request[i][0]>need[i][