淮海工学院实验报告
淮海工学院计算机工程学院
实验报告书
课程名:《操作系统原理》
题目:实验二:进程调度
学号:2012130198
姓名:刘恒辉
一、实验目的
银行家算法是操作系统中避免死锁的典型算法,本实验可以加深对银行家算法的步骤和相关数据结构用法的更好理解。
二、实验要求
用C语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。程序能模拟多个进程共享多种资源的情形。进程可动态地申请资源,系统按各进程的申请动态地分配资源。要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源数量以及为某进程分配资源后的有关资源数据的情况。
cout<<"\tA B C\tA B C\tA B C\t A B C"<<endl;
for(i=0;i<N;i++)
{
cout<<cName[i]<<"\t";
for(j=0;j<M;j++)
cout<<iMax[i][j]<<" ";
cout<<"\t";
for(j=0;j<M;j++)
cout<<iAllocation[i][j]<<" ";
int iMax[N][M]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
//iNeed[N][M]每一个进程尚需的各类资源数
//iAllocation[N][M]为系统中每一类资源当前已分配给每一进程的资源数
int iNeed[N][M],iAllocation[N][M]={{0,1,1},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
}
}
}
//输出
void output(int iMax[N][M],int iAllocation[N][M],int iNeed[N][M],int iAvailable[M],char cName[N])
{
int i,j;
cout<<"\n\t Max \tAllocation\t Need \t Available"<<endl;
1.认真理解好课本中银行家算法的实例。
2.根据课本中银行家算法的描述,画出程序流程图。
3.按照程序流程图,用C语言编程并实现。
四、实验结果与分析
#include <iostream.h>
#include <string.h>
#define M 3 //资源的种类数
#define N 5 //进程的个数
for(j=0;j<M;j++)
iNeed[i][j]=iMax[i][j]-iAllocation[i][j];
//输出初始值
output(iMax,iAllocation,iNeed,iAvailable,cName);
//判断当前状态是否安全
bSafe=safety(iAllocation,iNeed,iAvailable,cName);
系统的状态可通过以下来描述:
进程剩余申请数=最大申请数-占有数;可分配资源数=总数-占有数之和;通过这个描述来算出系统是否安全,从而找出所有的安全序列。
2.银行家算法的局限性有哪些?
//是否继续提出申请
while(bExitFlag)
{
cout<<"\n"<<"继续提出申请?\ny为是;n为否。\n";
cin>>ch;
switch(ch)
{
case 'y':
//cout<<"调用银行家算法";
bSafe=banker(iAllocation,iNeed,iAvailable,cName);
}
}
if(flag==0)
{
cout<<"无安全序列"; //标志为0,证明已无满足条件iAllocation,退出循环,返回false
return false;
}
if(Finish[0]==true&&Finish[1]==true&&Finish[2]==true&&Finish[3]==true&&Finish[4]==true) //若所有Finish置为true,输出安全数列,返回True
{
cout<<"\n";
cout<<"安全序列为:";
for(x=0;x<5;x++)
cout<<num[x]<<" ";
cout<<"\n";
return true;
}
}
return true;
}
//安全返回true,不安全返回false
bool banker(int iAllocation[N][M],int iNeed[N][M],int iAvailable[M],char cName[N])
{
for(j=0;j<3;j++)
{
Work[j]+= iAllocation[i][j] ; //Work[j]+= Work[j]+iAllocation[i][j]
}
Finish[i]=true; //将Finish置true
flag++; //标志加1
num[x++]=cName[i]; //将该序列名赋给数组num[]
cout<<"\t";
for(j=0;j<M;j++)
cout<<iNeed[i][j]<<" ";
cout<<"\t";
cout<<" ";
//Available只需要输出一次
if (i==0)
for(j=0;j<M;j++)
cout<<iAvailable[j]<<" ";
cout<<endl;
//进程名
char cName[N]={'a','b','c','d','e'};
bool bExitFlag=true; //退出标记
char ch;//接收选择是否继续提出申请时传进来的值
bool bSafe; //存放安全与否的标志
//计算iNeed[N][M]的值
for(i=0;i<N;i++)
三、实验原理与步骤
实验中进程的数量、资源的种类以及每种资源的总量Total[j]最好允许动态指定。初始时每个进程运行过程中的最大资源需求量Max[i,j]和系统已分配给该进程的资源量Allocation[i,j]均为已知(这些数值可以在程序运行时动态输入),而算法中其他数据结构的值(包括Need[i,j]、Available[j])则需要由程序根据已知量的值计算产生。
{
int iMax[N][M]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int t,i,Request[3],check_1[3];
char x; //定义变量
cout<<"请输入进程名:"; //输入进程名
cin>>x;
if(x=='a')i=0;
if(x=='b')i=1;
return false;
}
}
for(t=0;t<3;t++) //将该变量的iAvailable、iAllocation、iNeed重新赋值
{
iAvailable[t]-=Request[t];
iAllocation[i][t]+=Request[t];
iNeed[i][t]-=Request[t];
void output(int iMax[N][M],int iAllocation[N][M],int iNeed[N][M],int iAvailable[M],char cName[N]); //统一的输出格式
bool safety(int iAllocation[N][M],int iNeed[N][M],int iAvailable[M],char cName[N]);
while(true) //执行无限循环,满足条件时跳出
{
flag=0; //每次循环开始时将记录本次循环中是否有使有满足条件iAllocation的标志置为0,若为0表示不存在,若不为0表示存在
for(i=0;i<5;i++) //执行循环,看有没有满足条件的iAllocation
{
if(Finish[i]==false&&Work[0]>=iNeed[i][0]&&Work[1]>=iNeed[i][1]&&Work[2]>=iNeed[i][2])
}
}
//安全性算法,进行安全性检查;安全返回true,并且输出安全序列,不安全返回false,并输出不安全的提示;