1、银行家算法洛阳理工学院实验报告系别计算机与信息工程系班级B100508学号B10050812姓名课程名称 计算机操作系统实验日期2012/12/13实验名称银行家算法成绩实验目的:1. 了解进程产生死锁的原因,了解为什么要进行死锁的避免。2. 掌握银行家算法的数据结构,了解算法的执行过程,加深对银行家算法的理解。一、实验条件:计算机一台,软件vc+6.0二、实验原理:n个并发进程共享m个系统资源的系统,进程可动态申请资源和释放资源。系统按各进程的申请动态的分配资源,先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检测算法进行安全性检测,如果系统分配资源,系统进入安全状态,则预分配就是
2、正式分配,如果系统分配资源,系统进入不安全状态,则撤销预分配。三、实验内容#include #include int M=3,N=5;/M为资源数量N为进程数量int available3; /预分配前各类资源可用数量int max53; /各进程需要各资源最大数量int allocation53;/各进程已分配各类资源的数量int need53;/各进程需要各类资源的数量int request3;/进程对某一类资源的请求int work3;/预分配后各类资源可用数量int finish5;/进程结束标志数组。0表示分配失败,资源不足以满足需求量;1表示分配成功,资源满足需求量int safe
3、()/预分配后安全性检测 int i=0; int j=0; int k=0; int flag1=0;/所有进程安全结束;0表示安全可以安全结束,1表示不可以安全结束 int flag2=0;/某进程对资源的需求量与可利用量的大小标志;0表示需求小于可利用,1表示需求大于可利用 for(i=0;iN;i+) finishi=0;/各进程结束标志初始化为0。 for(i=0;iM;i+) worki=availablei;/预分配后各资源可利用量赋值给work数组 while(jN) for(i=0;iN;i+) if(!finishi)/i进程尚未分配 flag2=0; for(k=0;kw
4、orkk)/需求大于可利用 flag2=1; break; if(flag2=0) work0=work0+allocationi0;/收回已分配的资源 work1=work1+allocationi1;/收回已分配的资源 work2=work2+allocationi2;/收回已分配的资源 finishi=1; j+; for(i=0;i5;i+) if(finishi=0) flag1=1;/判断各进程是否能够安全结束标志,1表示不能安全结束 break; if(flag1=0) return 0;/预分配安全 else return 1;/预分配不安全int diaodu() int n
5、ame; int r=0;/ int i=0; int j=0; printf(请输入是几号进程申请资源n); scanf(%d,&name); getchar(); for(i=0;iM;i+) printf(请输入进程%d申请%i资源的个数n,name,i); scanf(%d,&requesti); getchar(); while(neednameirequesti) printf(不允许索取大于需求量,请重新输入n); scanf(%d,&requesti); if(availableirequesti) printf(检查用户的请求大于系统中的可利用资源数量,进程%d先等待。n,n
6、ame); r=1; break; if(r=0) /进行资源的预分配 for(i=0;iM;i+) availablei=availablei-requesti; allocationnamei=allocationnamei+requesti; neednamei=neednamei-requesti; return 1;/预分配成功 else return 0;/预分配失败 void main() int i=0,j=0; int k=0; int r=0; int q=1;/继续分配标志。0表示不继续分配 1表示继续分配 int name=0;/申请资源进程的名字 printf(请输入
7、最大需求矩阵n); for(i=0;iN;i+) / printf(请输入进程%d的各资源最大需要的数量n,i); for(j=0;jM;j+) scanf(%d,&maxij); getchar(); printf(请输入各进程已分配的矩阵n); for(i=0;iN;i+) /printf(请输入进程%d的各资源已分配的数量n,i); for(j=0;jM;j+) scanf(%d,&allocationij); getchar(); printf(请输入各进程还需要各资源所需数量的矩阵n); for(i=0;iN;i+) / printf(请输入进程%d还需要各资源的数量n,i); fo
8、r(j=0;jM;j+) scanf(%d,&needij); getchar(); printf(请输入各资源可利用的数量n); for(i=0;iM;i+) scanf(%d,&availablei); getchar(); / /调度并检测安全性 / do int r=diaodu(); switch(r) case 1: k=safe(); if(k=0)/预分配安全 printf(分配成功!结果如下); printf(各进程已分配的矩阵n); for(i=0;iN;i+) for(j=0;jM;j+) printf(%d ,allocationij);/打印输出各进程已分配的矩阵 p
9、rintf(n); printf(各进程还需要各资源的矩阵n); for(i=0;iN;i+) for(j=0;jM;j+) printf(%d ,needij);/打印输出各进程还需要各资源的矩阵 printf(n); printf(各资源可利用的数量n); for(i=0;iM;i+) printf(%d ,availablei);/打印输出各资源可利用的数量 printf(n); else/预分配不安全 printf(调度失败!); for(i=0;iM;i+) /撤销预分配的资源 availablei=availablei+requesti; allocationnamei=alloc
10、ationnamei-requesti; neednamei=neednamei+requesti; break; case 0: break; printf(是否继续,输入0否,输入1继续n); scanf(%d,&q); while(q=1);四、原始数据纪录:输入数据:最大需求矩阵: 已分配的矩阵 还需求的矩阵 可利用的数量 进程0:7,5,3 0,1,0 7,4,3 3,3,2进程1:3,2,2 2,0,0 1,2,2 进程2:9,0,2 3,0,2 6,0,0进程3:2,2,2 2,1,1 0,1,1进程4:4,3,3 0,0,2 4,3,1T0时刻:0号进程申请:1,0,2T1时刻
11、:1号进程申请:3,3,0T2时刻:3号进程申请:0,1,0输出数据:五:结论如图所示,实际输出数据与预期的输出相同。通过本次上机实验熟悉了银行家算法,深入了解了计算机利用银行家算法避免死锁的机制。有利于以后更好的理解操作系统内部各个机制功能的实现。附录:用C语言实现提示1. 算法用到的主要数据结构(1)可利用资源向量 int AvailableM /M为资源的类型(2)最大需求矩阵 int MaxNM /N为进程的数量(3)已分配矩阵 int AllocationNM (4)还需求矩阵 int NeedNM(5)申请各类资源数量int Requestx; /进程对某一类资源的请求(6)工作向量 int Workx;(7)进程结束标识数组int Finishy; /表示系统是否有足够的资源分配给进程y,0为否,1为是2. 银行家算法 (主程序)(1)系统初始化。输入进程数量,资源种类,各进程已分配、还需求各资源数量,各资源可用数量等。(2)输入用户的请求三元组(i,j,k),为进程i申请k个j类资源。(3)检查用户的请求是否小于还需求的数量,条件是 k=Needi,j。如果条件不符则提示重新输入,即不允许索取
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1