您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 操作系统课设(模拟实现银行家算法实现死锁避免)
计算机与信息工程系《计算机系统与系统软件》课程设计报告题目:模拟实现银行家算法实现死锁避免专业:信息管理与信息系统班级:信管082班学号:姓名:指导老师:2010年9月9日一、实验题目模拟实现银行家算法实现死锁避免二、目的:1、了解进程产生死锁的原因,了解为什么要进行死锁的避免。2、掌握银行家算法的数据结构,了解算法的执行过程,加深对银行家算法的理解。三、内容:模拟实现银行家算法实现死锁避免。要求:初始数据(如系统在T0时刻的资源分配情况、每一种资源的总数量)从文本文件读入,文件中给出最大需求矩阵Max、分配矩阵Allocation,在程序中求得需求矩阵Need和可利用资源向量Available。四、实验提示:1、整个银行家算法的思路。先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查。2、算法用到的主要数据结构和C语言说明。(1)、可利用资源向量INTAVAILABLE[M]M为资源的类型。(2)、最大需求矩阵INTMAX[N][M]N为进程的数量。(3)、已分配矩阵INTALLOCATION[N][M](4)、还需求矩阵INTNEED[N][N](5)、申请各类资源数量intRequest[x];//(6)、工作向量intWork[x];(7)、intFinish[y];//表示系统是否有足够的资源分配给进程,0为否,非0为是3、银行家算法(主程序)(1)、系统初始化。输入进程数量,资源种类,各进程已分配、还需求各资源数量,各资源可用数量等(2)、输入用户的请求三元组(I,J,K),为进程I申请K个J类资源。(3)、检查用户的请求是否小于还需求的数量,条件是K=NEED[I,J]。如果条件不符则提示重新输入,即不允许索取大于需求量(4)、检查用户的请求是否小于系统中的可利用资源数量,条件是K=AVALIABLE[I,J]。如果条件不符则申请失败,阻塞该进程,重新进行进程动态资源申请(使用goto语句)(5)、进行资源的预分配,语句如下:AVALIBLE[I][J]=AVALIBLE[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]记录模拟执行中资源的回收情况,初值为AVAILABLE[M]的值。(2)、在进程中查找符合以下条件的进程。条件1:FINISH[I]=0条件2:NEED[I][J]〈=WORK[J](3)、如果查找成功则进行资源的模拟回收,语句如下:WORK[J]=WORK[J]+ALLOCATION[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;jm;j++)if(Work[j]=Need[i][j])counter=counter+1;//记数if(counter==m){…*///算法二:for(j=0;jm;j++)if(Work[j]=Need[i][j]);//可用大于等于需求else{counter=1;break;}if(counter!=1){…显然算法二要优于算法一。本程序中还有很多类似的地方。这里主要考虑的是一个程序的优化设计问题。(2)、关于某些系统函数调用时的执行顺序:在调用一些系统函数如getch()、system(pause)等时发现其执行顺序的一些问题。如类似:cout==================================endl;cout\n\n\nendl;system(pause);//暂停调试时发现此时:在MicrosoftVisualC++6.0中先执行system(pause)再输出显示,而在调试器BloodshedDev-C++中则顺序执行;但当把cout\n\n\nendl;改为coutendlendlendl;其他不变时,则在两中调试器中均为顺序执行,即先显示后暂停。查找了一下相关帮助:在OSTREAM.H中有这样的一个inline函数:inline_CRTIMPostream&__cdeclendl(ostream&_outs){return_outs'\n'flush;}。也就是说endl=return_outs'\n'flush;endl除了写'\n'进外,还调用flush函数,刷新缓冲区,把缓冲区里的数据写入文件或屏幕。如果考虑效率就用'\n'(3)、关于设置暂停的方法:在有些地方需要暂停一下以便于用户查看信息等,总结了下大致可用以下几中方法:方法一:#includestdlib.hsystem(pause);//暂停一下并显示“输入任意键继续…”方法二:#includestdio.hgetchar();//须按回车键结束,不是任意键方法三:#includeconio.hgetch();//等待键盘输入,不返回任何值,无任何显示方法四:使用char*tt=newchar;cintt;方式,要求键盘输入一个与程序无关的变量七、心得体会“银行家算法的模拟实现”是本学期操作系统课程唯一的课程设计。在设计此程序的过程中,我遇到过许多问题,也学到了很多东西。本程序的设计实现主要是用C++语言实现,通过对程序算法的设计优化、输出显示的格式设计、输入过程中的异常处理等一些设计过程中的问题的考虑解决,在C++学习上也有了很大的进步。程序设计过程中开始遇到的最大的问题是算法的结构设计问题,课本上只给了设计要求及简单的算法,要真正实现还需要考虑很多方面。在算法的数据结构设计上考虑了很长时间。在程序设计中先后参考了很多网络资料,也参考了一些别人写的的程序,综合这些算法思想和自己的思路对程序做了很好的设计方式,对一些算法的优越性等也作了一些考虑。此外考虑最多的就是异常错误处理的设计。一个好的程序必须能在各种环境下都有其相应的处理方式,至少能应对一些常见的可能发生的错误。比如一般的要求输入为数字时,如果输入了一个非数字字符,程序就会立即出错无法继续运行,本程序针对这个问题设计了一个shuzi();函数进行处理,处理方式为:接受键盘输入的字符为字符串,然后对字符串的每个字符进行判断是否为数字,如果有非数字字符出现则提示出错并要求重新输入。又如在判断是否继续时要求输入Y/N时,按一般的方式,如果输入为多个字符,则多余的字符会保存在缓冲区,到下次要求输入时输入而导致出错,对此问题设计处理方式为接受输入字符保存为串然后只取其首字符进行判断。还有很多类似的错误处理。还有在设置程序的显示优化时,发现暂停函数在不同的情况下执行顺序不同,如此等等。在课程设计过程中遇到了许多问题,也向同宿舍的同学做了一些请教一起讨论,也因此从他们身上学到了许多东西。
本文标题:操作系统课设(模拟实现银行家算法实现死锁避免)
链接地址:https://www.777doc.com/doc-4976628 .html