搜索
您的当前位置:首页正文

银行家算法的模拟实现—实验报告.docx

来源:六九路网


《银行家算法的模拟实现 》

--

实验报告

目 : 银行家算法的模拟实现 业 : 级 : 员 :

指导老师 :

一、实验目的

死锁会引起计算机工作僵死, 因此操作系统中必须防止。

本实验的目的在于让学生独立

的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序, 了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。

二、实验内容

模拟实现银行家算法实现死锁避免。要求:初始数据(如系统在

况、每一种资源的总数量)从文本文件读入,文件中给出最大需求矩阵

T0 时刻的资源分配情

Max、分配矩阵

Allocation ,在程序中求得需求矩阵 Need 和可利用资源向量 Available 。

三、实验分析过程

1、整个银行家算法的思路。

先对用户提出的请求进行合法性检查, 查。

1) 进程一开始向系统提出最大需求量

.?

2) 进程每次提出新的需求 ( 分期贷款 ) 都统计是否超出它事先提出的最大需求量.? 3) 若正常 , 则判断该进程所需剩余剩余量 ( 包括本次申请 ) 是否超出系统所掌握的 ? 剩余资源量 , 若不超出 , 则分配 , 否则等待

再进行预分配, 利用安全性检查算法进行安全性检

2、算法用到的主要数据结构和 ( 2)、最大需求矩阵

C 语言说明。

( 1)、可利用资源向量 INT AVAILABLE[M] M

INT MAX[N][M] N INT NEED[N][N]

( 3)、已分配矩阵INT ALLOCATION[N][M] ( 4)、还需求矩阵

为资源的类型。

为进程的数量。

开 始

输入资源数

m, 及各类资源总数, 初始

输入进程数 n,

Y

i ≤ n

N

输入进程 i 的最大需求向量

N

提 错

max≤资源总

Y

i 加 1

初始化 need

Y

所 有 进 程 运 行

Need 矩阵为

N

结 束

任选一个进程作为

Y

该 进 程 的 Need 向量为 0

N

该 进 程 已 运 行

输入该进程的资源请求量

调用银行家算法, 及安全 性算法, 完成分配, 或并

( 5)、申请各类资源数量 int Request[x]; .\"<cout<<\"| -------|------------ cout<<\"| -------| cout<<\"| cout<<\"|

| A

|-----------

|---------- | ----------- |\"<| Allocation| Need | available |\"<|

|

|\"<最大需求矩阵 | 已分配矩阵 -|- 需求矩阵 -| 可利用资源 -|\"<|

|-----------

资源 | Max

cout<<\"| 进程 for(i=0;i<5;i++) {

cout<<\"| -------|------------

|---------- | ----------- |\"<cout<<\"| p\"<for(j=0;j<3;j++) { cout<<\" | \";

