操作系统实验报告 银行家算法

时间:2020-11-27 10:17:42 手机站 来源:网友投稿

PAGE

昆明理工大学信息工程与自动化学院学生实验报告

( 201 — 201 学年 第 二 学期 )

课程名称:操作系统 开课实验室: 年 月 日

年级、专业、班

学号

姓名

成绩

实验项目名称

银行家算法

指导教师

教师评语

教师签名:

年 月 日

一、实验目的

通过编写银行家算法,要求学生进一步掌握如何实现死锁的避免,进一步熟练使用数组进行程序的设计及实现。

二、实验原理及基本技术路线图(方框原理图)

用C语言或C++语言开发。实现银行家算法、安全性检测算法。有能力的同学再完成死锁检测算法。

数据结构定义及主要变量:

int available[m]; //系统可用资源

int claim[n, m]; //进程最大需求

int allocation[n, m]; //进程当前已分配资源

int need[n, m]; //进程尚需要的资源

int request[ n, m]; //进程当前请求的资源

临时变量(安全检查时用):

int work[m]; //可分配资源和已分配资源之和

int finish[n]; //检查时标识是否有未完成进程

流程图:

三、所用仪器、材料(设备名称、型号、规格等)。

计算机一台

四、实验方法、步骤

程序源代码:

#include <stdio.h>

#define M 100

#define N 50

//全局变量定义

int Available[M]; //可利用资源数组

int Max[N][M]; //最大需求矩阵

int Allocation[N][M]; //分配矩阵

int Need[N][M]; //需求矩阵

int Request[N][M]; //M个进程还需要N类资源的资源量

int Finish[N];

int p[N];

int m,n; //M个进程,N类资源

//安全性算法

int Safe()

{

int i,j,l=0;

int Work[M]; //可利用资源数组

for (i=0;i<n;i++)

Work[i]=Available[i];

for (i=0;i<m;i++)

Finish[i]=0;

for (i=0;i<m;i++)

{

if (Finish[i]==1)

continue;

else

{

for (j=0;j<n;j++)

{

if (Need[i][j]>Work[j])

break;

}

if (j==n)

{

Finish[i]=1;

for(int k=0;k<n;k++)

Work[k]+=Allocation[i][k];

p[l++]=i;

i=-1;

}

else continue;

}

if (l==m)

{

printf("系统是安全的\n");

printf("系统安全序列是:\n");

for (i=0;i<l;i++)

{

printf("%d",p[i]);

if (i!=l-1)

printf("-->");

}

printf("\n");

return 1;

}

}

}

//银行家算法

int main()

{

int i,j,mi;

printf("请输入进程的数目:\n");

scanf("%d",&m);

printf("请输入资源的种类:\n");

scanf("%d",&n);

printf("输入每个进程对资源的最大需求量,按照%d*%d矩阵输入\n",m,n);

for (i=0;i<m;i++)

for(j=0;j<n;j++)

scanf("%d%d",&Max[i][j]);

printf("输入每个进程资源的目前占有量,按照%d*%d矩阵输入\n",m,n);

for (i=0;i<m;i++)

{

for(j=0;j<n;j++)

{

scanf("%d%d",Allocation[i][j]);

Need[i][j]=Max[i][j]-Allocation[i][j];

if (Need[i][j]<0)

{

printf("你输入的第%d个进程所拥有的第%d个资源错误,请重新输入:\n",i+1,j+1);

j--;

continue;

}

}

}

printf("请输入系统剩余资源量:\n");

for (i=0;i<n;i++)

scanf("%d",&Available[i]);

Safe();

while (1)

{

printf("输入要申请的资源的进程号:(第一个进程号为0,第二个进、程号为1,依此类推)\n");

scanf("%d",&mi);

printf("输入进程所请求的各个资源的数量\n");

for (i=0;i<n;i++)

{

if (Request[mi][i]>Need[mi][i])

{

printf("所请求资源数超过进程的需求量!\n");

return 0;

}

if (Request[mi][i]>Available[i])

{

printf("所请求资源数超过系统所有的资源数!\n");

return 0;

}

}

for (i=0;i<n;i++)

{

Available[i]-=Request[mi][i];

Allocation[mi][i]+=Request[mi][i];

Need[mi][i]-=Request[mi][i];

}

if (Safe())

printf("同意分配请求\n");

else

{

printf("SORRY你的请求被拒绝\n");

for (i=0;i<n;i++)

{

Available[i]+=Request[mi][i];

Allocation[mi][i]-=Request[mi][i];

Need[mi][i]+=Request[mi][i];

}

}

for (i=0;i<m;i++)

Finish[i]=0;

char Flag; //标志位

printf("是否再次请求分配?是请按Y/y,否请按N/n");

while (1)

{

scanf("%d",&Flag);

if (Flag=='Y'||Flag=='y'||Flag=='N'||Flag=='n')

break;

else

{

printf("请按要求重新输入:\n");

continue;

}

}

if (Flag=='Y'||Flag=='y')

continue;

else break;

}

}

五、实验过程原始记录(数据、图表、计算等)

程序运行截图:

六、实验结果、分析和结论(误差分析与数据处理、成果总结等。其中,绘制曲线图时必须用计算纸)

通过本次上机实验,我对银行家算法有了更深的理解。银行家算法可以保证系统中所有进程都能在有限的时间内得到需要的全部资源。而且银行家算法是通过动态的检测系统中资源分配情况和进程对资源的需求情况来决定如何分配资源的,在能确保系统处于安全状态时才把资源分配给申请者,从而避免发生死锁。经过这次上机,我们对c语言更加熟悉了,又对其忘记的部分进行了复习,不断的调试和改进的过程中,我们的编程能力也有所进步。我们要在每次上机时都有收获,对以前所学过的东西不断巩固和加深,这样我们才能在学习新知识的同时也复习了原来的内容,我们才能取得更大的进步。还有就是要多编写程序,在写程序的过程中我们能够发现很多错误并将其改正,这样我们也有很大的帮助。

  • 下载文档
  • 收藏
  • 0

推荐访问:实验报告 银行家 算法 操作系统

版权声明 :以上文章中选用的图片文字均来源于网络或用户投稿 ,如果有侵权请立即联系我们 , 我们立即删除 。