还剩6页未读,继续阅读
文本内容:
计算机操作系统实验报告
一、实验名称银行家算法
二、实验目的银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法
三、问题分析与设计
1、算法思路先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请
2、银行家算法步骤1如果RequestiVor=Need则转向步骤2;否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值2如果RequestVor=Available则转向步骤3;否则,表示系统中尚无足够的资源,进程必须等待3系统试探把要求的资源分配给进程Pi并修改下面数据结构中的数值Available=Available-Request[i];Allocation二Allocation+Request;Need=Need-Request;4系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态
3、安全性算法步骤1设置两个向量
①工作向量Work它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;
②布尔向量Finish它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false当有足够资源分配给进程时令Finish[i]=trueo2从进程集合中找到一个能满足下述条件的进程Finish[i]=falseNeedor=Work如找到,执行步骤3;否则,执行步骤43当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行Work=Work+Allocation;Finish[i]=true;转向步骤24如果所有进程的Finish[i]=true则表示系统处于安全状态;否贝L系统处于不安全状态四.程序源代码:^includestdio.httdefineW5〃最大进程数W=5^defineR3〃最大资源总数=3intAvailable
[3];〃可利用资源向量intMax
[5]
[3];〃最大需求矩阵intAllocation
[5]
[3];//分配矩阵intNeed
[5]
[3];〃需求矩阵intRequest
[3];〃进程请求向量voiddisposeprintf〃请输入可利用资源向量Available格式:abc\n〃;scanf〃%d%d%d〃,Available
[0]Available[l]Available
[2]printf〃请输入最大需求数Max格式:abc\n〃;forintj=0;j5;j++printf〃进程%由\、,j;scanf〃%d%d%d〃Max[j]
[0]Max[j]
[1]Max[j]
[2];printf〃请输入分配数Allocation格式:abc\n〃;forj=0;j5;j++printf〃进程%1\11〃,j;scanf〃%d%d%d〃Allocation[j]
[0]Allocation[j]
[1]A1location[j]
[2];}〃输入Max
[5]
[3]Available
[5]
[3]Allocation
[5]
[3]forj=0;j5;j++forinti=0;i3;i++Need[j][i]=Max[j][i]-Allocation[j][i]Need
[5]
[3]}mainprintf〃银行家算法\n〃;dispose;printf〃安全性检查\n〃;intWork
[3];〃系统可提供进程继续运行所需的各类资源数charFinish
[5];〃表示系统是否有足够的资源分配forinti=0;i5;i++Finish[=f;forintk=0;k3;k++Work[k]=Available[k];intq
[5];forintx=0;x50;x++printf(请输入一个序列\n〃);scanf〃%d%d%d%d%d〃q[O]q[l]q
[2]q
[3]q
[4];fori=0;i5;i++ifNeed[q[i]]
[0]=Work
[0]Need[q[i]][l]=Work[l]Need[q[i]]
[2]=Work
[2]〃比较Need[i][j]与Work[j]{fork=0;k3;k++Work[k]=Work[k]+Allocation[q[i]][k];Finish[二t;ifFinish
[0]==,VFinish[l]==,tFinish
[2]=tFinish
[3]=tFinish
[4]=t〃通过Finish[i]判断系统是否安全break;elseprintf〃此序列不是安全序列,请重新输入一个序列!\n〃;ifx=49return0;printf(〃这个系统安全!\n〃);inta;printf〃请输入Request进程\n〃;scanf〃%d〃a;printf〃该进程Requestabc\n〃;scanf〃%d%d%d〃,Request
[0]Request
[1]Request
[2];〃输入请求量Request
[3]ifRequest
[0]=Need[a]
[0]Request[l]=Need[a][l]Request[2=Need[a]
[2]〃判断Request[i]=Need[a][i]{ifRequest
[0]=Need[a]
[0]Request
[0]=Need[a]Request
[0]〈=Need[a]
[2]〃判断Request[i]=Available[a][i]{forintk=0;k3;k++{Available[k]=Available[k]-Request[k];Allocation[a][k]=Allocation[a][k]+Request[k];Need[a][k]=Need[a][k]-Request[k];〃如果上述判断成功,则修改相应的Available[k]Allocation[a][k]Need[a][k]}printf〃资源分配成功!\n〃;else{printf〃资源分配失败!\n〃;return0;elseprintf(〃资源分配失败!\n〃);return0;程序截图:银行家算法请输入可利用资源向量bailable(格式db.c〉332需揄入最大需求数Max(格式abc〉遍呈0753进程1322进程2902进程3:222修程4432请输入分配数A11cation〈格式a-bc〉0工0进程
12.00进程2302进程3211进程4743安全性检查请输大一个序列:13420咨个泵充安全、请输ARequest进程1该进程Requestb.c)102资源分配成功,五.实验总结多个进程同时运行时,系统根据各类系统资源的最大需求和各类系统的剩余资源为进程安排安全序列,使得系统能快速且安全地运行进程,不至发生死锁银行家算法是避免死锁的主要方法,其思路在很多方面都非常值得我们来学习借鉴银行家算法请输入可利用资源向量bailable(格式db.c〉332if入最大需求数Max(格式:a.bc〉进程0753进程广322进程2902进程3:222进程4432辜卓人分配数Allocation(格式:abc)
071.0进程i
2.00进程2302进程3211进程4743委至性检查请输入一个序列:咨个泵充安全、请输入ReQuest进程1该进程Requestb.c)
10.2资源分配成功,。