操作系统课设-死锁的避免(银行家算法)

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

计算机与信息工程系《计算机系统与系统软件》

课程设计报告

题目:模拟实现银行家算法实现死锁避免专业:

班级:

学号:

姓名:

指导老师:

2012年12 月25日

一、实验题目

模拟实现银行家算法实现死锁避免

二、目的:

1、了解进程产生死锁的原因,了解为什么要进行死锁的避免。

2、掌握银行家算法的数据结构,了解算法的执行过程,加深对银行家算法的理解。

三、内容:

模拟实现银行家算法实现死锁避免。要求:初始数据(如系统在T0时刻的资源分配情况、每一种资源的总数量)从文本文件读入,文件中给出最大需求矩阵Max、分配矩阵Allocation,在程序中求得需求矩阵Need和可利用资源向量Available。

四、实验提示:

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

先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查。

2、算法用到的主要数据结构和C语言说明。

(1)、可利用资源向量INT A V AILABLE[M] M为资源的类型。

(2)、最大需求矩阵INT MAX[N][M] N为进程的数量。

(3)、已分配矩阵INT ALLOCA TION[N][M]

(4)、还需求矩阵INT NEED[N][N]

(5)、申请各类资源数量int Request[x]; //

(6)、工作向量int Work[x];

(7)、int Finish[y]; //表示系统是否有足够的资源分配给进程,0为否,非0为是

3、银行家算法(主程序)

(1)、系统初始化。输入进程数量,资源种类,各进程已分配、还需求各资源数量,各资源可用数量等

(2)、输入用户的请求三元组(I,J,K),为进程I申请K个J类资源。

(3)、检查用户的请求是否小于还需求的数量,条件是K<=NEED[I,J]。如果条件不符则提示重新输入,即不允许索取大于需求量

(4)、检查用户的请求是否小于系统中的可利用资源数量,条件是K<=A V ALIABLE[I,J]。

如果条件不符则申请失败,阻塞该进程,重新进行进程动态资源申请(使用goto语句)

(5)、进行资源的预分配,语句如下:

A V ALIBLE[I][J]= A V ALIBLE[I][J]-K;

ALLOCATION[I][J]= ALLOCATION[I][J]+K;

NEED[I][J]=NEED[I][J]-K;

(6)、系统调用安全性检查算法(safe()函数)进行检查,如果检查通过,则不用回收,否则进行回收,进程资源申请失败进入等待。

4、安全性检查算法(safe()子函数)

(1)、设置两个临时变量。

FINISH[N]记录进程模拟执行的结束状态,初值为0,如果可以模拟执行结束,则可

设为1,也可设为其它非零值以表示执行的先后次序。

WORK[M]记录模拟执行中资源的回收情况,初值为A V AILABLE[M]的值。(2)、在进程中查找符合以下条件的进程。

条件1:FINISH[I]=0

条件2:NEED[I][J]〈=WORK[J]

(3)、如果查找成功则进行资源的模拟回收,语句如下:

WORK[J]=WORK[J]+ALLOCA TION[I][J];

FINISH[I]=1 或查找到的顺序号

(4)、如果查找不成功,则检查所有进程的FINISH[],如果有一个为0,则系统不为0,返回不成功标志。否则返回成功标志。

五、程序源代码

六、程序运行结果及分析

1、示例数据

(1)初始化文件内容,见运行结果中第一个数据框。

(2)P1发出请求向量Request1( 1 ,0 ,2 )

2、运行结果

3、出现问题及解决方案

本程序考虑了程序功能实现、格式显示合理化、输入错误异常处理等各个方面的设计,尽可能使程序设计的更加完美。在长期的设计调试过程中遇到过许多问题,通过网上搜索、查询资料、调试试验等方法一一解决。下面大致罗列一些主要问题:

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

在程序中很多地方都会用到循环判断是否符合条件的算法,在设计这些算法时有很多方法,而有的算法可以更节省时间。如下安全性算法中寻找寻找符合Finish[i]==0条件的进程的例子:

/* 算法一:

for (j=0; j

if (Work[j]>=Need[i][j]) counter=counter+1;//记数

if(counter==m){…

*/ //算法二:

for (j=0; j

if (Work[j]>=Need[i][j]); //可用大于等于需求

else{

counter=1;

break;

}

if(counter!=1){…

显然算法二要优于算法一。本程序中还有很多类似的地方。这里主要考虑的是一个程序的优化设计问题。

(2)、关于某些系统函数调用时的执行顺序:

在调用一些系统函数如getch() 、system("pause")等时发现其执行顺序的一些问题。如类似:

cout<<" =================================="<

cout<<" \n\n\n"<

system("pause");//暂停

调试时发现此时:在Microsoft Visual C++ 6.0中先执行system("pause") 再输出显示,而在调试器Bloodshed Dev-C++中则顺序执行;但当把cout<<" \n\n\n"<

查找了一下相关帮助:

在OSTREAM.H中有这样的一个inline函数:

inline _CRTIMP ostream& __cdecl endl(ostream& _outs) { return _outs << '\n' << flush; }。

也就是说

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

endl除了写'\n'进外,还调用flush函数,刷新缓冲区,把缓冲区里的数据写入文件或屏幕。如果考虑效率就用'\n'

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

在有些地方需要暂停一下以便于用户查看信息等,总结了下大致可用以下几中方法:

方法一:

#include

相关文档
最新文档