解决死锁课程设计报告修改版

  • 格式:doc
  • 大小:1.22 MB
  • 文档页数:40

计算机科学与工程学院课程设计报告题目全称:避免死锁的算法的设计与实现课程名称:计算机操作系统、任课教师:指导老师:职称:(注:学生姓名填写按学生对该课程设计的贡献及工作量由高到底排列,分数按排名依次递减。

序号排位为“1”的学生成绩最高,排位为“10”的学生成绩最低。

)指导老师评语:签字:本小组成员任务分工情况摘要Dijkstra的银行家算法是最有代表性的避免死锁的算法,该算法由于能用于银行系统现金贷款的发放而得名。

银行家算法是在确保当前系统安全的前提下推进的。

对进程请求先进行安全性检查,来决定资源分配与否,从而确保系统的安全,有效的避免了死锁的发生。

该课程设计在理解和分析了银行家算法的核心思想以及状态的本质涵义的前提下,对算法的实现在总体上进行了设计,包括在对算法分模块设计,并对各个模块的算法思想通过流程图表示,分块编写代码,并进行测试,最后进行程序的测试,在设计思路上严格按照软件工程的思想执行,确保了设计和实现的可行,可信。

代码实现采用C语言。

关键词:银行家算法、死锁、避免死锁、安全性序列目录第一章绪论 (1)1.1 选题背景及意义 (1)1.2 国内外研究现状 (1)1.3 主要内容与章节安排 (2)1.4 本章小结 (2)第二章避免死锁的算法的需求分析 (3)2.1 环境需求 (3)2.2 功能需求 (3)2.3 性能需求 (3)2.4 本章小结 (4)第三章避免死锁算法的设计 (5)3.1 总体设计 (5)3.2 功能模块设计 (5)3.3 本章小结 (6)第四章避免死锁的算法的实现 (8)4.1 开发环境介绍 (8)4.2 主要功能模块的实现 (8)4.3 本章小结 (15)第五章测试及成果展示 (16)5.1 测试环境 (16)5.2 测试用例和结果 (16)5.3 成果展示 (24)5.4本章小结 (28)第六章总结与展望 (29)附录 (30)参考文献 (37)第一章绪论1.1 选题背景及意义操作系统的基本特征是并发与共享。

系统允许多个进程并发执行,并且共享系统的软、硬件资源。

为了最大限度的利用计算机系统的资源,操作系统应采用动态分配的策略,但是这样就容易因资源不足,分配不当而引起资源竞争,导致“死锁”。

而本次课程设计就是得用银行家算法来避免“死锁”。

银行家算法就是一个分配资源的过程,使分配的序列不会产生死锁。

此算法的中心思想是:按该算法分配资源时,每次分配后总存在着一个进程,如果让它单独运行下去,必然可以获得它所需要的全部资源,也就是说,它能结束,而它结束后可以归还这类资源以满足其他申请者的需要。

对于操作系统来说,如果产生死锁的时候,操作系统不采取任何特别措施,这种阻塞将会永远存在,最终导致整个系统陷入瘫痪状态。

如果操作系统采用单进程,也就不会存在死锁问题,但是,现在由于现在科技的迅速发展,单线程已经远远不能满足现今人们对速度和性能的要求了,所以多线程势不可挡的迈入了当今操作系统的时代,但是,由于多个进程同时请求资源,很容易导致死锁,由此可见,一种优秀的死锁避免算法对于现今社会是越来越重要了。

而本次课程设计的主题就是实现一种“死锁”避免算法即银行家算法,以适应社会的需求,满足操作系统日益的发展需求。

1.2 国内外研究现状1.死锁的产生的四个条件:(1)互斥条件:指进程对所分配到的资源进行排它性使用。

