银行家算法实验报告 昆工
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
昆明理工大学信息工程与自动化学院学生实验报告
(2010 —2011 学年第二学期)
课程名称:操作系统开课实验室:计算中心444 2011 年 4 月28 日
一、实验目的
通过编写银行家算法,要求学生进一步掌握如何实现死锁的避免,进一步熟练使用数组进行程序的设计及实现。
二、实验原理及基本技术路线图(方框原理图)
用C语言或C++语言开发。实现银行家算法、安全性检测算法。
银行家算法就是对每一个请求进行检查,检查如果满足它是否会导致不安全状态。若是,则不满足该请求;否则便满足。利用银行家算法,我们可以来检测CPU为进程分配资源的情况,决定CPU是否响应某进程的的请求并为其分配资源,从而很好避免了死锁的产生。
算法的思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。
银行家算法的步骤:(1)如果Request<or =Need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。
(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:
Available=Available-Request[i];
Allocation=Allocation+Request;
Need=Need-Request;
(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
安全性检测算法:(1)设置两个向量
①工作向量Work。它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;
②标志向量Finish。它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=0,当有足够资源分配给进程时,令Finish[i]=1。
(2)从进程集合中找到一个能满足下述条件的进程:
①Finish[i]=0
②Need 如找到,执行步骤(3);否则,执行步骤(4)。 (3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行: Work=Work+Allocation; Finish[i]=1; 转向步骤(2)。 (4)如果所有进程的Finish[i]=1,则表示系统处于安全状态;否则,系统处于不安全状态。 主要的数据结构: (1)最大需求矩阵Max[ ][ ];(2)系统已分配资源Allocation[ ][ ] (3)资源的名称name[ ] (4)还需要资源Need[ ][ ] (5)请求资源向量Request[ ] (6)存放安全序列temp[ ] (7)存放系统可提供资源Work[ ] (8)Flag 标志 程序模块: main( )//系统的主函数 display()// 显示资源矩阵 int safe()//安全性算法 safe();//用银行家算法判定系统是否安 系统结构图: 程序流程图: 银行家算法流程图 安全性算法流程图 -6- 三、所用仪器、材料(设备名称、型号、规格等)。 计算机一台 四、实验方法、步骤 #include #define False 0 #define True 1 int Max[100][100]={0};//各进程所需各类资源的最大需求 int Avaliable[100]={0};//系统可用资源 char name[100]={0};//资源的名称 int Allocation[100][100]={0};//系统已分配资源 int Need[100][100]={0};//还需要资源 int Request[100]={0};//请求资源向量 int temp[100]={0};//存放安全序列 int Work[100]={0};//存放系统可提供资源 int M=100;//作业的最大数为100 int N=100;//资源的最大数为100 void display()//******************显示资源矩阵****************************************** { int i,j; printf("系统目前可用的资源[Avaliable]:\n"); printf("资源名称: "); for(i=0;i printf("%d ",name[i]); printf("\n"); printf("可用资源数量: "); for (j=0;j printf("%d ",Avaliable[j]); -7- printf(" \n Max Allocation Need Avaliable\n"); printf("进程名 "); for(j=0;j<4;j++){ for(i=0;i printf("%d ",name[i]); printf(" "); } printf("\n"); for(i=0;i { printf("%d",i); printf(" "); for(j=0;j printf("%d ",Max[i][j]); printf(" "); for(j=0;j printf("%d ",Allocation[i][j]); printf(" "); for(j=0;j printf("%d ",Need[i][j]); printf(" "); if(i==0) for (j=0;j printf(" %d",Avaliable[j]); printf("\n "); } } int safe()//*************************安全性算法 -8-