银行家算法的模拟实现
目录
1. 课设简介…………………………………………………2
2. 实验原理分析……………………………………………2
3. 程序结构分析……………………………………………4
4. 数据结构分析……………………………………………6
5.各子模块相关函数代码…………………………………9
6. 程序运行结果分析………………………………………20
7. 心得体会…………………………………………………30
8. 参考文献…………………………………………………31
银行家算法的模拟实现
1 课设简介:
1.1 课程设计题目
银行家算法的模拟实现
1.2 课程设计目的
1.2.1 了解进程产生死锁原因,了解为什么要进行死锁的避免。
1.2.2 掌握银行家算法的数据结构,了解算法的执行过程,加深对银行家算法的理解。
1.3 课程设计内容
设计一个 n 个并发进程共享 m 个系统资源的系统。进程可动态申请资源和释放资源,系统
按各进程的申请动态的分配资源。要求采用银行家算法实现。
2 实验原理分析:
2.1 整个银行家算法的思路
先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全
int Work[x];
性检查。
2.2 算法用到的主要数据结构和 C 语言说明。
2.2.1 可利用资源向量 INT AVAILABLE[M] M 为资源的类型。
2.2.2 最大需求矩阵 INT MAX[N][M] N 为进程的数量。
INT ALLOCATION[N][M]
2.2.3 已分配矩阵
2.2.4 还需求矩阵
INT NEED[N][N]
2.2.5 申请各类资源数量 int Request[x];
2.2.6 工作向量
2.2.7 int Finish[y]; //是否有足够的资源分配给进程,0 为否,非 0 为是
2.3 银行家算法主程序
2.3.1 系统初始化。调用函数 chushihua(),输入进程数量,资源种类,各资源可用数量,各
进程已分配、最大需求各资源数量等
2.3.2 安全性算法调用函数 safe()检查当前资源分配状态。
2.3.3 调用 bank()函数,输入用户的请求三元组(I,J,K),为进程 I 申请 K 个 J 类资源。
2.3.4 检查用户请求是否小于还需求量,条件是 K<=NEED[I,J]。如果条件不符则提示重新输入,
即不允许索取大于需求量
2.3.5 检查用户的请求是否小于系统中的可利用资源数量,条件是 K<=AVALIABLE[I,J]。如果条
件不符则申请失败,阻塞该进程,重新进行进程动态资源申请(使用 goto 语句跳转)
2.3.6 进行资源的预分配,语句如下:
AVALIBLE[I][J]= AVALIBLE[I][J]-K;
ALLOCATION[I][J]= ALLOCATION[I][J]+K;
NEED[I][J]=NEED[I][J]-K;
2.3.7 系统调用安全性检查算法(safe()函数)进行检查,如果检查不安全,则进行回收,进
程资源申请失败进入等待。否则不用回收,并检查该进程是否已获得所有需要资源,如是则
进行其拥有资源释放,语句如下:
Available[j]=Available[j]+Allocation[k][j];
Allocation[k][j]=0;
2.3.8 do{…}while 循环输入字符 Y/N 判断是否继续进行资源申请。
2.4 安全性检查算法(safe()函数)
2.4.1 设置两个临时变量:
FINISH[N]记录进程模拟执行的结束状态,初值为 0,如果可以模拟执行结束,则可设
为 1。
WORK[M]记录模拟执行中资源的回收情况,初值为 AVAILABLE[M]的值。
2.4.2 在进程中查找符合以下条件的进程。
条件 1:FINISH[I]=0
条件 2:NEED[I][J]〈=WORK[J]
2.4.3 如果查找成功则存储安全序列并进行资源的模拟回收,语句如下:
FINISH[I]=1
WORK[J]=WORK[J]+ALLOCATION[I][J];
2.4.4 如查找不成功,则根据不同地方的调用情况进行相应判断处理。
3 程序结构分析:
3.1 程序流程图
3.2 程序模块划分
本程序共有以下六个模块:
3.2.1、字符判断模块:判断输入的字符是否为数字,如果不是则提示出错并重新输入,主要
处理输入为非数字时程序出现运行错误现象。此模块功能由数字判断函数( int shuzi(int
sz); )实现。
3.2.2、程序初始化模块:用于程序开始进行初始化输入数据:进程数量、资源种类、各种资
源可利用数量、各进程的各种资源已分配数量、各进程对各类资源最大需求数等。此模块功
能在系统初始化函数(void chushihua(); )中实现。
3.2.3、当前安全性检查模块:用于判断当前状态安全性,根据不同地方的调用提示处理不同,
在安全性算函数(void safe(); )中实现。
3.2.4、银行家算法模块:进行银行家算法模拟实现的模块,调用其他各个模块进行银行家算
法模拟过程,在银行家算法函数(void bank();)中实现。
3.2.5、显示分配模块:显示当前资源分配详细情况,包括:各种资源的总数量(all)、系统目
前各种资源可用的数量、各进程已经得到的资源数量、各进程还需要的资源量,在显示分配
情况函数(void showdata(); )中实现。
3.2.6、签名模块:用于程序结束时显示程序版权声明签名等,在签名函数(void sign(); )中
实现。
//各种资源可利用的数量
//全局变量,主要用于循环语句中
4 数据结构分析
本程序所使用的主体数据结构如下:
4.1 定义全局变量
const int x=50,y=100; //定义常量,便于修改
int Available[x];
int Allocation[y][y]; //各进程当前已分配的资源数量
int Max[y][y]; //各进程对各类资源的最大需求数
int Need[y][y]; //还需求矩阵
int Request[x]; //申请各类资源的数量
int Work[x]; //工作向量,表系统可提供给进程运行所需各类资源数量
int Finish[y]; //表系统是否有足够的资源分配给进程,0 为否,1 为是
int p[y]; //存储安全序列
int i,j;
int n,m; //n 为进程的数量,m 为资源种类数
int l=0,counter=0;
4.2 函数声明
int shuzi(int sz); //数字判断函数,还可使用 void shuzi(int& sz); 方式
void chushihua(); //系统初始化函数
void safe();
void bank();
void showdata();
void sign();
4.3 主函数结构
int main(){
system("color 06f"); //设置当前窗口的背景色和前景色
//安全性算法函数
//银行家算法函数
//函数 showdata,输出当前资源分配情况
//签名函数
cout<<…… //显示程序开始提示信息
chushihua();
cout<
cout<
>"<<"进程"<<"("<(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()函数)进行检查,如果检查通过,则不用回收,
否则进行
回收,进程资源申请失败进入等待。
4、安全性检查算法(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,
返回不成功
标志。否则返回成功标志。
*/
#include
#include
#include
#include
#include
//===定义全局变量===
const int x=50,y=100;
int Available[x];
int Allocation[y][y];
int Max[y][y];
int Need[y][y]; //还需求矩阵
//定义常量,便于修改
//各种资源可利用的数量
//各进程当前已分配的资源数量
//各进程对各类资源的最大需求数
//存储安全序列
//n 为进程的数量,m 为资源种类数
int Request[x]; //申请各类资源的数量
int Work[x]; //工作向量,表示系统可提供给进程继续运行所需的各类资源数量
int Finish[y]; //表示系统是否有足够的资源分配给进程,0 为否,非 0 为是
int p[y];
int i,j;
int n,m;
int l=0,counter=0;
//函数声明
int shuzi(int sz);
void chushihua();
void safe();
void bank();
void showdata();
void sign();
//===数字判断函数===
int shuzi(int sz){
char *temp;
temp=new char;
int len; //存储取字符的长度
sz=0 ; //清零
char s; //
do{
//数字判断函数 或者使用 void shuzi(int& sz); 方式
//系统初始化函数
//安全性算法函数
//银行家算法函数
//函数 showdata,输出当前资源分配情况
//签名函数
//输入数据并判断是否为数字
//临时指针,存放输入字符
//输入赌注,只能输入数字
// gets(temp);
//getline(cin,temp)
cin>>temp;
//取字符长度
len=strlen(temp);
for(int i=0;i
'9'){
cout<<" 笨蛋,输错了! 你输入的是数字吗?! \n\n";
cout<<"请重新输入:";
break;
}
}
}while(s<'0' || s>'9');
for(int i=0;icout<<"%% 程序开始,系统初始化输入 %%"<
=Allocation[i][j])
Need[i][j] = Max[i][j]-Allocation[i][j];
else
Need[i][j]=0;//最大需求量小于已分配量时还需求量为 0,即此类资源已足够不需再申请
//计算还需求量
//
}
cout<//===安全性算法函数===
void safe(){
l=0;
for (i=0; i=Need[i][j])
//可用大于等于需求
counter=counter+1;//记数
*/
}
if(counter==m){…
//算法二:
for (j=0; j=Need[i][j]);
else{
counter=1;
break;
//可用大于等于需求
}
if(counter!=1){ //进程的每类资源量都符合条件 Work[j]>=Need[i][j] 条件二
p[l]=i;
//存储安全序列
Finish[i]=1;
//标志为可分配
for (j=0; j=Need[i][j]
i= -1; //从第一个进程开始继续寻找满足条件一二的进程
}
}
i++; //for 循环继续寻找
}
}
//===显示分配情况函数 ===
void showdata() //函数 showdata,输出当前资源分配情况
{
int i,j; //局部变量
int All[y]; //各种资源的总数量
int l2; //局部变量
l1,
cout<<"==============================================================="<