(2)请求和保持条件:指进程已经保持了至少一个资源,但又提出了新的资源请求(3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。

(4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链。

2.解决死锁的方法:(1)预防死锁:是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个条件,来预防发生死锁。

(2)避免死锁:是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。

(3)检测死锁:通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源;(4)解除死锁:当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。

常用的实施方法是撤消或挂起一些进程现在国内外的解决死锁的方法都符合以上4种方法中的任何一种。

最具代表性的避免死锁的方法就是Dijkstra的银行家算法,该算法可用于银行家发放一笔贷款前,预测该笔贷款是否会引起银行资金周转困难。

这里银行资金就类似于计算机系统里的资源,贷款类似于计算机的资源分配。

银行家算法能预测一笔贷款业务对银行是否安全,也能预测一次资源分配对计算机系统是否安全。

1.3 主要内容与章节安排本文的组织结构为:第一章为绪论,第二章需求分析内容,第三章是避免死锁算法的设计,第四章是算法的具体实现,第五章是软件实现后的测试,包过测试用例和测试结果,第六章节为本次论文的总结,最后是附录为软件源代码和参考文献。

第一章绪论,主要是介绍本次课程设计的背景,国内外现状。

第二章需求分析,主要介绍算法应该实现的功能需求,以及算法应该改满足的性能要求。

第三章是算法的设计,本次避免死锁的算法选择银行家算法,分为3个模块:初始化模块、银行家算法模块、安全性检查模块。

第四章是算法的实现,根据第三章的设计,画出每个模块的流程图,很据设计和流程图编程实现每一个模块的功能。

第五章是测试,主要是进行软件的测试,选择测试用例,看软件是否满足所有的需求分析。

第六章是总结,总结本次设计的结果,意义以及对未来的展望。

1.4 本章小结本章的主要是对于此次实现模拟银行家算法的背景、意义以及设计安排的进行概述,使读者能够大体了解本课程设计主要实现目标与构成要素,对于接下来的章节的论述有着系统导向作用。

第二章避免死锁的算法的需求分析2.1 环境需求硬件:台式或者PC软件:1.window XP或window 7系统。

2. Visual Studio 2010(VS2010)。

2.2 功能需求1.能够提示并且让用户自己输入数据系统的进程数和资源种类数2.用户输入系统初始化的数据后,可以显示系统和各个进程的当前状态。

3.能够提示并且让用户自己输入请求资源的进程号和请求资源数。

4.输入可用资源数、最大需求资源数、分配数后可自行计算完成每个进程的需求矩阵。

5.根据输入的数据,程序能够正确的分析出请求是否能够通过,若通过,则输出安全序列和该进程得到请求后的系统状态,若是该进程得到了所有运行时所需的资源,则提示该进程已得到所有需求资源,执行后将释放其所有拥有资源若不通过,则说明原因,是否申请大于需求量,或者是否申请大于可利用量,或者是没有安全序列。

6.有相应的安全性算法判断某一次请求是否能够成功分配资源。

7.能够让用户选择继续输入请求还是退出,如输入第一次后成功分配后输出了安全序列和系统状态,能够选择是继续分配资源运行还是退出。

2.3 性能需求1.不同的用户都可以根据输入提示完成避免死锁的过程。

2.同一个输入数据在多次数输入时只能输出一种结果。

3.能够一直到不同型号的电脑上,并且可以正确的执行,不能出现异常和错误。

4.能够在很多的时间内完成计算结果并且输出结果。

2.4 本章小结本章的主要是对于此次设计并且实现银行家算法的需求进行分析,包括环境需求、功能需求和性能需求进行详细的分析,确定了此次设计并且实现银行家算法的运行测试环境,以及设计并且实现银行家算法的功能要求和性能要求,为后面的设计并且实现银行家算法确定了明确的目标。

第三章避免死锁算法的设计3.1 总体设计先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。

若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。

若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。

3.2 功能模块设计共三个模块:初始化系统模块、银行家算法模块、安全性检查模块3.2.1初始化系统模块该模块主要完成系统的初始化,设置系统的进程数,资源种类数,以及可利用资源向量Available,最大需求短阵Max ,分配短阵Allocation1)可利用资源向量Available它是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源数目。

其数值随该类资源的分配和回收而动态地改变。

如果Available[j]=K,则表示系统中现有Rj类资源K个。

2)最大需求矩阵Max这是—个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。

如果Max(i,j)=K,表示进程i需要Rj类资源的最大数目为K。

3)分配矩阵Allocation这是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每个进程的资源数。

如果Allocation(i,j)=K,表示进程i当前已分得Rj类资源的数目为K。

4)需求矩阵Need它是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数,如果Need[i,j]=K,则表示进程i还需要Rj类资源k个,方能完成其任务。

上述三个矩阵间存在下述关系:Need[i,j]=Max[i,j]-Allocation[i,j]3.2.2银行家算法模块该模块主要完成当进程对系统请求资源时,系统进行资源的试分配设Requesti是进程Pi的请求向量。

如果Requesti[j]=k,表示进程只需要k个Rj类型的资源。

当Pi发出资源请求后,系统按下述步骤进行检查:1)如果 Requesti[j]<=Need[i,j],则转向步骤2;否则,认为出错,因为它所需要的资源数已超过它所声明的最大值。

2)如果Requesti[j]<=Available[j] ,则转向步骤3;否则,表示系统中尚无足够的资源,Pi必须阻塞等待。

3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:Available[j]=Available[j]-Requesti[j];Allocation[i,j]=Allocation[i,j]+Requesti[j];Need[i,j]=Need[i,j]-Requesti[j];4)系统调用安全性算法模块,检查此次资源分配后,系统是否处于安全状态。

若安全,才正式将资源分配给进程Pi,完成本次分配;否则,将试探分配失效,恢复原来的资源分配状态,让进程Pi阻塞等待。

3.2.3安全性检查模块该模块主要完成当系统试分配完后,进行安全性检查,如果可以找到一个安全序列,则表示资源试分配可以有效,若没有,则表示资源试分配无效。

1)设置两个向量①、设置一个数组Finish[n]。

它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]:=false ;当有足够资源分配给进程时,令Finish[i]:=true,表示进程Pi可以获得其所需的全部资源,顺利执行完成,完成后释放其全部资源。