cout<for(j=0;j<3;j++) { cout<<\" | \";

cout<<\" \"<for(j=0;j<3;j++) {

cout<<\" \"<cout<<\" |\"; if(i==0) {

for(j=0;j<3;j++) {

cout<<\" \"<cout<<\" |\";

if(i>0) {cout<<\" cout<cout<<\"|-------|------------|-----------|----------|-----------|\"<|\"; }

}

/*-------- {

试分配函数 -------*/

void tryfenpei(int i)

for(int f=0;favailable[f]=available[f]-request[f]; allocation[i][f]=allocation[i][f]+request[f]; need[i][f]=need[i][f]-request[f];

}

}

/*--------

void refenpei(int i) {

for(int f=0;favailable[f]=available[f]+request[f]; allocation[i][f]=allocation[i][f]-request[f]; need[i][f]=need[i][f]+request[f];

}

}

int com(int *p,int *q) {

int i;

for(i=0;iif(p[i]>q[i])

return 0;

return 1;

}

/*--------

void checksafe(int s)

恢复数据函数 -------*/

安全检测函数 ---------*/

{

int flag,temp[t],i,j,l,k=0; bool finish[t]; for(i=0;ifinish[i]=false;

for(j=0;jwork[j]=available[j];

cout<<\"|-------|-----------------|----------|\"<cout<<\"| resource |-Work+Allocation-|--Finish--|\"<l=0;

for(j=0;jif(need[i][j]>work[j])

l=1;

break;

}

if(finish[i]==false&&l==0) {

cout<<\"| p\"<for(j=0;jwork[j]=work[j]+allocation[i][j]; if(work[j]>9)

cout<<\" \"<cout<<\" \"<}

cout<<\" \"; cout<<\"|\"; cout<<\" \"; finish[i]=true; cout<<\"true \"; cout<<\"|\";

temp[k]=i;.\"<refenpei(in);

cout<<\" 恢复数据成功 ! 正在打印输出 ...\"<} else

|

|\"<cout<<\"|-------|-----------------|----------|\"<{

cout<<\" 找到一个安全系列: for(i=0;icout<<\"P\"<\";

cout<!\"<\";

cout<<\" 开始 第 \"<<\"p]\"<cout<} } }

五、程序运行结果及分析

1、运行 果

入初 , 行安全性 , 果安全序列,依次

P4-P0-P1-P2-P3 分配 源:

源不足,无法 :

2、出 及解决方案

本程序考 了程序功能 、 格式 示合理化、 入 异常 理等各个方面的 ,尽可能使程序 的更加完美。在 期的 程中遇到 多 ,通 网上搜索、 料、 等方法一一解决。下面大致 列一些主要 :

( 1)、关于某些判断算法 劣 :

在程序中很多地方都会用到循 判断是否符合条件的算法,在 些算法 有很多方法,而有的算法可以更 省 。如下安全性算法中 找 找符合 Finish[i]==0

/* 算法一:

for (j=0; jif (Work[j]>=Need[i][j]) counter=counter+1;//

if(counter==m){ ⋯

*/ //

算法二:

for (j=0; jif (Work[j]>=Need[i][j]); // else{

counter=1; break;

可用大于等于需求

条件的 程的例子:

}

if(counter!=1){

然算法二要 于算法一。本程序中 有很多 似的地方。 里主要考 的是一个程序的 化 。

( 2)、关于某些系 函数 用 的 行 序:

在 用一些系 函数如 getch() 、system(\"pause\") 等 其 行 序的一些 。如 似:

cout<<\" ==================================\"<cout<<\" \\n\\n\\n\"<此 :在

示,而在 器 先 示后 停。

Microsoft

Visual C++ 中先 行

system(\"pause\")

再 出

Bloodshed Dev-C++中 序 行; 但当把 cout<<\"

其他不 , 在两中 器中均 序 行,即

\\n\\n\\n\"<改 cout<找了一下相关帮助:

在中有 的一个 << flush; }

inline 函数:

inline _CRTIMP ostream& __cdecl endl(ostream& _outs) { return _outs << '\\n'

。也就是

endl= return _outs << '\\n' << flush; endl

除了写 '\\n' 外, 用

'\\n'

flush 函数,刷新 冲区,把 冲区里的数据写入文件

或屏幕。如果考 效率就用

( 3)、关于 置 停的方法:

在有些地方需要 停一下以便于用 看信息等,

法:

方法一: #include <>

system(\"pause\");// 方法二: #include <> getchar();// 方法三: #include <> getch();// 方法四:

使用 char* tt=new char; cin>>tt;

等待 入,不返回任何 ,无任何 示

按回 束,不是任意

停一下并 示“ 入任意 ⋯”

了下大致可用以下几中方

方式,要求 入一个与程序无关的 量

六、心得体会

“ 行家算法的模 ”是本学期操作系 程唯一的 程 。在 此程序的

程中,我 遇到 多 ,也学到了很多 西。本程序的 主要是用 ,通 程序算法的 化、 程中的 的考 解决,在 大的 是算法的 构 ,

出 示的格式 、

入 程中的异常 理等一些

要真正 需要

C++学 上也有了很大的 步。程序 程中开始遇到的最

本上只 了 要求及 的算法,

C++ 言

考虑很多方面。 在算法的数据结构设计上考虑了很长时间。 络资料, 也参考了一些别人写的的程序,

设计方式, 对一些算法的优越性等也作了一些考虑。 发生的错误。 比如一般的要求输入为数字时, 接受键盘输入的字符为字符串,

在程序设计中先后参考了很多网

综合这些算法思想和自己的思路对程序做了很好的

此外考虑最多的就是异常错误处理的设

至少能应对一些常见的可能

程序就会立即出

如果有非数

函数进行处理,处理方式为:

Y/N 时,按一般的

还有很

计。一个好的程序必须能在各种环境下都有其相应的处理方式, 错无法继续运行,本程序针对这个问题设计了一个 字字符出现则提示出错并要求重新输入。

shuzi();

如果输入了一个非数字字符,

然后对字符串的每个字符进行判断是否为数字,

又如在判断是否继续时要求输入

方式, 如果输入为多个字符, 则多余的字符会保存在缓冲区, 多类似的错误处理。 还有在设置程序的显示优化时,

到下次要求输入时输入而导致

出错,对此问题设计处理方式为接受输入字符保存为串然后只取其首字符进行判断。 不同,如此等等。

发现暂停函数在不同的情况下执行顺序

因篇幅问题不能全部显示,请点此查看更多更全内容

Top