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语言更加熟悉了,又对其忘记的部分进行了复习,不断的调试和改进的过程中,我们的编程能力也有所进步。我们要在每次上机时都有收获,对以前所学过的东西不断巩固和加深,这样我们才能在学习新知识的同时也复习了原来的内容,我们才能取得更大的进步。还有就是要多编写程序,在写程序的过程中我们能够发现很多错误并将其改正,这样我们也有很大的帮助。
相关热词搜索: 实验报告 银行家 算法 操作系统入党积极分子竞选演讲稿优秀范文5篇入党积极分子竞选演讲稿优秀范文篇1尊敬的各位领导、老师、亲爱的同学们:大家好!室外寒风凛冽,而我心里却暖意融融。作为信
学习《中国共产党员领导干部廉洁从政若干准则》心得体会精选4篇学习《中国共产党员领导干部廉洁从政若干准则》心得体会精选篇1学习了《中国共产党党员领导干部廉洁从
六一儿童节学生作文400字优选3篇六一儿童节学生作文400字优选篇1六一儿童节,我们自己的节日。希望、焦虑不安、开心、兴奋都变成了大家脸部那灿烂的笑容,全部
在学习贯彻党内主题教育精神读书班上的发言4篇在学习贯彻党内主题教育精神读书班上的发言篇1开展学习贯彻习近平新时代中国特色社会主义思想主题教育是一件事关全局的
五年级小学生个人事迹篇4篇五年级小学生个人事迹篇篇1赵振炟,梁堂乡中心小学五年级二班的一名班干部,他品学兼优,性格开朗,乐于助人,善于思考,勤于探索,有较高
弘扬五四精神学生作文精选10篇弘扬五四精神学生作文精选篇1岁月时光总是匆匆忙忙,转眼间我们迎来了五月美好的季节,而每年的五月四号里是我国历史上一次伟大的青少
全面从严治党主体责任工作情况报告15篇全面从严治党主体责任工作情况报告篇120XX年以来,在县委、县政府的正确领导和县纪委的精心指导下,陈岱镇党委以落实全面
2023食堂后勤人员总结幼儿园3篇2023食堂后勤人员总结幼儿园篇1转眼间,20__年在忙忙碌碌中悄悄离去了,回顾这一学期后勤工作的大事小事,我们在上级领导
新时代中国特色社会主义思想主题教育个人学习体会3篇新时代中国特色社会主义思想主题教育个人学习体会篇1当前,学习贯彻习近平新时代中国特色社会主义思想主题教育正
小学争做新时代好少年心得体会4篇小学争做新时代好少年心得体会篇1于歆玥热爱学习,与人为善、明礼诚信,连年荣获校级优秀班干部、优秀少先队员、最美大队委等荣誉称