银行家算法实验报告 昆工

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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-

相关文档
最新文档