操作系统——实验2银行家算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

淮海工学院计算机科学系实验报告书

课程名:《操作系统原理》

题目:实验二银行家算法

班级:Z软件161

学号:**********

*名:***

1、实验目的与要求

银行家算法是操作系统中避免死锁的典型算法,用C/C++语言编写一个银行家算法的模拟程序。通过本实验可以加深对银行家算法的步骤和相关数据结构用法的更好理解。

2、实验内容或题目

用C/C++语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。程序能模拟多个进程共享多种资源的情形。进程可动态地申请资源,系统按各进程的申请动态地分配资源。要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源数量以及为某进程分配资源后的有关资源数据的情况。

实验说明:

初始时每个进程运行过程中的最大资源需求量Max[i,j]和系统已分配给该进程的资源量Allocation[i,j],可利用资源数量Available[j]均为已知(这些数值可以在程序运行时动态输入),而算法中其他数据结构的值(Need[i,j])则需要由程序根据已知量的值计算产生。

3、实验步骤

(1)认真理解好课本中银行家算法的实例。

(2)根据课本中银行家算法的描述,画出程序流程图。

(3)按照程序流程图,用C/C++语言编程并实现。

4、流程图

开始

结束

输入进程个数no1

输入资源类数no2

输入进程最大需求矩阵Max,已分配矩阵

Allocation 和可用矩阵矩阵Available

Need[][]=Max[][]-Allocation[][]

输出当前资源分配表

预分配

输入需申请资源的进

程号

输入是否合法

输入需申请资源的资

源量Request[]>Need[][]?

Request[]>Available[][]?

继续分配?调用check()函数继续

安全性检查

N

Y Y Y

N

N N Y

5、源代码与测试数据与实验结果(可以抓图粘贴)

⑴ 源代码如下所示:

#include "string.h"

#include "iostream"

using namespace std;

#define FALSE 0

#define TRUE 1

#define W 10

#define R 20

int M=4 ; //总进程数

int N=3 ; //资源种类

int ALL_RESOURCE[3]={9,3,6};//各种资源的数目总和

int MAX[4][3]={{3,2,2},{6,1,3},{3,1,4},{4,2,2}}; //M个进程对N类资源最大资源需求量int A V AILABLE[R]; //系统可用资源数

int ALLOCATION[4][3]={{1,0,0},{6,1,2},{2,1,1},{0,0,2}}; //M个进程已经得到N类资源的资源量

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

int Request[R]; //请求资源个数

void showdata() //函数showdata,输出资源分配情况

{

int i,j;

cout<<"各种资源的总数量(all):";

cout<<" [";

for (j=0;j

cout<<" "<

cout<<" ]";

cout<

cout<<"系统目前各种资源可用的数为(available):";

cout<<" [";

for (j=0;j

cout<<" "<

cout<<" ]";

cout<

cout<<" 各进程已经得到的资源量(allocation): "<

cout<<" 资源0"<<" 资源1"<<" 资源2"<

for (i=0;i

{

cout<<"进程p"<

for (j=0;j

cout<

cout<

}

cout<

cout<<" 各进程还需要的资源量(need):"<

cout<<" 资源0"<<" 资源1"<<" 资源2"<

for (i=0;i

for (i=0;i

cout<<"进程p"<

for (j=0;j

cout<

}

cout<

}

void changdata(int k) //分配资源

{

int j;

for (j=0;j

{

A V AILABLE[j]=A V AILABLE[j]-Request[j];

ALLOCATION[k][j]=ALLOCA TION[k][j]+Request[j];

NEED[k][j]=NEED[k][j]-Request[j];

}

}

void rstordata(int k) //恢复现场

{

int j;

for (j=0;j

{

A V AILABLE[j]=A V AILABLE[j]+Request[j];

ALLOCATION[k][j]=ALLOCA TION[k][j]-Request[j];

NEED[k][j]=NEED[k][j]+Request[j];

}

}

int chkerr(int s) //函数chkerr,检查是否安全

{

int WORK,FINISH[W];

int i,j,k=0;

for(i=0;i

FINISH[i]=FALSE;

for(j=0;j

WORK=A V AILABLE[j];

i=s;

do{

if(FINISH[i]==FALSE&&NEED[i][j]<=WORK){

WORK=WORK+ALLOCATION[i][j];

FINISH[i]=TRUE;

i=0;

}

else

{

i++;

}

相关文档
最新文档