银行家算法实验报告

  • 格式:doc
  • 大小:131.42 KB
  • 文档页数:14

操作系统实验报告 课程名称:计算机操作系统 实验项目名称:银行家算法 实验时间: 班级: 姓名: 学号:

实 验 目 的: 1.理解死锁避免相关内容; 2.掌握银行家算法主要流程; 3.掌握安全性检查流程。 实 验 环 境: PC机、windows2000 操作系统、Turbo C 2.0 / VC++6.0

实 验 内 容: 1.设计多个资源(≥3); 2.设计多个进程(≥3); 3.设计银行家算法相关的数据结构; 4.动态进行资源申请、分配、安全性检测并给出分配结果。 5.撰写实验报告,并在实验报告中画出银行家和安全性检查函数流程图; 实 验 过 程: 1.设计并编写银行家算法模拟程序。 2.在上机环境中输入程序,调试,编译。 3.设计输入数据,写出程序的执行结果。 4.根据具体实验要求,填写好实验报告。

成 绩: 指导教师(签名): 银行家算法的参考流程图如下:

结束 否 是 申请失败。 以上分配作废,恢复原来的分配状态: Available[j] = Available[j] + Request[i][j] Allocation[i][j]= Allocation[i][j]-Request[i][j] Need[i][j] = Need[i][j]+Request[i][j] N Y N Y Request[i][j]> Need[i][j] 出错返回:return(erroRequest[i][j]> Available[j] 出错返回:(进程阻塞) return(error) Available[j] = Available[j] – Request[i][j] Allocation[i][j]= Allocation[i][j] + Request[i][j] Need[i][j] = Need[i][j] – Request[i][j] 假定分配: 输入初始参数(资源分配及请求情开始 假定分配之后,系统安全吗? 申请成功。输出各种数据的变化

图 银行家算法流程图 安全性算法的参考流程图如下: 结果与分析: 编写银行家算法需要较好分析能力,需要细心和极大地耐心。编译时大大小小的错误,容易导致了下面全错,非常费劲。

Y 所有finish都为true? 输出安全序列

N Y N 存在Finish[i] =false

&&Need[i][j]< Available[j]

初始化Work和Finish

Finish[i]=true,Work[j]=Work[j]+ Allocation[j] 所有进程都找完了? Y

开始

图 安全性算法流程图 附录: #include //本实验中使用到的库函数 #include #include int max[5][3]; //开始定义银行家算法中需要用到的数据 int allocation[5][3]; int need[5][3]; int available[3]; int request[5][3]; char *finish[5]; int safe[5]; int n,i,m; int k=0; int j=0; int work[3]; int works[5][3];

void line() //美化程序,使程序运行时更加明朗美观 { printf(" ------------------------------------------------------------------\n"); }

void start() //表示银行家算法开始 { line(); printf(" 银行家算法\n"); line(); }

void end() //表示银行家算法结束 { line(); printf(" 银行家算法结束,谢谢使用\n"); line(); }

void input() //输入银行家算法起始各项数据 { for (n=0;n<5;n++) { printf("请输入进程P%d的相关信息:\n",n); printf("Max:"); for (m=0;m<3;m++) scanf("%d",&max[n][m]); printf("Allocation:"); for (m=0;m<3;m++) scanf("%d",&allocation[n][m]); for (m=0;m<3;m++) need[n][m]=max[n][m]-allocation[n][m]; } printf("请输入系统可利用资源数Available:"); for (m=0;m<3;m++) scanf("%d",&available[m]); }

void output() //输出系统现有资源情况 { line(); printf("资源情况 Max Allocation Need Available\n"); printf("进程 A B C A B C A B C A B C\n"); line(); for(n=0;n<5;n++) {

printf("P%d%9d%3d%3d%5d%3d%3d%6d%3d%3d",n,max[n][0],max[n][1],max[n][2],allocation[n][0],allocation[n][1],allocation[n][2],need[n][0],need[n][1],need[n][2]); if (n==0) printf("%6d%3d%3d\n",available[0],available[1],available[2]); else printf("\n"); } line(); }

void change() //当Request[i,j]<=Available[j]时,系统把资源分配给进程P[i],Available[j]和Need[i,j]发生改变 { for (m=0;m<3;m++) { available[m]-=request[i][m]; allocation[i][m]+=request[i][m]; need[i][m]-=request[i][m]; } }

void outputsafe() //输出安全序列的资源分配表 { printf("该安全序列的资源分配图如下:\n"); line(); printf("资源情况 Work Need Allocation Work+Allocation Finish\n"); printf("进程 A B C A B C A B C A B C\n"); line(); for(n=0;n<5;n++)

printf("P%d%9d%3d%3d%5d%3d%3d%5d%3d%3d%6d%3d%3d%12s\n",safe[n],works[safe[n]][0],works[safe[n]][1],works[safe[n]][2],need[safe[n]][0],need[safe[n]][1],need[safe[n]][2],allocation[safe[n]][0],allocation[safe[n]][1],allocation[safe[n]][2],works[safe[n]][0]+allocation[safe[n]][0],works[safe[n]][1]+allocation[safe[n]][1],works[safe[n]][2]+allocation[safe[n]][2],finish[n]); line(); }

int check() //安全性算法 { printf("开始执行安全性算法……\n"); for (m=0;m<3;m++) //数组work和finish初始化 work[m]=available[m]; for (n=0;n<5;n++) { finish[n]="false"; safe[n]=0; } k=0; for (m=0;m<5;m++) for (n=0;n<5;n++) if(strcmp(finish[n],"false")==0 && need[n][0]<=work[0] && need[n][1]<=work[1] && need[n][2]<=work[2]) //查找可以分配资源但尚未分配到资源的进程 { safe[k]=n; //以数组safe[k]记下各个进程得到分配的资源的顺序 works[safe[k]][0]=work[0]; works[safe[k]][1]=work[1]; works[safe[k]][2]=work[2]; work[0]+=allocation[n][0]; //进程执行后释放出分配给它的资源 work[1]+=allocation[n][1]; work[2]+=allocation[n][2]; finish[n]="ture"; //finish[n]变为1以示该进程完成本次分 k++; } for (m=0;m<5;m++) //判断是否所有进程分配资源完成 { if (strcmp(finish[m],"false")==0) { printf("找不到安全序列,系统处于不安全状态。\n"); return 0; //找不到安全序列,结束check函数,返回0