课程设计银行家算法的模拟实现.docx
《课程设计银行家算法的模拟实现.docx》由会员分享,可在线阅读,更多相关《课程设计银行家算法的模拟实现.docx(15页珍藏版)》请在冰点文库上搜索。
![课程设计银行家算法的模拟实现.docx](https://file1.bingdoc.com/fileroot1/2023-5/28/28ea6fe6-d51d-4730-9f52-44d454dce5ef/28ea6fe6-d51d-4730-9f52-44d454dce5ef1.gif)
课程设计银行家算法的模拟实现
1 课设简介:
1.1 课程设计题目
银行家算法的模拟实现
1.2 课程设计目的
通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。
1.3 课程设计内容
模拟实现动态资源分配。
同时要求编写和调试一个系统动态资源的简单模拟程序,观察死锁产生的条件,并使用适当的算法,有效的防止和避免死锁的发生。
2 实验原理分析:
银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程张勇;第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,单它仍继续宝石已得到的所有其他资源;第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。
防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。
通过这个算法可以用来解决生活中的实际问题,如银行贷款等。
3 程序结构分析:
3.2 程序模块划分
3.2.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)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
3.2.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,则表示安全;否则系统不安全。
3.2.3.数据结构
假设有M个进程N类资源,则有如下数据结构:
#defineW10
#defineR20
intA; //总进程数
intB; //资源种类
intALL_RESOURCE[W]; //各种资源的数目总和
intMAX[W][R]; //M个进程对N类资源最大资源需求量
intAVAILABLE[R]; //系统可用资源数
intALLOCATION[W][R]; //M个进程已经得到N类资源的资源量
intNEED[W][R]; //M个进程还需要N类资源的资源量
intRequest[R]; //请求资源个数
3.2.4.主要函数说明
voidshowdata(); //主要用来输出资源分配情况
voidchangdata(int); //主要用来输出资源分配后后的情况
voidrstordata(int); //用来恢复资源分配情况,如:
银行家算法时,由于分配不安全则要恢复资源分配情况
intchkerr(int); //银行家分配算法的安全检查
voidbank() ; //银行家算法
银行家算法的课程设计
(二)VC++6.02008-01-2815:
29源程序
4 数据结构分析
假设有M个进程N类资源,则有如下数据结构:
#defineW10
#defineR20
intA; //总进程数
intB; //资源种类
intALL_RESOURCE[W]; //各种资源的数目总和
intMAX[W][R]; //M个进程对N类资源最大资源需求量
intAVAILABLE[R]; //系统可用资源数
intALLOCATION[W][R]; //M个进程已经得到N类资源的资源量
intNEED[W][R]; //M个进程还需要N类资源的资源量
intRequest[R]; //请求资源个数
5 各子模块相关函数代码
voidshowdata(); //主要用来输出资源分配情况
voidchangdata(int); //主要用来输出资源分配后后的情况
voidrstordata(int); //用来恢复资源分配情况,如:
银行家算法时,由于分配不安全则要恢复资源分配情况
intchkerr(int); //银行家分配算法的安全检查
voidbank() ; //银行家算法
6 程序运行结果分析
6.1 示例数据
EG:
进程总数:
2
总资源种类:
1
总资源数:
资源0:
12
进程0的0类资源:
12
进程0的1类资源:
1
进程0已占有0类:
11
进程0已占有1类:
0
资源0总数:
12
系统可用资源数:
1
进程P0还需资源0:
1
进程P1还需资源0:
1
依次分配给P0、P1一个资源后,系统一个循环时间片完成
7 心得体会
银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程张勇;第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,单它仍继续宝石已得到的所有其他资源;第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。
防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。
通过这个算法可以用来解决生活中的实际问题,如银行贷款等。
参考文献:
[1]严蔚敏、吴伟民.《数据结构(C语言版)》.北京:
清华大学出版社,2007.4.
[2]谭浩强等.《C程序设计(第二版)》.北京:
清华大学出版社,2005.9.
相关工具:
MicrosoftVirualC++6.0
8程序源代码
操作系统课程设计做完了:
银行家算法
(一) 代码(2008-06-3003:
20:
32)
标签:
教育 杂谈
分类:
日记
#include"string.h"
#include"iostream"
#include"iomanip"
usingnamespacestd;
#defineFALSE0
#defineTRUE1
#defineW10
#defineR20
intFINISH[W];
intA;//总进程个数
intB;//总资源种类
intALL_RESOURCE[W];//各种资源的数目总和
intMAX[W][R];//A个进程对B类资源最大资源需求量
intAVAILABLE[R];//系统可用资源数
intALLOCATION[W][R];//A个进程已经得到B类资源的资源量
intNEED[W][R];//A个进程还需要B类资源的资源量
intRequest[R];//请求资源个数
voidshowdata()//函数showdata,输出资源分配情况
{
inti,j;
cout<<"————————————————————————"<
cout<<"各种资源的总数量(all):
"<
cout<<" ";
for(j=0;j<<"P?
<<:
>
cout<<" ";
for(j=0;j<<"P资源?
<:
?
<
cout<<"各进程还需要的资源量(need):
"<
cout<<" ";
for(j=0;j<
for(i=0;i
{
cout<<"进程p"<
";
for(j=0;j<
}
cout<
cout<<"—————————————————————";
cout<<"各进程已经得到的资源量(allocation):
"<
cout<<" ";
for(j=0;j<
for(i=0;i
{
cout<<"进程p"<
";
for(j=0;j<
}
cout<
}
voidchangdata(intk)//函数changdata,改变可用资源和已经拿到资源和还需要的资源的值
{
intj;
for(j=0;j
{AVAILABLE[j]=AVAILABLE[j]-Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
NEED[k][j]=NEED[k][j]-Request[j];
}
}
voidrstordata(intk)//函数rstordata,恢复可用资源和已经拿到资源和还需要的资源的值
{ intj;
for(j=0;j
{AVAILABLE[j]=AVAILABLE[j]+Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
NEED[k][j]=NEED[k][j]+Request[j];
}
}
intchkerr(ints)//函数chkerr,检查是否安全
{intWORK;//FINISH[W]
inti,j,k=0;
for(i=0;i
for(j=0;j
{
WORK=AVAILABLE[j];
i=s;
do
{
if(FINISH[i]==FALSE&&NEED[i][j]<=WORK)
{
WORK=WORK+ALLOCATION[i][j];
FINISH[i]=TRUE;
i=0;
}
else
{
i++;
}
}while(i
for(i=0;i
if(FINISH[i]==FALSE)
{
cout<
cout<<"系统不安全!
!
!
本次资源申请不成功!
!
!
"<
cout<
return1;
cout<<"进程p"<<"状态:
P阻塞?
<
}
}
cout<
cout<<"经安全性检查,系统安全,本次分配成功。
"<
cout<
return0;
}
voidset()
{
intt[10];
for(inti=0;i
t[i]=0;
for(intj=0;j }
for(i=0;i
if(t[i]==B)
{cout<<"进程p"<<"状态:
运行结束?
< for(intk=0;k
AVAILABLE[k]=AVAILABLE[k]+ALLOCATION[i][k];
ALLOCATION[i][k]=0;
}
else
cout<<"进程p"<<"状态:
等待调用?
< }
voidbank() //银行家算法
{
int i=0,j=0;
charflag='Y';
while(flag=='Y'||flag=='y')
{
i=-1;
while(i<0||i>=A)
{
cout<<"请输入需申请资源的进程号(从P0到P"<<",否则重输入!
):
";
cout<<"p";cin>>i;
if(i<0||i>=A)cout<<"输入的进程号不存在,重新输入!
"<
}
cout<<"请输入进程P"<<"申请的资源数:
"<
for(j=0;j
{
cout<<"资源"<<":
P?
;<>
cout<<"申请不合理,出错!
请重新选择!
"<
flag='B';
break;
}
else
{
if(Request[j]>AVAILABLE[j])//若请求的资源数大于可用资源数
{
cout<<"进程P"<<"申请的资源数大于系统可用"<";
cout<<"申请不合理,出错!
请重新选择!
"<
flag='B';
break;
}
}
}
if(flag=='Y'||flag=='y')
{
changdata(i);//调用changdata(i)函数,改变资源数
if(chkerr(i))//若系统不安全
{
rstordata(i);//调用rstordata(i)函数,恢复资源数
showdata(); //输出资源分配情况
}
else { //若系统安全
showdata();//输出资源分配情况
set();
}
}
else //若flag=B||flag=vb
showdata();
cout<
cout<<"是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示:
";
cin>>flag;
}
}
voidmain()//主函数
{
inti=0,j=0,p;
cout<<"==================================================="<
cout<
cout<<"欢迎进入操作系统课程设计"<
cout<
cout<<" 银行家算法"<
cout<
cout<<" ----06教育胡亮061114060"<
cout<
cout<<"==================================================="<
cout<
cout<<"请输入总进程数:
"<
cin>>A;
cout<<"请输入总资源种类:
"<
cin>>B;
cout<<"请输入总资源数(all_resource):
"<
for(i=0;i
{cout<<"资源"<<":
";cin>>ALL_RESOURCE[i];}
cout<<"依次输入各进程所需要的最大资源数量(max):
"<
for(i=0;i<>
{
for(j=0;j<>
{
do
{cout<<"进程"<<"所需";
cout<<"类资源的数目:
";
cin>>MAX[i][j];
if(MAX[i][j]>ALL_RESOURCE[j])//最大需求量小于资源的总数
cout<<"所需资源超过了声明的该资源总数,请重新输入"<
}while(MAX[i][j]>ALL_RESOURCE[j]);
}
}
cout<<"依次输入各进程已经占据的资源数量(allocation):
"<
for(i=0;i
{
for(j=0;j
{
do
{cout<<"进程"<<"已占有";
cout<<"类资源的数目:
";
cin>>ALLOCATION[i][j];
if(ALLOCATION[i][j]>MAX[i][j])
cout<<"占有资源超过了所需的最大资源,请重新输入"<
}while(ALLOCATION[i][j]>MAX[i][j]);
}
}
//初始化资源数量
for(j=0;j
{p=ALL_RESOURCE[j];
for(i=0;i
{
p=p-ALLOCATION[i][j];//减去已经被占据的资源
AVAILABLE[j]=p;
if(AVAILABLE[j]<0)
AVAILABLE[j]=0;
}
}
for(i=0;i
for(j=0;j
NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];
showdata();
bank();
}