资源描述
实验目的
银行家算法是避免死锁的一种重要方法。通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法
二、实验要求
根据银行家算法的基本思想,编写和调试一个实现动态资源分配的模拟程序,并能够有效地防止和避免死锁的发生。
(1) 设计思想说明
设计银行家算法是为了避免死锁
三、实验方法内容
1. 算法设计思路
银行家算法又称“资源分配拒绝”法,其基本思想是,系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。这时系统将该进程从进程集合中将其清除。此时系统中的资源就更多了。反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配给他。请进程等待
2. 算法流程图
3. 算法中用到的数据结构
数据结构的说明
1.可利用资源向量AVAILABLE。这是一个含有M个元素的数组,其中的每一个元素代表一类可利用的资源数目,其3初始值是系统中所配置的该类全部可哦那个资源的数目,其数值随该类资源的分配和回收而动态的改变。
2.最大需求矩阵MAX。这是一个M*N的矩阵,它定义了系统中N个进程中的每一个进程对M类资源的最大需求。
3.分配矩阵ALLOCATION。这也是一个M*N的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。
4.需求矩阵NEED。这也是一个M*N的矩阵,用以表示每一个进程尚需的各类资源数。
5.NEED[R,W]=MAX[R,W]-ALLOCATION[R,W]
4. 主要的常量变量
#define W 10 //最大进程数W=10
#define R 20 //最大资源总数R=20
int AVAILABLE[R]; //可利用资源向量
int MAX[W][R]; //最大需求矩阵
int ALLOCATION[W][R]; //分配矩阵
int NEED[W][R]; //需求矩阵
int Request[R]; //进程请求向量
void changdata(int k);//进程请求资源数据改变
int chksec(int s); //系统安全性的检测
5. 主要模块
void inputdata()
void showdata()
void changdata(int k)
void restoredata(int k)
int chksec(int s)
int chkmax(int s)
四、实验代码
#include <string.h>
#include <iostream.h>
#define FALSE 0
#define TRUE 1
#define W 10 //最大进程数W=10
#define R 20 //最大资源总数R=20
int M ;
int N ;
int ALL_RESOURCE[W];
int AVAILABLE[R]; //可利用资源向量
int MAX[W][R]; //最大需求矩阵
int ALLOCATION[W][R]; //分配矩阵
int NEED[W][R]; //需求矩阵
int Request[R]; //进程请求向量
void inputdata(); //数据输入
void showdata(); //数据显示
void changdata(int k);//进程请求资源数据改变
void restoredata(int k); //数据恢复
int chksec(int s); //系统安全性的检测
int chkmax(int s); //检测最大需求
void bank(); //检测分配的资源是否合理
void main()
{ int i,j;
inputdata();
for(i=0;i<M;i++)
{ j=chksec(i);
if (j==0) break;
}
if (i>=M)
cout<<"错误提示:经安全性检查发现,系统的初始状态不安全!!!\n"<<endl;
else
{ cout<<"提示:经安全性检查发现,系统的初始状态安全!"<<endl;
bank();
}
}
void inputdata()
{ int i=0,j=0,p;
cout<<"请输入总进程数:"<<endl;
do{
cin>>M;
if (M>W) cout<<endl<<"总进程数超过了程序允许的最大进程数,请重新输入:"<<endl;
}while (M>W);
cout<<endl;
cout<<"请输入资源的种类数:"<<endl;
do {cin>>N;
if (N>R)
cout<<endl<<"资源的种类数超过了程序允许的最大资源种类数,请重新输入:"<<endl; }while (N>R);
cout<<endl;
cout<<"请依次输入各类资源的总数量,即设置向量all_resource:"<<endl;
for(i=0;i<N;i++) cin>>ALL_RESOURCE[i];
cout<<endl;
cout<<"请依次输入各进程所需要的最大资源数量,即设置矩阵max:"<<endl;
for (i=0;i<M;i++)
{
for (j=0;j<N;j++)
{
do { cin>>MAX[i][j];
if (MAX[i][j]>ALL_RESOURCE[j])
cout<<endl<<"该最大资源数量超过了声明的该资源总数,请重新输入:"<<endl; }while (MAX[i][j]>ALL_RESOURCE[j]);
}
}
cout<<endl;
cout<<"请依次输入各进程已经占据的各类资源数量,即设置矩阵allocation:"<<endl;
for (i=0;i<M;i++)
{
for (j=0;j<N;j++)
{
do{ cin>>ALLOCATION[i][j];
if (ALLOCATION[i][j]>MAX[i][j])
cout<<endl<<"已占有的资源数量超过了声明的最大资源数量,请重新输入:"<<endl;
}while (ALLOCATION[i][j]>MAX[i][j]);
}
}
cout<<endl;
for (i=0;i<M;i++)
for(j=0;j<N;j++)
NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];
for (j=0;j<N;j++)
{ p=ALL_RESOURCE[j];
for (i=0;i<M;i++)
{ p=p-ALLOCATION[i][j];
AVAILABLE[j]=p;
if(AVAILABLE[j]<0)
AVAILABLE[j]=0;
}
}
}
void showdata()
{ int i,j;
cout<<"各种资源的总数量,即向量all_resource为:"<<endl;
cout<<" ";
for (j=0;j<N;j++)
cout<<" 资源"<<j<<": "<<ALL_RESOURCE[j];
cout<<endl<<endl;
cout<<"当前系统中各类资源的可用数量,即向量available为:"<<endl;
cout<<" ";
for (j=0;j<N;j++)
cout<<" 资源"<<j<<": "<<AVAILABLE[j];
cout<<endl<<endl;
cout<<"各进程还需要的资源数量,即矩阵need为:"<<endl<<endl;
for (i=0;i<M;i++)
{ cout<<"进程P"<<i<<": ";
for (j=0;j<N;j++)
cout<<NEED[i][j]<<" ";
cout<<endl;
}
cout<<endl;
cout<<"各进程已经得到的资源量,即矩阵allocation为: "<<endl<<endl;
for (i=0;i<M;i++)
{ cout<<"进程P"<<i<<": ";
for (j=0;j<N;j++)
cout<<ALLOCATION[i][j]<<" ";
cout<<endl;
} cout<<endl;
}
void changdata(int k)
{ int j;
for (j=0;j<N;j++)
{
AVAILABLE[j]=AVAILABLE[j]-Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
NEED[k][j]=NEED[k][j]-Request[j];
}
}
void restoredata(int k)
{
int j;
for (j=0;j<N;j++)
{ AVAILABLE[j]=AVAILABLE[j]+Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
NEED[k][j]=NEED[k][j]+Request[j];
}
}
int chksec(int s)
{
int WORK,FINISH[W];
int i,j,k=0;
for(i=0;i<M;i++)
FINISH[i]=FALSE;
for(j=0;j<N;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<M);
for(i=0;i<M;i++)
if(FINISH[i]==FALSE)
{ return 1;
}
} return 0;
}
int chkmax(int s)
{ int j,flag=0;
for(j=0;j<N;j++)
{
if (MAX[s][j]==ALLOCATION[s][j])
{ flag=1;
AVAILABLE[j]=AVAILABLE[j]+MAX[s][j];
MAX[s][j]=0;
}
} return flag;
}
c
{
int i=0,j=0;
char flag='Y';
while(flag=='Y'||flag=='y')
{
i=-1;
while(i<0||i>=M)
{ cout<<"请输入需申请资源的进程号(从P0到P"<<M-1<<",否则重新输入!):";
cout<<"p";
cin>>i;
if(i<0||i>=M)
cout<<"输入的进程号不存在,重新输入!"<<endl;
}
cout<<"请输入进程P"<<i<<"申请的资源数:"<<endl;
for (j=0;j<N;j++)
{ cout<<" 资源"<<j<<": ";
cin>>Request[j];
if(Request[j]>NEED[i][j])
{ cout<<"进程P"<<i<<"申请的资源数大于进程P"<<i<<"还需要"<<j<<"类资源的资源量!";
cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;
flag='N';
break;
}
else
{ if(Request[j]>AVAILABLE[j])
{ cout<<"进程P"<<i<<"申请的资源数大于系统可用"<<j<<"类资源的资源量!";
cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;
flag='N';
break;
}
}
}
if(flag=='Y'||flag=='y')
{ changdata(i);
if(chksec(i))
{ cout<<endl;
cout<<"该分配会导致系统不安全!!! 本次资源申请不成功,不予分配!!!"<<endl;
cout<<endl;
restoredata(i);
}
else
{ cout<<endl;
cout<<"经安全性检查,系统安全,本次分配成功,且资源分配状况如下所示:"<<endl;
cout<<endl;
showdata();
if(chkmax(i))
{cout<<"在资源分配成功之后,由于该进程所需的某些资源的最大需求量已经满足,"<<endl;
cout<<"因此在进程结束后系统将回收这些资源!"<<endl;
cout<<"在资源收回之后,各进程的资源需求和分配情况如下所示:"<<endl;
showdata();
}
}
}
cout<<endl;
cout<<" 是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ";
cin>>flag; }
}
五、实验结果
1. 执行结果
2. 结果分析
银行家算法就是当接收到一个系统资源的分配后找到一个安全序列,使得进程间不会发生死锁,若发生死锁则让进程等待。
六、实验总结
通过本次银行家算法实验,加深了我对银行家算法的了解,掌握了如何利用银行家算法避免死锁。实验中遇到点问题,通过查阅资料、询问老师顺利解决。通过这次的实践,使我的理论知识更加的牢固。
其中专业理论知识内容包括:保安理论知识、消防业务知识、职业道德、法律常识、保安礼仪、救护知识。作技能训练内容包括:岗位操作指引、勤务技能、消防技能、军事技能。
二.培训的及要求培训目的
安全生产目标责任书
为了进一步落实安全生产责任制,做到“责、权、利”相结合,根据我公司2015年度安全生产目标的内容,现与财务部签订如下安全生产目标:
一、目标值:
1、全年人身死亡事故为零,重伤事故为零,轻伤人数为零。
2、现金安全保管,不发生盗窃事故。
3、每月足额提取安全生产费用,保障安全生产投入资金的到位。
4、安全培训合格率为100%。
二、本单位安全工作上必须做到以下内容:
1、对本单位的安全生产负直接领导责任,必须模范遵守公司的各项安全管理制度,不发布与公司安全管理制度相抵触的指令,严格履行本人的安全职责,确保安全责任制在本单位全面落实,并全力支持安全工作。
2、保证公司各项安全管理制度和管理办法在本单位内全面实施,并自觉接受公司安全部门的监督和管理。
3、在确保安全的前提下组织生产,始终把安全工作放在首位,当“安全与交货期、质量”发生矛盾时,坚持安全第一的原则。
4、参加生产碰头会时,首先汇报本单位的安全生产情况和安全问题落实情况;在安排本单位生产任务时,必须安排安全工作内容,并写入记录。
5、在公司及政府的安全检查中杜绝各类违章现象。
6、组织本部门积极参加安全检查,做到有检查、有整改,记录全。
7、以身作则,不违章指挥、不违章操作。对发现的各类违章现象负有查禁的责任,同时要予以查处。
8、虚心接受员工提出的问题,杜绝不接受或盲目指挥;
9、发生事故,应立即报告主管领导,按照“四不放过”的原则召开事故分析会,提出整改措施和对责任者的处理意见,并填写事故登记表,严禁隐瞒不报或降低对责任者的处罚标准。
10、必须按规定对单位员工进行培训和新员工上岗教育;
11、严格执行公司安全生产十六项禁令,保证本单位所有人员不违章作业。
三、 安全奖惩:
1、对于全年实现安全目标的按照公司生产现场管理规定和工作说明书进行考核奖励;对于未实现安全目标的按照公司规定进行处罚。
2、每月接受主管领导指派人员对安全生产责任状的落
展开阅读全文