logo资料库

操作系统中的银行家算法.doc

第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
资料共17页,剩余部分请下载后查看
银行家算法的模拟实现 目录 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;i
cout<<"%% 程序开始,系统初始化输入 %%"<=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<<"==============================================================="<
分享到:
收藏