实验二:银行家算法实验报告书
时间:2025-07-15
时间:2025-07-15
淮海工学院计算机工程学院
实验报告书
课程名:《操作系统原理A》
题 目: 班 级: 软件122
学 号: 2012122734
姓 名: 韩莹
操作系统原理实验——银行家算法实验报告
1目的与要求:
1)本实验目的是通过使用银行家算法实现系统资源的分配和安全性检查模拟,提高学生对操作系统资源分配功能的深刻理解,并培养学生对操作系统开发的兴趣与应用能力;
2)实验前必须认真阅读和理解银行家算法的基本原理和实现方法;
3)独立使用C或VC++编程语言编写银行家算法模拟程序;
4)按照实验题目要求独立正确地完成实验内容(编写、调试算法程序,提交程序清单及及相关实验数据与运行结果)
5)于2014年4月25日以前提交本次实验报告(含电子和纸质报告,由学习委员以班为单位统一打包提交)。
2 实验内容或题目
1)设计五个进程{P0,P1,P2,P3,P4}共享三类资源{A,B,C}的系统,{A,B,C}的资源总数量分别为10,5,7。(参考书上用例)
2)并行进程可动态地申请资源和释放资源(程序交互输入申请或释放资源数量),系统按各进程的申请动态地分配资源。
3)每当进程动态申请资源或释放资源时,模拟程序应能及时显示或打印各个进程在此时刻的资源分配表、系统可用资源量和安全序列等资源分配信息和安全检查信息。
4)本次实验内容(项目)的详细说明以及要求请参见实验指导书。
3 实验步骤与源程序
#include "iostream.h"
#include<conio.h>
#define M 5
#define N 3
#define TRUE 1
#define FALSE 0
int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int AVAILABLE[N]={10,5,7};
int ALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
int NEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int Request[N]={0,0,0};
void displaydata()
{
int i,j;
cout<<" 系统可用的资源数为:"<<endl<<endl;
for (j=0;j<N;j++) cout<<" 资源"<<j<<": "<<AVAILABLE[j];
cout<<endl;
cout<<" 各进程还需要的资源量:"<<endl<<endl;
for (i=0;i<M;i++) {
cout<<"进程"<<i<<":";
for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<NEED[i][j];
cout<<endl; }
cout<<endl;
cout<<" 各进程已经得到的资源量: "<<endl<<endl;
for (i=0;i<M;i++) {
cout<<"进程"<<i<<":";
for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<ALLOCATION[i][j];
cout<<endl;
}
}
void changedata(int k)
{
int j;
for (j=0;j<N;j++)
{
AVAILABLE[j]=AVAILABLE[j]-Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
NEED[k][j]=NEED[k][j]-Request[j];
}
}
void restoredata(int k)
{ int j;
for (j=0;j<N;j++)
{ AVAILABLE[j]=AVAILABLE[j]+Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
NEED[k][j]=NEED[k][j]+Request[j];
}
}
int compare(int need[ ],int work[ ])
{int j;
for(j=0;j<N;j++)
{
if(need[j]>work[j])
{return 0;}
}
return 1;
}
int isSecurity(int available[3],int need[M][N],int allocation[M][N])
{int i,j,k=0,flag,finish[M],work[N],p[6];
for(i=0;i<M;i++)
{finish[i]=0;
for(j=0;j<N;j++)
{ work[j]=available[j];
}
while(1)
{
flag=FALSE;
for(i=0;i<M;i++) {
if(finish[i]==0&&compare(need[i],work)==TRUE)
{ for(j=0;j<N;j++)
work[j]+=allocation[i][j];
finish[i]=1;
p[k++]=i;
flag=1;
break;
}
}
if(flag==0) {
for(i=0;i<M;i++) {
if(finish[i]==FALSE)
return FALSE;
}
cout<<"安全序列为:"<<"p"<<p[0]<<"
p"<<p[4]<<endl;
return TRUE;
}
}
}
void main()
{
int x=1;
displaydata();
if(!isSecurity(AVAILABLE,NEED,ALLOCATION))
{
restoredata(x);
cout<<"不通过安全检测!"<<endl;
}
while(1)
{
cout<<"<1>申请资源\n<2>退出"<<endl;
cin>>x;
displaydata();
if(x==2)
break;
cout<<"要申请的资源为p:";
cin>>x;
p"<<p[1]<<" p"<<p[2]<<" p"<<p[3]<<"
}
} cin>>Request[0]>>Request[1]>>Request[2]; if(NEED[x][0]>=Request[0]&&NEED[x][1]>=Request[1]&&NEED[x][2]>=Request[2]) {changedata(x); if(!isSecurity(AVAILABLE,NEED,ALLOCATION)) { restoredata(x); cout<<"不通过安全检测!"<<endl; }} else cout<<"申请的资源数目大于需求资源!"<<endl; getch();
4 测试数据与实验结果(可以抓图粘贴)
5 结果分析与实验体会 通过这次的实验,银行家算法是一种最有代表性的避免死锁的算法。一个进程序列是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。加 …… 此处隐藏:1029字,全部文档内容请下载后查看。喜欢就下载吧 ……