操作系统银行家算法程序设计.docx
《操作系统银行家算法程序设计.docx》由会员分享,可在线阅读,更多相关《操作系统银行家算法程序设计.docx(9页珍藏版)》请在冰豆网上搜索。
操作系统银行家算法程序设计
安徽大学江淮学院
《操作系统课程设计报告》
专业:
网络工程
班级:
网络工程班
姓名:
赵娜
指导教师:
江东
学号:
JW104031
二零一二年6月14日
目录
1.课程设计目的……………………………………………3
2.课程设计题目描述与要求……………………………………3
3.课程设计报告内容……………………………………………3
3.1实验原理分析………………………………………3
3.2银行家算法程序代码…………………………………………4
3.3算法用到的主要数据结构和C语言说明…………………………8
3.4银行家算法(主程序)…………………………8
3.5安全性检查算法…………………………9
4.总结…………………………………………………10
5.参考文献…………………………………………………10
银行家算法的模拟实现
1课程设计目的:
通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。
2课程设计题目描述与要求:
模拟实现动态资源分配。
同时要求编写和调试一个系统动态资源的简单模拟程序,观察死锁产生的条件,并使用适当的算法,有效的防止和避免死锁的发生。
3课程设计报告内容:
3.1实验原理分析:
银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程张勇;第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,单它仍继续宝石已得到的所有其他资源;第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。
防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。
通过这个算法可以用来解决生活中的实际问题,如银行贷款等。
3.2程序代码
*/
#include
#include
#include
usingnamespacestd;
typedefstructMax1//资源的最大需求量
{
intm_a;
intm_b;
intm_c;
}Max;
typedefstructAllocation1//已分配的资源数
{
inta_a;
inta_b;
inta_c;
}Allocation;
typedefstructNeed1//还需要的资源数
{
intn_a;
intn_b;
intn_c;
}Need;
structAvailable1//可利用的资源量
{
intav_a;
intav_b;
intav_c;
}q;
structpr//定义一个结构
{
charname;
Maxmax;
Allocationallocation;
Needneed;
intfinishflag;
}p[5];
charna[5];
//********************************************
voidinit()//读入文件"1.txt"
{
cout<<"各进程还需要的资源数NEED:
"<FILE*fp;
fp=fopen("1.txt","r+");//打开文件"1.txt"
for(inti=0;i<5;i++)
{
fscanf(fp,"%c,%d,%d,%d,%d,%d,%d\n",&p[i].name,&p[i].max.m_a,&p[i].max.m_b,
&p[i].max.m_c,&p[i].allocation.a_a,&p[i].allocation.a_b,&p[i].allocation.a_c);
p[i].need.n_a=p[i].max.m_a-p[i].allocation.a_a;
p[i].need.n_b=p[i].max.m_b-p[i].allocation.a_b;
p[i].need.n_c=p[i].max.m_c-p[i].allocation.a_c;
cout<
"<
}
fclose(fp);//关闭文件
}
//***********************************************
intfenpei()//分配资源
{
cout<<"Available:
";
cout<intfinishcnt=0,k=0,count=0;
for(intj=0;j<5;j++)
p[j].finishflag=0;
while(finishcnt<5)
{
for(inti=0;i<5;i++)
{
if(p[i].finishflag==0&&q.av_a>=p[i].need.n_a&&q.av_b>=p[i].need.n_b&&q.av_c>=p[i].need.n_c)
{
q.av_a+=p[i].allocation.a_a;
q.av_b+=p[i].allocation.a_b;
q.av_c+=p[i].allocation.a_c;
p[i].finishflag=1;
finishcnt++;
na[k++]=p[i].name;
break;
}
}
count++;//禁止循环过多
if(count>5)return0;
}
return1;
}
//****************************************************
intshq()//申请资源
{
intm=0,i=0,j=0,k=0;//m为进程号;i,j,k为申请的三类资源数
cout<<"请输入进程号和请求资源的数目!
"<cout<<"如:
进程号资源ABC"<cout<<"0202"<cin>>m>>i>>j>>k;
if(i<=p[m].need.n_a&&j<=p[m].need.n_b&&k<=p[m].need.n_c)
{
if(i<=q.av_a&&j<=q.av_b&&k<=q.av_c)
{
p[m].allocation.a_a+=i;
p[m].allocation.a_b+=j;
p[m].allocation.a_c+=k;
p[m].need.n_a=p[m].max.m_a-p[m].allocation.a_a;
p[m].need.n_b=p[m].max.m_b-p[m].allocation.a_b;
p[m].need.n_c=p[m].max.m_c-p[m].allocation.a_c;
cout<<"各进程还需要的资源数NEED:
"<<'\n';
for(intw=0;w<5;w++)
cout<
"<
<<""<
return1;
}
else
cout<<"Request>Available让进程"<}
else
cout<<"Request>Need,让进程"<return0;
}
//********************************************
voidmain()
{
intflag;
charc;
cout<<"/********银行家算法********/"<cout<<"确认已经在\"1.txt\"文档中正确输入各进程的有关信息后按回车键"<getch();
init();
q.av_a=10;//各种资源的数量
q.av_b=5;
q.av_c=7;
while(flag)
{
for(inti=0;i<5;i++)
{
q.av_a-=p[i].allocation.a_a;
q.av_b-=p[i].allocation.a_b;
q.av_c-=p[i].allocation.a_c;
}
if(fenpei())
{
cout<<"这样配置资源是安全的!
"<cout<<"其安全序列是:
";
for(intk=0;k<5;k++)
cout<<"-->"<cout<cout<<"有进程发出Request请求向量吗?
(EnteryorY)"<cout<c=getch();
if(c=='y'||c=='Y')
{
if(shq())continue;
elsebreak;
}
elseflag=0;
}
else
{flag=0;
cout<<"不安全!
!
!
"<}
}
3.3算法用到的主要数据结构和C语言说明。
(1)、可利用资源向量INTAVAILABLE[M]M为资源的类型。
(2)、最大需求矩阵INTMAX[N][M]N为进程的数量。
(3)、已分配矩阵INTALLOCATION[N][M]
(4)、还需求矩阵INTNEED[N][N]
(5)、申请各类资源数量intRequest[x];//
(6)、工作向量intWork[x];
(7)、intFinish[y];//表示系统是否有足够的资源分配给进程,0为否,非0为是
3.4银行家算法(主程序)
(1)、系统初始化。
输入进程数量,资源种类,各进程已分配、还需求各资源数量,各资源可用数
量等
(2)、输入用户的请求三元组(I,J,K),为进程I申请K个J类资源。
(3)、检查用户的请求是否小于还需求的数量,条件是K<=NEED[I,J]。
如果条件不符则提示重新输
入,即不允许索取大于需求量
(4)、检查用户的请求是否小于系统中的可利用资源数量,条件是K<=AVALIABLE[I,J]。
如果条件不
符则申请失败,阻塞该进程,重新进行进程动态资源申请(使用goto语句)
(5)、进行资源的预分配,语句如下:
AVALIBLE[I][J]=AVALIBLE[I][J]-K;
ALLOCATION[I][J]=ALLOCATION[I][J]+K;
NEED[I][J]=NEED[I][J]-K;
(6)、系统调用安全性检查算法(safe()函数)进行检查,如果检查通过,则不用回收,否则进行
回收,进程资源申请失败进入等待。
3.5安全性检查算法(safe()子函数)
(1)、设置两个临时变量。
FINISH[N]记录进程模拟执行的结束状态,初值为0,如果可以模拟执行结束,则可设为1,也可设为
其它非零值以表示执行的先后次序。
WORK[M]记录模拟执行中资源的回收情况,初值为AVAILABLE[M]的值。
(2)、在进程中查找符合以下条件的进程。
条件1:
FINISH[I]=0
条件2:
NEED[I][J]〈=WORK[J]
(3)、如果查找成功则进行资源的模拟回收,语句如下:
WORK[J]=WORK[J]+ALLOCATION[I][J];
FINISH[I]=1或查找到的顺序号
(4)、如果查找不成功,则检查所有进程的FINISH[],如果有一个为0,则系统不为0,返回不成功
标志。
否则返回成功标志。
*/
4总结
“银行家算法的模拟实现”是本学期操作系统课程唯一的课程设计。
在设计此程序的过程中,我遇到过许多问题,也学到了很多东西。
本程序的设计实现主要是用C++语言实现,通过对程序算法的设计优化、输出显示的格式设计、输入过程中的异常处理等一些设计过程中的问题的考虑解决,在C++学习上也有了很大的进步。
程序设计过程中开始遇到的最大的问题是算法的结构设计问题,课本上只给了设计要求及简单的算法,要真正实现还需要考虑很多方面。
在算法的数据结构设计上考虑了很长时间。
在程序设计中先后参考了很多网络资料,也参考了一些别人写的的程序,综合这些算法思想和自己的思路对程序做了很好的设计方式,对一些算法的优越性等也作了一些考虑。
此外考虑最多的就是异常错误处理的设计。
一个好的程序必须能在各种环境下都有其相应的处理方式,至少能应对一些常见的可能发生的错误。
比如一般的要求输入为数字时,如果输入了一个非数字字符,程序就会立即出错无法继续运行,本程序针对这个问题设计了一个shuzi();函数进行处理,处理方式为:
接受键盘输入的字符为字符串,然后对字符串的每个字符进行判断是否为数字,如果有非数字字符出现则提示出错并要求重新输入。
又如在判断是否继续时要求输入Y/N时,按一般的方式,如果输入为多个字符,则多余的字符会保存在缓冲区,到下次要求输入时输入而导致出错,对此问题设计处理方式为接受输入字符保存为串然后只取其首字符进行判断。
还有很多类似的错误处理。
还有在设置程序的显示优化时,发现暂停函数在不同的情况下执行顺序不同,如此等等。
在课程设计过程中遇到了许多问题,也向同宿舍的同学做了一些请教一起讨论,也因此从他们身上学到了许多东西。
8参考文献:
[1]汤子瀛等.《计算机操作系统》.西安:
西安电子科技大学出版社,2006.10.
[2]刘璟等.《高级语言c++程序设计》.北京:
高等教育出版社,2006.03.
相关工具:
MicrosoftVisualC++6.0
BloodshedDev-C++