logo资料库

操作系统实验银行家算法_.doc

第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
资料共13页,剩余部分请下载后查看
实 验 报 告 课程名称_ 实验名称 操作系统实验 银行家算法____ 实验类型________设计型_________________ 实验地点____304 机房_实验日_2010.4.27____ 指导教师______李文超___________________ 专 班 学 姓 成 业___计算机科学与技术__ 级___算计 0901____________ 号___0911010123__________ 名___胡建勇____________ 绩 ______________ 辽宁石油化工大学计算机与通信工程学院
一.实验目的 银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一 个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和 了解死锁和避免死锁的具体实施方法。 二.实验原理 当用户申请一组资源时,系统必须做出判断,如果把这些资源分出去,系统是 否还处于安全状态。 若是,就可以分出这些资源;否则,该申请暂不予满足。 1.数据结构 假设有 M 个进程 N 类资源,则有如下数据结构: MAX[M*N] M 个进程对 N 类资源的最大需求量 AVAILABLE[N] 系统可用资源数 ALLOCATION[M*N] M 个进程已经得到 N 类资源的资源量 NEED[M*N] M 个进程还需要 N 类资源的资源量 2.银行家算法 设进程 I 提出请求 Request[N],则银行家算法按如下规则进行判断。 (1)如果 Request[N]<=NEED[I,N],则转(2);否则,出错。 (2)如果 Request[N]<=AVAILABLE,则转(3);否则,出错。 (3)系统试探分配资源,修改相关数据: AVAILABLE=AVAILABLE-REQUEST ALLOCATION=ALLOCATION+REQUEST NEED=NEED-REQUEST (4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢 复原状,进程等待。 3.安全性检查 (1)设置两个工作向量 WORK=AVAILABLE;FINISH[M]=FALSE (2)从进程集合中找到一个满足下述条件的进程, FINISH[i]=FALSE NEED<=WORK 如找到,执行(3);否则,执行(4) (3)设进程获得资源,可顺利执行,直至完成,从而释放资源。 WORK=WORK+ALLOCATION FINISH=TRUE GO TO 2 (4)如所有的进程 Finish[M]=true,则表示安全;否则系统不安全。
辽宁石油化工大学计算机与通信工程学院实验报告 三.实验内容 1.设计进程对各类资源最大申请表示及初值确定。 2.设定系统提供资源初始状况。 3.设定每次某个进程对各类资源的申请表示。 4.编制程序,依据银行家算法,决定其申请是否得到满足。 四.实验环境 软件环境:Tc 或 Visual C++ 五.实验方案 1.定义银行家算法中的数据结构 Available[],Allocation[],Need[],等利用定义的 全局变量进行函数间值的传递 2.此实验通过 3 个函数实现,a:主函数 main()b:安全检测函数 Check,b:输 出函数 Print()。 3,。主函数 main()的实现:输入已知条件,利用安全检测函数检测已知的进程 分配情况是否安全状况。如果为安全,则输入需请求资源的进程号和所需资源数, 否则结束主函数。Reqi 为进程 i 的请求向量。进行银行家算法: (1):如果 reqi[j]>Need[i][j]则认为出错,输出请求的资源数超过它所需的最大数; 否则执行(2); (2):如果 reqi[j]>Available[i][i]则输出尚无足够的资源;否则执行(3). (3):系统试探着把资源分配给进程 i,并修改下面数据结构中的数值: Available[i]= Available[i]-reqi[j]; Allocation[i][j]=Allocation[i][j+reqi[j]; Need[i][j]=Need[i][j]-reqi[j];并且保存修改前的数值。 4.安全检测函数 Check(): (1)设置两个向量 work 和 finish:work=Available,表示系统可提供给进程继续 运行所需的各类资源数目;finish 表示系统是否有足够的资源分配给进程,使 之 完 成 。 开 始 时 先 做 finish[i]=false; 当 有 足 够 资 源 分 配 给 进 程 时 , 再 令 finish[i]=true。 (2) 从 进 程 集 合 中 找 到 一 个 能 满 足 下 述 条 件 的 进 程 : a : finish[i]=false; b;Need[i][j]=work[j]; 若找到,执行(3),否则,执行(4)。 (3):当进程 i 获得资源后,可顺利执行,直到完成,并释放出分配给它的资源, 故应执行: Work[i]=work[i]+Allocation[i][j]; Finish[i]=true; a[v++]=I; go to step 2; (记录安全序列) (4):如果所有进程的 finish[i]=true 都满足,则表示系统处于安全状态,输出安 全状态序列;否则,系统处于不安全状态。
5.输出函数 Print();利用循环体输出各个进程号,已分配的资源数,仍需要的资 源数,剩余的可用资源数。 六.实验步骤: 1.程序流程图: 主函数:
银行家算法
安全性检查 2.程序源代码: #include #define M 10//宏定义二维数组的储存空间大小 int Allocation[M][M],Need[M][M],Available[M]; int n,m,r; void main() { void Check();//声明安全性检测函数 void Print();//声明输出函数 //定义全局变量
int i,j,p=0,q=0; char k; int req[M],all[M][M],need[M][M],ava[M];//暂存当前各进程的资源状态数组 printf("欢迎使用检测避免进程死锁系统\n"); printf("请输入进程数目:");//输入已知进程数以及各个进程的资源状况 scanf("%d",&n); printf("请输入资源的种类总数:"); scanf("%d",&m); printf("请输入已知各个进程分配资源数:\n"); printf("Allocation:\n"); for(i=0;iNeed[i][j])/*判断请求是否超过该进程所需的各类最大资 源数*/
p=1; printf("请求的资源已超出最大资源数"); //如果超出,输出申请资源失败原因 if(p) else { for(j=0;j<=m;j++) if(req[j]>Available[j])/*判断申请的资源数是否超出该进程的可 用的各类资源数 */ q=1; if(q) //如果超出,输出申请资源失败的原因 printf("该进程没有足够的给类的可用的资源了"); else { for(j=0;j
分享到:
收藏