还剩6页未读,继续阅读
文本内容:
计算机操作系统实验报告
1、实验名称银行家算法
2、实验目的银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法
3、问题分析与设计
1、算法思路先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请
2、银行家算法步骤
(1)如果Requesti<or=Need则转向步骤2;否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值
(2)如果Request<or=__ailable则转向步骤
(3);否则,表示系统中尚无足够的资源,进程必须等待
(3)系统试探把要求的资源分配给进程Pi并修改下面数据结构中的数值 __ailable=__ailable-Request[i]; Allocation=Allocation+Request;Need=Need-Request;4系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态
3、安全性算法步骤
(1)设置两个向量
①工作向量Work它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;
②布尔向量Finish它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时,令Finish[i]=true
(2)从进程__中找到一个能满足下述条件的进程
①Finish[i]=false
②Needor=Work如找到,执行步骤
(3);否则,执行步骤
(4)
(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行Work=Work+Allocation;Finish[i]=true;转向步骤
(2)
(4)如果所有进程的Finish[i]=true则表示系统处于安全状态;否则,系统处于不安全状态四.程序源代码#includestdio.h#defineW5//最大进程数W=5#defineR3//最大资源总数=3int__ailable
[3];//可利用资源向量int__x
[5]
[3];//最大需求矩阵intAllocation
[5]
[3];//分配矩阵intNeed
[5]
[3];//需求矩阵intRequest
[3];//进程请求向量voiddispose{printf请输入可利用资源向量__ailable格式:abc\n;scanf%d%d%d__ailable
[0]__ailable
[1]__ailable
[2];printf请输入最大需求数__x格式:abc\n;forintj=0;j5;j++{printf进程%d:\nj;scanf%d%d%d__x[j]
[0]__x[j]
[1]__x[j]
[2];}printf请输入分配数Allocation格式:abc\n;forj=0;j5;j++{printf进程%d\nj;scanf%d%d%dAllocation[j]
[0]Allocation[j]
[1]Allocation[j]
[2];}//输入__x
[5]
[3]__ailable
[5]
[3]Allocation
[5]
[3]forj=0;j5;j++forinti=0;i3;i++Need[j][i]=__x[j][i]-Allocation[j][i];//求出Need
[5]
[3]}__in{printf银行家算法\n;dispose;printf安全性检查\n;intWork
[3];//系统可提供进程继续运行所需的各类资源数charFinish
[5];//表示系统是否有足够的资源分配forinti=0;i5;i++Finish[i]=f;forintk=0;k3;k++Work[k]=__ailable[k];intq
[5];forintx=0;x50;x++{printf请输入一个序列:\n;scanf%d%d%d%d%dq
[0]q
[1]q
[2]q
[3]q
[4];fori=0;i5;i++{ifNeed[q[i]]
[0]=Work
[0]Need[q[i]]
[1]=Work
[1]Need[q[i]]
[2]=Work
[2]//比较Need[i][j]与Work[j]{fork=0;k3;k++Work[k]=Work[k]+Allocation[q[i]][k];Finish[i]=t;}}ifFinish
[0]==tFinish
[1]==tFinish
[2]==tFinish
[3]==tFinish
[4]==t//通过Finish[i]判断系统是否安全break;elseprintf此序列不是安全序列,请重新输入一个序列!\n;ifx==49return0;}printf这个系统安全!\n;inta;printf请输入Request进程:\n;scanf%da;printf该进程Requestabc\n;scanf%d%d%dRequest
[0]Request
[1]Request
[2];//输入请求量Request
[3]ifRequest
[0]=Need[a]
[0]Request
[1]=Need[a]
[1]Request
[2]=Need[a]
[2]//判断Request[i]=Need[a][i]{ifRequest
[0]=Need[a]
[0]Request
[0]=Need[a]
[1]Request
[0]=Need[a]
[2]//判断Request[i]=__ailable[a][i]{forintk=0;k3;k++{__ailable[k]=__ailable[k]-Request[k];Allocation[a][k]=Allocation[a][k]+Request[k];Need[a][k]=Need[a][k]-Request[k];//如果上述判断成功,则修改相应的__ailable[k]Allocation[a][k]Need[a][k]}printf资源分配成功!\n;}else{printf资源分配失败!\n;return0;}}else{printf资源分配失败!\n;return0;}}程序截图五.实验总结多个进程同时运行时,系统根据各类系统资源的最大需求和各类系统的剩余资源为进程安排安全序列,使得系统能快速且安全地运行进程,不至发生死锁银行家算法是避免死锁的主要方法,其思路在很多方面都非常值得我们来学习借鉴。