《操作系统原理》课程设计--银行家算法程序设计

合集下载

操作系统课程设计--银行家算法

操作系统课程设计--银行家算法

目录第一章功能需求描述 (2)1.1功能列表与说明 (2)1.2操作界面和操作方法 (2)第二章设计描述 (3)2.1任务分解说明 (3)2.2主要数据结构设计说明 (3)2.3主要函数接口设计说明 (3)第三章算法描述 (5)第四章开发过程描述 (14)4.1程序代码 (14)4.2设计中的问题和解决方法 (23)4.3测试用例和测试方法 (24)第五章设计心得体会 (32)计算机科学与技术学院课程设计任务书第一章功能需求描述1.1功能列表与说明(1)添加进程:规定现在操作系统中运行的进程数。

(2)添加资源:规定当前需要资源的种类数和各种类资源的数目。

(3)分配资源:给各进程分配资源。

(4)安全性检查:检查资源分配后是否会发生死锁,若发生则不这样进行分配。

(5)资源释放:当一个进程结束后释放其所占有的各类资源。

(6)得到安全序列:当资源分配能够保证各进程顺利结束,则得到进程的安全序列。

(7)删除资源:即取消某资源1.2操作界面和操作方法*************银行家算法演示****************请首先输入系统可供资源种类的数量:资源*的名称:资源的数量:请输入作业的数量:请输入各进程的最大需求量:请输入各进程已经申请的资源量:系统目前可用资源:系统是否安全?分配的序列:********银行家算法演示***********1:增加资源2:删除资源3:修改资源4:分配资源5:增加作业0:离开在如上的操作界面中分别按照提示进行输入,按回车键表示当前输入完毕,然后进行下个步骤的输入或者得到最终结果。

第二章设计描述2.1任务分解说明银行家算法的实现过程主要分为以下几个部分:为实现银行家算法,系统中必须设置若干数据结构。

其中有allocation,记录已经分配的系统资源;max,记录每个进程的资源最大需求;available,记录剩余资源;need用来记录现在每个进程需要多少资源,need=max-allocation;request 请求资源;temp,记录路径,即输出的顺序;finish,用来实现循环,以判断是否安全,这也就是安全性检查。

操作系统课程设计报告银行家算法的设计与实现(java语言)

操作系统课程设计报告银行家算法的设计与实现(java语言)

操作系统课程设计报告-银行家算法的设计与实现(JAVA语言)操作系统课程设计题目院系专业班级学生学号指导教师年月基于计算机此次课程设计的主要内容是模拟实现资源分配同时要求编写和调试一个系统动态分配资源的简单模拟程序观察死锁产生的条件并使用适当的算法有效的防止和避免死锁的发生具体用银行家算法实现资源分配要求如下1 设计一个3个并发进程共享3类不同资源的系统进程可动态地申请资源和释放资源系统按各进程的申请动态地分配资源2 设计用银行家算法和随机分配算法实现资源分配的两个资源分配程序应具有显示或打印各进程依次要求申请的资源数以及依次分配资源的情况3 确定一组各进程依次申请资源数的序列在相同的情况下分别运行上述两种资源分配程序观察运行结果银行家算法是避免死锁的一种重要方法本实验要求用高级语言编写和调试一个简单的银行家算法程序加深了解有关资源申请避免死锁等概念并体会和了解死锁和避免死锁的具体实施方法死锁的产生必须同时满足四个条件即一个资源每次只能由一个进程占用第二个为等待条件即一个进程请求资源不能满足时它必须等待但它仍继续保持已得到的所有其他资源第四个为循环等待条件系统中存在若干个循环等待的进程即其中每一个进程分别等待它前一个进程所持有的资源防止死锁的机构只能确保上述四个条件之一不出现则系统就不会发生死锁通过这个算法可用解决生活中的实际问题如银行贷款等通过对这个算法的设计让学生能够对书本知识有更深的理解在操作和其它方面有更高的提升关键词死锁安全状态安全序列银行家算法安全性检查目录1 概述 311设计目的 312开发环境 32 需求分析 421死锁概念 422死锁的结论 423资源分类 424产生死锁的必要条件 425死锁的解决方案 4com锁的例子 4com防 5com态与不安全状态 53 数据结构分析设计 631可利用资源向量矩阵available[ ] 6 32最大需求矩阵[ ][ ] 633分配矩阵allocation[ ][ ] 634需求矩阵need[ ][ ] 64 算法的实现 741初始化 742银行家算法 743安全性检查算法 744各算法流程图 85 测试与实例分析 106 心得体会 147参考文献与源程序清单附录 15概述11设计目的银行家算法是一种最有代表性的避免死锁的算法把操作系统看作是银行家操作系统管理的资源相当于银行家管理的资金进程向操作系统请求分配资源相当于用户向银行家贷款操作系统按照银行家制定的规则为进程分配资源当进程首次申请资源时要测试该进程对资源的最大需求量如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源否则就推迟分配当进程在执行中继续申请资源时先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量若超过则拒绝分配资源若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量若能满足则按当前的申请量分配资源否则也要推迟分配本次课程设计通过用JAVA语言编写和调试实现银行家算法的程序达到进一步掌握银行家算法理解系统产生死锁的原因以及系统避免死锁的方法增强理论联系实际的能力的目的12开发环境操作系统Windows XP编译工具Myeclipse86生成文件×××java源代码文件和×××class编译文件2 需求分析21死锁概念死锁就是指多个进程在运行中因争夺资源而造成的一种僵局当进程出于这种僵持状态时若无外力作用它们都将无法再向前推进22死锁的结论产生死锁的原因是竞争资源和进程间推进顺序不当处理死锁的基本方法是①预防死锁②避免思索③检测死锁④解除死锁23资源分类1可剥夺性资源某些进程在获得此类资源后该资源可以再被其他进程或系统剥夺CPU和内存均属于可剥夺性资源2不可剥夺性资源当系统把这类资源分配给进程后再不能强行回收只能在进程用完后自动释放如磁带机打印机3非剥夺性资源在系统中所配置的非剥夺性资源由于它们的数量不能满足诸进程运行的需要会使进程在运行构成中因争夺这些资源而陷入僵局4临时性资源它是指由一个进程产生被另一个进程使用一短暂时间后便无用的资源也称之为消耗性资源24产生死锁的必要条件1互斥条件进程对它所分配到的资源进行排他性使用即在一段时间内某资源由一个进程占有如果此时还有其它进程请求该资源则请求者只能等待直至占有该资源的进程用毕释放2请求和保持条件进程已经保持了至少一个资源但又提出新的资源请求而该资源又被其他进程占有此时请求进程阻塞但又对自己获得的其他资源保持不放3不剥夺条件进程已经获得的资源在未使用完之前不能被剥夺只有在使用完是由自己释放4环路等待条件发生死锁时必然存在一个进程--资源的环形链25死锁的解决方案com锁的例子该例子是由于进程推进顺序非法引发的死锁进程P1 和P2并发执行如果按顺序①执行P1RequestR1P1RequestR2P1ReleaseR1P1ReleaseR2P2RequestR2P2RequestR1P2R eleaseR2P2ReleaseR1两个进程可顺利完成如果按曲线②执行P1 和P2将进入不安全区DP1保持了资源R1P2保持了R2接下来P2将申请不到R1P1申请不到R2系统处于不安全状态往前推进将发生死锁图3-15com防预防死锁的方法是使产生死锁的四个必要条件中的234条件之一不能成立即1摒弃请求和保持条件系统规定所有进程在开始运行之前都必须一次性申请其在整个运行过程中所需的全部资源使该进程再整个运行过程中不会提出资源请求因而摒弃了请求条件又由于进程在等待期间没有占有任何资源所以也摒弃了保持条件2摒弃不剥夺条件系统规定进程逐个提出对资源的要求当一个已经保持了某些资源的进程再提出新的资源请求而未被满足时必须释放已经保持的所有资源待以后需要是在再重新申请3摒弃环路等待条件系统规定所有资源按类型进行线性排队并赋予不同的序号所有进程对资源的请求都必须严格按资源序号递增的顺序提出com态与不安全状态在避免死锁的方法中允许进程动态地申请资源但系统在进行资源分配之前应先计算此次资源分配的安全性若此次分配不会导致系统进入不安全状态则将资源分配给进程否则令进程等待所谓安全状态是指系统能按某种进程顺序P1 P2 P3Pn来为每个进程分配所需资源直至满足每个进程对资源的最大需求是每个进曾都可以顺利完成如果系统找不到这样一个序列系统就处于不安全状态虽然并非所有的不安全状态都是死锁状态但当系统进入不安全状态后便可能进入死锁状态只要系统处于安全状态系统便可以避免进入不安全状态因此避免死锁的实质在于系统在进行资源分配时如何使系统不进入不安全状态安全序列一个进程序列 P1Pn 是安全的如果对于每一个进程Pi 1≤i≤n它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj j i 当前占有资源量之和银行家算发就是用具避免死锁的一个有效方法3 数据结构分析设计31可利用资源向量矩阵available[ ]这是一个含有m个元素的数组其中的每一个元素代表一类可利用的资源数目其初始值是系统中所配置的该类全部可用资源的数目其数值随该类资源的分配和回收而动态地改变如果available [j] K则表示系统中现有R类资源K个32最大需求矩阵[ ][ ]这是一个nm的矩阵用以表示每一个进程对m类资源的最大需求如果[ij] K 则表示进程i需要R类资源的数目为K33分配矩阵allocation[ ][ ]这也是一个nm的矩阵它定义了系统中每一类资源当前已分配给每一进程的资源数如果allocation [ij] K则表示进程i当前已分得R类资源的数目为K 34需求矩阵need[ ][ ]这也是一个nm的矩阵用以表示每一个进程尚需的各类资源数如果need [ij] K则表示进程i还需要R类资源K个才能完成其任务上述矩阵存在下述关系need[ij] [ij]- allocation[ij]4 算法的实现41初始化1创建available[]数组用以存放系统中可用的资源数目2创建[][]数组用以存放各个进程对各类资源的最大需求数目3创建allocation[][]数组用以存放各个进程已经分得的各类资源数目 4创建need[][]数组用以存放各个进程还需要的各类资源数目5创建 allocation1[][]need1[][]available1[]用以存放系统试分配资源前系统资源分配情况42银行家算法设Requesti是进程Pi的请求向量Requesti K表示进程Pi需要K个j类资源Pi发出资源请求后按下列步骤进行检查1如果requesti[j]≤need[ij]转向步骤②否则报错所需要的资源数已超过它所宣布的最大值2如果requesti[j]≤available[j]转向步骤③否则报错尚无足够资源Pi需等待3尝试将资源分配给进程Pi并修改下面数据结构中的数值available[j] available[j]-raquesti[j]allocation[ij] allocation[ij]raquesti[j]need[ij] need[ij]-raquesti[j]4 执行安全性算法检查此次资源分配后系统是否出于安全状态若安全才正式将资源分配给进程Pi已完成本次分配否则将本次试探分配作废恢复原来的资源分配状态让Pi等待43安全性检查算法1设置两个向量一工作向量work表示系统可提供给进程继续运行所需的各类资源数目执行安全性算法开始时work available二finish标志表示系统是否有足够的资源分配给进程使之运行完成初始化finish[i] false有足够资源分配给进程时令finish[i] true2从进程集合中找到一个能满足下述条件的进程finish[i] falseNeed[ij]≤work[j]找到执行步骤③否则执行步骤④3当进程Pi获得资源后可顺利执行直至完成并释放出分配给它的资源故应执行Work[j] work[i]allocation[ij]Finish[i] trueGo to step ②4如果所有进程的finish[i] true都满足则表示系统处于安全状态否则系统处于不安全状态44各算法流程图1初始化算法流程2银行家算法流程图5 测试与实例分析1下列状态是否安全四个进程共享12个同类资源资源进程A B C AllocationA B C NeedA B C Available A B C P03 2 21 0 02 2 22 1 2P16 1 34 1 12 0 2P23 1 42 1 11 0 3P34 2 20 0 24 2 0利用银行家算法程序进行检测打开程序输入上述数据初始化数据后显示进行安全检测经检查系统为安全状态存在安全序列p1 p2 p3 p02考虑下列系统状态系统是否安全若安全就给出所有的安全序列如果此时p0和p1均提出资源请求Request 101 能否立即给予满足解继续执行银行家算法程序1P0申请资源101申请不成功系统不为其分配资源继续执行银行家算法程序2P1申请资源101申请成功存在安全序列p1 p2 p3 p0所以对p2来说能得到立即满足如果此刻P2继续请求资源Reques101则就有系统将资源试分给P1则可用资源数变为111然后继续试分配给p0 Request 101 它小于Avalable可以分配但分配后很明显找不到一个安全序列发现系统处于不安全状态不能分配给它于是回收资源系统的可用资源恢复到1116 心得体会通过一个周的课程设计虽然理解起来很容易但想用算法具体去实现它还是有一定的难度虽然做起来比较吃力但当我通过自己亲手做出来时使我更加加深了对银行家算法的理解掌握了银行家算法避免死锁的过程和方法理解了死锁产生的原因和条件以及避免死锁的方法并且还巩固了JAVA知识掌握了用JAVA实现银行家算法的方法所编写程序基本实现了银行家算法的功能并在其基础上考虑了输出显示格式的美观性使界面尽可能友好并且在编程时将主要的操作都封装在方法中如输入进程和资源信息放在了一个构造方法public TheBanker 中进行安全性检测的方法Security_check 进行申请资源的方法checkRequest 打印当前各资源的方法print 这样使程序可读性增强使程序更加清晰明了当然由于JAVA学的也就是些基础平时的不常联系使得我实际操作能力的很欠缺我在编写和调试过程中遇到了许多的问题通过网上查询资料翻阅课本向同学请教多次调试等方法逐渐解决了大部分问题这次课程设计非常有意义它让我收获很多不仅掌握了课本所学的知识也巩固了JAVA的相关知识7 参考文献与源程序清单汤子瀛哲凤屏汤小丹计算机操作系统西安电子科技大学出版社20062 美威尔顿麦可匹克 Java入门经典第3版施宏斌译北京清华大学出版社2009 美 Bruce Eckel Java编程思想陈昊鹏译北京机械工业出版社2007 import comnerpublic class TestBankerpublic static void main String[] argsSycomtln "-----操作系统银行家算法-------"TheBanker tb new TheBankerboolean flag truewhile flagSycomtln "1死锁避免检验是否安全"Sycomtln "2死锁检测"Sycomtln "3退出"Sycomtln "Sycomtln "请选择"Scanner input new Scanner Systemin int num inputnextIntswitch numcase 1tbSecurity_checkflag truebreakcase 2tbcheckRequest 死锁检测flag truebreakcase 3Sycomtln "谢谢使用再见"flag falsebreakimport comnerpublic class TheBankerint m 进程个数int n 每个进程的资源个数int[][] 最大需求矩阵int[][] allocation 以分配的资源已占有的资源int[][] need 需求的资源int[] available 可利用的资源int[] p 记录安全序列boolean[] finish 标志一个进程是否完成true 表示完成 false 表示未完成Scanner input new Scanner Systeminpublic TheBankerSycomtln "请输入系统中的进程数"m inputnextIntSycomtln "请输入进程的资源类型数"n inputnextIntnew int[m][n]allocation new int[m][n]need new int[m][n]available new int[n]finish new boolean[m]Sycomtln "请输入一个"m"行"n"列的各进程的最大需求量"for int i 0i lengthi 依次输入进程的各个最大资源数Sycomtln "请输入第p " i1 " 进程的"for int j 0j [i]lengthj[i][j] inputnextIntSycomtln "请输入一个"m"行"n"列的各进程的各占有量"for int i 0i allocationlengthi 依次输入进程的各个占有资源数Sycomtln "请输入第p " i1 " 进程中的Alloction"for int j 0j allocation[i]lengthjallocation[i][j] inputnextIntfor int i 0i needlengthi 计算出各个进程需求的资源数 for int j 0j need[i]lengthjneed[i][j] [i][j] - allocation[i][j]Sycomtln "请输入可用资源数Avallable" 输入进程的可用资源数for int i 0i niavailable[i] inputnextIntSycomtln "初始化结果为下表"print显示列表public void printSycomtln "Sycomtln "\t\tAllocation\tNeed\tAvalable"Sycomtln "\tA B C\tA B C\t\tA B C\tA B C"for int i 0i miSycomt "P "i" "Sycomt " "for int j 0j njSycomt [i][j]" "Sycomt "\t"for int j 0j njSycomt allocation[i][j]" "Sycomt "\t\t"for int j 0j njSycomt need[i][j]" "Sycomt "\t"if i 0for int j 0j njSycomt available[j]" "SycomtlnSycomtln "public boolean Security_checkint[] work new int[n]for int i 0i niwork[i] available[i] 把available的值赋给workfinish new boolean[m]for int i 0 i m i 开始把进程全部置未分配状态都为falsefinish[i] falseint num 0 对每个进程都要把所有资源都进行比较int num1 0int count 0 记录可以分配的序列int count1 0 记录所有序列是否分配p new int[m] 找到安全序列while num1 mfor int i 0i miif finish[i] false 判断finish的状态如果为true说明刚才已经找到不需要重复for int j 0j njif need[i][j] work[j] 比较一个进程的各种资源是否满足条件numif num n 如果一个进程所有资源都满足条件need work则找到了一个进程满足for int k 0k nkwork[k] work[k] allocation[i][k]finish[i] true 找到一个进程满足p[count] i 记录找到的是第几个进程num 0 必须把它清零重新来找下个资源种类的每种是否都满足条件num1记录有多少个序列for int i 0i miif finish[i] truecount1 检测是否所有的进程最后都是trueif count1 m 如果序列里面总数等于总共有多少程序就找到了安全的序列并且输出反之没有找到Sycomtln "存在一个安全序列安全序列为"for int i 0i miif i m-1Sycomt "P"p[i]"-- "elseSycomtln "P"p[i]Sycomtln "return trueelseSycomtln "没有找到一个安全序列系统处于不安全状态"return falsepublic void checkRequestint process 0 记录输入的是第几个进程int count2 0 记录试分配过程中满足条件的个数boolean flag true 主要防止输入的数字已经超出了本来process数量则要求重新输入Sycomtln "请输入要申请的第几个进程注意进程p下标是从0开始的"while flagprocess inputnextIntif process mflag trueSycomtln "输入超出了本来进程的范围请重新输入"elseflag falseSycomtln "第"process"个进程提出请求"int[] request new int[n]Sycomtln "输入要请求的资源Request"for int i 0i nirequest[i] inputnextInt判断是否可以分配for int i 0i niif request[i] need[process-1][i] request[i] available[i]count2 判断是否每个进程的所有资源都满足试分配的要求并记录if count2 n 如果每一种资源都满足要求则可以进程请求试分配for int j 0j njallocation[process-1][j] request[j] 注意数组下标是从0开始的need[process-1][j] - request[j]available[j] - request[j]Sycomtln "试分配如下-------- "print 打印试分配的结果Sycomtln "进行安全性判断"flag Security_check 判断是否为安全序列if flag false 如果是分配后不能找到一个安全序列则返回不进行分配for int j 0j njallocation[process-1][j] - request[j] 注意数组下标是从0开始的need[process-1][j] request[j]available[j] request[j]elseSycomtln "不能进行试分配也就找不到安全序列"西安工业大学课程设计1。

操作系统课程设计银行家算法参考

操作系统课程设计银行家算法参考

3 课程设计三银行家算法(参考1)1设计目的(1)了解多道程序系统中,多个进程并发执行的资源分配。

(2)掌握死锁产生的原因、产生死锁的必要条件和处理死锁的基本方法。

(3)掌握预防死锁的方法,系统安全状态的基本概念。

(4)掌握银行家算法,了解资源在进程并发执行中的资源分配策略。

(5)理解避免死锁在当前计算机系统不常使用的原因。

2.算法描述Dijkstra(1965年)提出了一种能够避免死锁的调度方法,称为银行家算法,它的模型基于一个小城镇的银行家,现将该算法描述如下:假定一个银行家拥有资金,数量为Σ,被N个客户共享。

银行家对客户提出下列约束条件:(1)每个客户必须预先说明自已所要求的最大资金量;(2)每个客户每次提出部分资金量申请各获得分配;(3)如果银行满足了客户对资金的最大需求量,那么,客户在资金动作后,应在有限时间内全部归还银行。

只要每个客户遵守上述约束,银行家将保证做到:若一个客户所要求的最大资金量不超过Σ,则银行一定接纳该客户,并可处理他的资金需求;银行在收到一个客户的资金申请时,可能因资金不足而让客户等待,但保证在有限时间内让客户获得资金。

在银行家算法中,客户可看做进程,资金可看做资源,银行家可看做操作系统。

3. 环境操作系统Windows XP SP2,开发工具VC++6.0或者BCB6.0。

4 功能模块说明1.银行家所能够提供的资源typedef struct node{int a;int b;int c;int remain_a;int remain_b;int remain_c;}bank;2.进程所占用的资源typedef struct node1{char name[20];int a;int b;int c;int need_a;int need_b;int need_c;}process;main()函数:完成对系统运行环境的初始化,定义了简单的选择菜单,调用各功能函数。

操作系统课程设计(银行家算法设计)

操作系统课程设计(银行家算法设计)

《操作系统》课程设计报告系别:信息科学与技术系专业班级:学生姓名:指导教师:(课程设计时间:2010年7月5日——2010年7月9日)目录一、课程设计目的和意义 (3)二、课程设计题目描述及算法 (3)三、课程设计报告内容 (3)1.算法描述 (3)2.数据结构 (4)3.主要函数说明 (4)4.算法流程图 (5)5.运行结果及说明 (7)6.附录清单及分析 (8)四、总结 (14)一、课程设计目的和意义了解掌握银行家算法,学会模拟实现资源分配,同时有要求编写和调试一个系统分配资源的简单模拟程序,观察死锁产生的条件,并使用适当的算法,有效的防止和避免死锁的发生二、课程设计题目描述及算法题目:银行家算法设计设计要求:编制银行家算法通用程序,并检测所给状态的系统安全性。

设进程I提出请求Request[N],则银行家算法按如下规则进行判断。

(1)如果Request[N]<=NEED[I,N],则转(2);否则,出错。

(2)如果Request[N]<=AVAILABLE,则转(3);否则,出错。

(3)系统试探分配资源,修改相关数据:AVAILABLE=AVAILABLE-REQUESTALLOCATION=ALLOCATION+REQUESTNEED=NEED-REQUEST(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

上述三个矩阵存在如下关系:Need[i,j]= Max[i,j]- Allocation[i,j]三、课程设计报告内容1.算法描述设Request[i] 是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K 个Rj类型的资源,当Pi发出资源请求后,系统按下面步骤进行检查:(1)如果Requesti[j]<=Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。

(2)如果Requesti[j]<=Available[j],便转向步骤3;否则,表示尚无足够资源,Pi须等待。

操作系统课程设计银行家算法模拟实现

操作系统课程设计银行家算法模拟实现

操作系统课程设计银行家算法模拟实现操作系统课程设计报告专业计算机科学与技术学生姓名班级学号指导老师完成日期信息工程学院题目:银行家算法的模拟实现一、设计目的本课程设计是学习完“操作系统原理”课程后进展的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统根底理论和重要算法的理解,加强学生的动手才能。

二、设计内容 1〕概述用C或C++语言编制银行家算法通用程序,并检测所给状态的系统平安性。

1.算法介绍:数据构造:1〕可利用资向量 Available;2〕最大需求矩阵Max;3〕分配矩阵Allocation;4〕需求矩阵Need 2.功能介绍模拟实现Dijkstra的银行家算法以防止死锁的出现,分两局部组成:第一局部:银行家算法〔扫描〕;第二局部:平安性算法。

2〕设计原理一.银行家算法的根本概念 1、死锁概念。

在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资利用率,进步系统的吞吐量,但可能发生一种危险━━死锁。

所谓死锁(Deadlock),是指多个进程在运行中因争夺资而造成的一种僵局(Deadly_Embrace),当进程处于这种僵持状态时,假设无外力作用,它们都将无法再向前推进。

一组进程中,每个进程都无限等待被该组进程中另一进程所占有的资,因此永远无法得到的资,这种现象称为进程死锁,这一组进程就称为死锁进程。

2、关于死锁的一些结论:Ø参与死锁的进程最少是两个Ø〔两个以上进程才会出现死锁〕Ø参与死锁的进程至少有两个已经占有资Ø参与死锁的所有进程都在等待资Ø参与死锁的进程是当前系统中所有进程的子集注:假如死锁发生,会浪费大量系统资,甚至导致系统崩溃。

3、资分类。

永久性资:可以被多个进程屡次使用〔可再用资〕l 可抢占资 l 不可抢占资临时性资:只可使用一次的资;如信号量,中断信号,同步信号等〔可消耗性资〕“申请--分配--使用--释放”形式 4、产生死锁的四个必要条件:互斥使用〔资独占〕、不可侵占〔不可剥夺〕、恳求和保持〔局部分配,占有申请〕、循环等待。

操作系统课程设计(银行家算法)

操作系统课程设计(银行家算法)

操作系统课程设计说明书题目: 银行家算法模拟院系:计算机科学与工程学院专业班级:计算机10-5班学号: 2010303157学生姓名:张绪磊指导教师:刘惠临2013年 1月 9日安徽理工大学课程设计(论文)任务书计算机科学与工程学院计算机科学与技术系2013年 1月 9日安徽理工大学课程设计(论文)成绩评定表摘要银行家算法是一个用来预防系统进入死锁状态的算法,用它可以判断系统的安全性,如果系统当前处于安全状态,则可以为申请资源的进程分配资源;如果不是安全状态,则不能为申请资源的进程分配资源。

银行家算法执行过程中,首先判断申请资源的进程所申请的资源数目是否合法,若是合法的,则可以为其进行试分配,再利用安全性算法求出安全序列,如果存在安全序列,则说明可以给申请资源的进程分配资源,分配成功,继续为其它进程服务。

如果找不到安全序列,则说明为该进程分配资源后系统会进入不安全状态,所以不能为该进程分配资源,使该进程进入阻塞状态。

若申请资源的进程申请的资源数目不合法,则不需要进行试分配,直接使其进入阻塞状态,处理其他申请资源的进程。

关键词:可用资源,最大需求矩阵,分配矩阵,需求矩阵,安全性算法,安全序列目录1.绪论 (1)1.1系统分工 (1)1.2课题背景 (1)1.3死锁 (1)1.4安全性 (2)1.5算法设计思想 (2)2.需求分析 (3)2.1基本要求 (3)2.2模块划分 (3)3.总体设计 (4)3.1算法设计 (4)3.2模块设计 (5)4.详细设计 (6)4.1程序流程图 (6)4.2主要函数的核心代码 (6)5.程序测试 (12)5.1界面设计 (12)5.2数据测试 (13)5.3操作提示 (14)6.总结 (16)参考文献 (17)1.绪论1.1系统分工1.2课题背景在多道程序系统中,虽可以借助多个进程的并发执行来改善系统的资源利用率,提高系统吞吐量,但可能发生一种危险——死锁,即多个进程在运行过程中因争夺资源而造成的一种僵局,若无外力作用,将无法再向前推进。

操作系统课程设计银行家算法

操作系统课程设计银行家算法

《操作系统--课程设计报告》银行家算法姓名:学号:专业:指导老师:目录一、设计目的 (1)二、设计要求 (1)三、设计内容和步骤 (1)四、算法描述 (6)五、实验结果 (12)六、实验心得 (12)一、设计目的银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。

加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

二、设计要求在了解和掌握银行家算法的基础上,能熟练的处理课本例题中所给状态的安全性问题,能编制银行家算法通用程序,将调试结果显示在计算机屏幕上。

具体程序的功能要求:1.设定进程对各类资源最大申请表示及初值确定。

2.设定系统提供资源初始状况(已分配资源、可用资源)。

3.设定每次某个进程对各类资源的申请表示。

4.编制程序,依据银行家算法,决定其申请是否得到满足。

三、设计内容和步骤设计内容银行家算法的思路:先对用户提出的请求进行合法性检查,即检查请求的是不大于需要的,是否不大于可利用的。

若请求合法,则进行试分配。

最后对试分配后的状态调用安全性检查算法进行安全性检查。

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

设计步骤1、为实现银行家算法,系统中需要设置若干数据结构,用来表示系统中各进程的资源分配及需求情况。

假定系统中有M个进程,N类资源。

进程数和资源数由程序中直接定义#define M 5 //总进程数#define N 3 //总资源数银行家算法中使用的数据结构如下:(1)可利用资源Available。

这是一个含有m个元素的数组,其中的每一个元素代表一类资源的空闲资源数目,其初值是系统中所配置的该类资源的数目,其数值随该类资源的分配和回收而动态的改变。

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

(2)最大需求矩阵Max。

这是一个n*m的矩阵,它定义了系统中每一个进程对各类资源的最大需求数目。

如果Max[i,j]=k,表示进程Pi对Rj类资源的最大需求数为k个。

银行家算法 操作系统课程设计

银行家算法  操作系统课程设计

//判断申请是否大于当前资源,若大于则 { cout<<"进程"<<i<<"申请的资源大于系统现在可利
用的资源"; cout<<" 分配出错,不予分配!"<<endl; ch='n'; break;
} } } if(ch=='y') { changdata(i); //根据进程需求量变换资源 showdata(); //根据进程需求量显示变换后的资源 safe(); //根据进程需求量进行银行家算法判断 } }
cout<<name[j]<<":"; cin>>Request[j]; //输入需要申请的资源 } for (j=0;j<N;j++) { if(Request[j]>Need[i][j]) //判断申请是否大于需求,若大于则出错 {
cout<<"进程 "<<i<<"申请的资源大于它需要的资源"; cout<<" 分配不合理,不予分配!"<<endl; ch='n'; break; } else { if(Request[j]>Avaliable[j])
cout<<"资源的数量:";
cin>>number;
Avaliable[i]=number;
}
cou程的数量:";
cin>>m;
M=m; cout<<"请输入各进程的最大需求量("<<m<<"*"<<n<<"矩阵):" <<endl; for(i=0;i<m;i++)

操作系统课程设计--银行家算法

操作系统课程设计--银行家算法
for(i=0;i<N;i++)
cout<<name[i]<<" ";
cout<<endl;
for (j=0;j<N;j++){
for(i=0;i<M;i++){
a[j]+=Allocation[i][j];
}
Available[j]=b[j]-a[j];
}
for(i=0;i<N;i++)
cout<<Available[i]<<" ";//输出分配资源
int Allocation[50][50]={0};//系统已分配资源
int Need[50][50]={0};//进程需求资源
int Available[50]={0};//系统可用资源向量
int Request[50]={0};//进程请求资源向量
int Work[50]={0};//存放系统可提供进程继续运行所需各类资源数目
不同的算法可以实现相同的功能,这是我从本次实验中深深体会到的,因而在今后的学习中遇到问题我会尝试着用的不同的方法来解决,有时候换个角度可以很方便的解决问题
课程设计是我们对专业课程知识综合应用的实践训练,只有认真的进行课程设计,学会脚踏实地认真思考学习,课程设计是培养我们综合运用所学知识,发现、提出、分析和解决实际问题、锻炼实践能力的重要环节,是对我们实际能力的考察过程。
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>Max[i][j];
cout<<"请输入各进程的已分配("<<m<<"*"<<n<<"矩阵)[Allocation]:"<<endl;

操作系统课程设计银行家算法模拟实现

操作系统课程设计银行家算法模拟实现

课程设计报告课程设计名称:银行家算法模拟实现系:学生姓名:班级:学号:成绩:指导教师:开课时间:学年学期题目要求:一.设计题目银行家算法模拟实现二.主要内容设计目的1、了解多道程序系统中,多个进程并发执行的资源分配。

2、掌握思索的产生原因、产生死锁的必要条件和处理死锁的基本方法。

3、掌握预防死锁的方法,系统安全状态的基本概念。

4、掌握银行家算法,了解资源在进程并发执行中的资源分配策略。

5、理解死锁避免在当前计算机系统不常使用的原因。

三.具体要求设计一个n个并发进程共享m个系统资源的系统,进程可动态申请资源和释放资源,系统按各进程的申请动态的分配资源。

要求采用银行家算法实现。

四.进度安排五.成绩评定考核方法:根据学生平时表现、测试检查、课程设计报告、运行演示和学生回答问题相结合的形式作为考核依据,考察学生的动手能力,独立分析解决问题的能力和创新精神,并根据学生的学习态度综合考评。

平时表现(占30%),课程设计报告(占40%),课程答辩(占30%)。

成绩评定:成绩分“优秀”、“良好”、“中等”、“及格”、“不及格”五个级别。

“优秀”为100分到90分,“良好”为89分到80分,“中等”为79分到70分,“及格”为69分到60分,“不及格”为60分以下。

目录1.需求分析 (4)2.概要设计 (4)3.详细设计 (6)4.调试分析 (12)5.总结 (16)6.参考文献 (16)1.需求分析1、始化这组进程的最大资源请求和一次申请的资源序列。

把各进程已占用和需求资源情况记录在进程控制块中。

假定进程控制块的内容包括:进程名,状态,当前申请量,资源需求总量,已占资源量,能执行完标志。

其中,进程的状态有:就绪,等待和完成。

当系统不能满足进程的资源请求时,进程出于等待状态。

资源需求总量表示进程运行过程中对资源的总的需求量。

已占资源量表示进程目前已经得到但还为归还的资源量。

因此,进程在以后还需要的剩余资源量等于资源需要总量减去已占资源量。

操作系统课程设计银行家算法

操作系统课程设计银行家算法

一、课程设计的目的操作系统是计算机系统的核心系统软件,它负责控制和管理整个系统的资源并组织用户协调使用这些资源,使计算机高效的工作。

《操作系统课程设计》是《操作系统》理论课的必要补充,是复习和检验所学课程的重要手段,本课程设计的目的是综合应用学生所学知识,通过实验环节,加深学生对操作系统基本原理和工作过程的理解,提高学生独立分析问题、解决问题的能力,增强学生的动手能力。

二、课程设计的要求1.分析设计内容,给出解决方案(要说明设计实现的原理,采用的数据结构)。

2.画出程序的基本结构框图和流程图。

3.对程序的每一部分要有详细的设计分析说明。

4.源代码格式要规范。

5.设计合适的测试用例,对得到的运行结果要有分析。

6.设计中遇到的问题,设计的心得体会。

7.按期提交完整的程序代码、可执行程序和课程设计报告。

三、银行家算法1、银行家算法银行家算法是一种最有代表性的避免死锁的算法。

要解释银行家算法,必须先解释操作系统安全状态和不安全状态。

安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。

安全状态一定是没有死锁发生。

不安全状态:不存在一个安全序列。

不安全状态不一定导致死锁。

那么什么是安全序列呢?安全序列:一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。

银行家算法:我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。

操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。

当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。

操作系统原理课程设计银行家算法

操作系统原理课程设计银行家算法

课程设计课程名称操作系统原理课程设计题目编程序模拟银行家算法专业计算机网络班级姓名成绩指导教师2009 年7月6日至2009年7月10日课程设计任务书设计题目:编程序模拟银行家算法设计目的1、银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。

加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

2、提高学生的程序设计能力、提高算法设计质量与程序设计素质;设计任务(在规定的时间内完成下列任务)思想:将一定数量的资金供多个用户周转使用,当用户对资金的最大申请量不超过现存资金时可接纳一个新客户,客户可以分期借款,但借款总数不能超过最大的申请量。

银行家对客户的借款可以推迟支付,但是能够使客户在有限的时间内得到借款,客户得到所有的借款后能在有限的时间内归还。

用银行家算法分配资源时,测试进程对资源的最大需求量,若现存资源能满足最大需求就满足当前进程的申请,否则推迟分配,这样能够保证至少有一个进程可以得到所需的全部资源而执行到结束,然后归还资源,若OS能保证所有进程在有限的时间内得到所需资源则称系统处于安全状态。

时间安排1月 14日布置课程设计任务;分配题目后,查阅资料、准备程序;1月 15 ~1月17 日上机调试程序、书写课程设计报告;1月18 日提交课程设计报告及相关文档。

具体要求1.课程设计报告按统一通用格式书写,具体格式要求请在网络上查阅;2.每位学生应独立完成各自的任务且每天至少在设计室工作半天;指导教师签名:09年7月6日教研室主任(或责任教师)签名:09年7月10日1.需求分析本设计的目的是通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。

集体要求如下:(1)模拟一个银行家算法;(2)初始化时让系统拥有一定的资源;(3)用键盘输入的方式申请资源;(4)如果预分配后,系统处于安全状态,则修改系统的资源分配情况;(5)如果预分配后,系统处于不安全状态,则提示不能满足请求,此次课程设计的主要内容时模拟实现动态资源分配。

操作系统课程设计(银行家算法地模拟的实现)

操作系统课程设计(银行家算法地模拟的实现)

操作系统课程设计(银行家算法的模拟实现)一、设计目的1、进一步了解进程的并发执行。

2、加强对进程死锁的理解。

3、用银行家算法完成死锁检测。

二、设计内容给出进程需求矩阵C、资源向量R以及一个进程的申请序列。

使用进程启动拒绝和资源分配拒绝(银行家算法)模拟该进程组的执行情况。

三、设计要求1、初始状态没有进程启动。

2、计算每次进程申请是否分配,如:计算出预分配后的状态情况(安全状态、不安全状态),如果是安全状态,输出安全序列。

3、每次进程申请被允许后,输出资源分配矩阵A和可用资源向量V。

4、每次申请情况应可单步查看,如:输入一个空格,继续下个申请。

四、算法原理1、银行家算法中的数据结构(1)、可利用资源向量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]2、银行家算法应用模拟实现Dijkstra的银行家算法以避免死锁的出现,分两部分组成:一是银行家算法(扫描);二是安全性算法。

(1)银行家算法(扫描)设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K个Ri类型的资源。

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

信息与计算科学操作系统原理课程设计报告题目:银行家算法程序设计班级:姓名:专业:银行家算法程序设计目录1.绪论 (2)2.需求分析 (2)2.1功能需求 (2)2.2数据需求 (2)3. 总体设计 (2)3.1功能模块设 (2)3.2系统设计方案 (3)3.3开发工具 (4)4. 详细设计 (4)4.1银行家算法中的数据结构 (4)4.2银行家算法 (5)4.3安全性算法 (6)5. 调试与测试 (8)6. 结论 (8)结束语 (8)参考文献 (9)附录1-用户手册 (10)附录2-源程序清单 (11)1.绪论20世纪末,随着计算机科学的发展,C语言的应用越来越广泛,很多程序都需要使用C语言来编写。

C语言使用方便快捷,它已经成为计算机编程中不可缺少的一部分,而且它也被用于各个方面。

例如:政府部门,银行,学校等等。

银行家算法是判断系统是否安全,并且允许其它进程来申请这里的资源,任何一个进程来申请资源时,必须先登记该进程对资源的申请要求然后由系统检查当前资源的状况,并用银行家算法和安全性算法来检查是否允许分配资源给进程。

通过课程设计,加深我们对利用银行家算法避免死锁的理解。

在设计中主要的难点是用语言编写银行家算法和安全性算法,使系统资源分配能安全进行,避免系统死锁。

2.需求分析2.1 功能需求1.添加进程的可用资源,最大资源,已分配资源;2.判断系统是否安全;3.申请资源;4.申请资源后如何分配;5.进行安全检查。

2.2 数据需求主要数据包括:可用资源,最大资源,已分配资源,申请资源数。

3. 总体设计3.1 功能模块设对资源进行分配银行家算法判断是否安全输出安全序列图1 功能模块图3.2 系统设计方案在程序中设计五个进程,分别为P0,P1,P2,P3,P4。

共享三类资源。

在这个资源管理系统中对进程的所需最大资源(Max)、已分配给当前进程资源(Allocation)和系统可用资源(Available)分别进行了初始化了值。

进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。

要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列,若分配不安全,则释放分配的资源,防止使系统进入不安全状态。

显示和打印各进程依次要求申请的资源号以及为某进程分配资源后的有关资源数据。

程序还可以实现对系统的修改。

如果修改系统可用资源(Available),和进程分配资源。

程序具体的设计是:函数void showdata()用来显示资源矩阵,包括系统可用资源数目,进程对资源最大需求数,系统已分配给进程的资源数,进程还需求资源。

通过以上显示,很直观的观察到资源分配和修改的过程。

函数share()用来利用银行家算法对某个进程申请资源对进行判定。

函数int setdata(int k)用来实现资源试探分配。

主要执行的步骤是 vailable[j]=Available[j]-Request[j];Allocation[k][j]=Allocation[k][j]+Request[j];Need[k][j]=Need[k][j]-Request[j];函数panduan()用来实现安全性算法,对分配后的资源进行计算,若分配资源后,系统是安全的,则资源完成本次分配。

若不安全将本次的试探分配作废,调用backdata()函数恢复原来的资源分配状态。

3.3 开发工具该程序是采用C程序设计完成的,vc6.0的编译环境。

4. 详细设计4.1 银行家算法中的数据结构1.可利用资源向量Available是个含有3个元素的数组,其中的每一个元素代表一类可利用的资源数目。

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

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

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

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

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

4.需求矩阵Need这也是一个5×3的矩阵,用以表示每一个进程尚需的各类资源数。

如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。

Need[i,j]=Max[i,j]-Allocation[i,j]初始化函数showdata()开始输入各可用资源输入已分配资源输入每个进程最多所需资源初始化函数showdata()结束图2 赋值4.2 银行家算法设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K个Rj类型的资源。

当Pi如果Requesti[j]≤Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布最大值。

1.如果Requesti[j]≤Available[j],便转向步骤(3);否则,表示尚无足够资源,Pi须等待。

2.系统试探着把资源分配给进程PiAvailable[j]∶=Available[j]-Requesti[j];Allocation[i,j]∶=Allocation[i,j]+Requesti[j];Need[i,j]∶=Need[i,j]-Requesti[j];3.系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。

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

4.3 安全性算法1.设置两个向量:工作向量Work: 它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work∶=Available;工作向量Finish: 它表示系统是否有足够的资源分配给进程,使之运行完成。

开始时先做Finish[i]∶=false; 当有足够资源分配给进程时,再令Finish[i]∶=true。

2.从进程集合中找到一个能满足下述条件的进程:Finish[i]=false;Need[i,j]≤Work[j];若找到,执行 (3),否则,执行 (4)3.当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应Work[j]∶=Work[i]+Allocation[i,j];Finish[i]∶=true;go to step 2;4.如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态开始初始化showdata()判断Need[i][j]<Work[j]?tempI=truetempI=false是否Work[j]=Work[j]+Allocation[i][j];5个进程是否判断完毕?否输出安全序列显示分配结束是不安全图3 安全性判断5. 调试与测试1.在执行程序时,有时分配空间能够造成死锁也会分配资源。

通过细心地查找发现了其中的逻辑错误,并加以改正。

2.在使用循环语句:while时由于循环条件的值没有改变,所以形成了死循环。

通过耐心的检查发现了这一错误,然后将其改正。

3.在执行程序时,有时分配资源数大于总资源数时仍能分配。

通过调试找到其中的错误并改正。

4.在使用选择语句if时,经常出现逻辑错误。

通过老师的指导,改正了错误。

6. 结论这次操作系统实验基本上已经达到了预期的目的:能够实现银行家算法。

虽然程序已经可以使用了,但是它还是有一些需要改进的地方。

例如:不能同时对2个进程进行分配,不能自行输入进程数量和进程种类。

实验主要是银行家算法部分:1.如果Request<=Need,便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。

2.如果Request<=Available,便转向步骤3;否则,表示尚无足够资源,需要等待。

3.系统试探分配请求的资源进程。

4.系统执行安全性算法。

结束语近两周的操作系统实验结束了,从开始选择题目到作品的完成,再到设计报告的完成,每一步对我来说都是新的尝试与挑战,在老师的细心指导和严格要求下我顺利的完成的任务,做出了理想的程序。

虽然这是我第三次做课设,但是我对操作系统的实验还是不了解。

通过老师的耐心指导我的C语言水平有所提高,并且完全明白了银行家算法。

虽然课程设计占用了我大量的时间,但是却让我复习了一下过去所学到的知识,我认为还是值得的。

在做这次课程设计过程中不但使我学到了很多C语言方面的知识,而且我也领悟到了一些真理。

我感到不论做什么事只有真正用心去做,才能克服种种困难,其实有些时候困难本身并不可怕,真正可怕的是面对困难我们缺少的决心和信心。

光学不做是没有意义的,只有实践才能学好,要想学好一门科目就要经常做一些练习。

希望这次的经历能让我在今后的学习. 工作和生活中不断成长与进步。

参考文献[1]谭浩强.C程序设计(第三版). 北京:清华大学版社,2005[2]汤子灜.哲凤屏. 汤小丹.计算机操作系统(第三版). 西安:电子科技大学出版社,2007附录1-用户手册1.输入可利用资源:2.输入需要申请资源的进程号:系统不安全3.输入需要申请资源的进程号:系统安全并输出安全序列4.输入申请资源错误附录2-源程序清单#include <iostream.h>int Available[3],Allocation[5][3],Max[100][100];//已有资源量int Need[100][100],Work[50],Finish[5],work[5][3];//需求int Request[3]={0,0,0};int i,j,n,m,l=0,flag=0,temp[5]={0,1,2,3,4};void showdata(){int i,j;for(i=1;i<5;i++){for(j=0;j<3;j++){ work[temp[0]][j]=Available[j];work[temp[i]][j]=work[temp[i-1]][j]+Allocation[temp[i-1]][j];}}cout<<" 系统可用的资源数为:"<<endl<<endl;cout<<" 资源: A: "<<Available[0];cout<<" B: "<<Available[1];cout<<" C: "<<Available[2];cout<<endl<<endl;cout<<" Work Need Allocation Work+Allocation"<<endl;cout<<"资源 A B C A B C A B C A B C"<<endl;for (i=0;i<5;i++){cout<<"进程P"<<temp[i]<<":";for (j=0;j<3;j++)cout<<" "<<work[temp[i]][j];cout<<"\t";for (j=0;j<3;j++)cout<<" "<<Need[temp[i]][j];cout<<"\t";for (j=0;j<3;j++)cout<<" "<<Allocation[temp[i]][j];cout<<"\t";for (j=0;j<3;j++)cout<<" "<<work[temp[i]][j]+Allocation[temp[i]][j];cout<<endl;}cout<<"------------------------------------------------------------------------"<<endl<<endl;}void setdata(int k){int j;for (j=0;j<3;j++){Available[j]=Available[j]-Request[j];Allocation[k][j]=Allocation[k][j]+Request[j]; Need[k][j]=Need[k][j]-Request[j];}}void backdata(int k){int j;for (j=0;j<3;j++){Available[j]=Available[j]+Request[j];Allocation[k][j]=Allocation[k][j]-Request[j]; Need[k][j]=Need[k][j]+Request[j];}}int panduan(int t){ int h=0;int i=t;while(i<5){flag=0;if (Finish[i]==0){for (j=0; j<m; j++){if (Work[j]>=Need[i][j])flag=flag+1;}if(flag==m){Finish[i]=1;for (j=0; j<m;j++){Work[j]=Work[j]+Allocation[i][j];}l=l+1;temp[h]=i;h++;i=0;}}else{i++;}}return l;}void main(){int k=0,r=0;cout<<"输入各种资源可利用的数量Available["<<3<<"]: "<<endl;for (j=0; j<3; j++){cin>>Available[j];Work[j]=Available[j];}cout<<"\n请输入各进程当前已分配的资源数量Allocation["<<5<<"]["<<3<<"]: "<<endl;cout<<"\n请严格按照("<<5<<"×"<<3<<")的距阵输入:"<<endl;for (i=0; i<5; i++){for (j=0; j<3; j++){cin>>Allocation[i][j];}Finish[i]=0;}cout<<"\n输入各进程对各类资源的最大需求数Max["<<5<<"]["<<3<<"]: "<<endl; cout<<"\n请严格按照("<<5<<"×"<<3<<")的距阵输入:"<<endl;for (i=0; i<5; i++){for (j=0; j<3; j++){cin>>Max[i][j];Need[i][j] = Max[i][j]-Allocation[i][j];}}/////////////////////////////////////////////////////////////////////////////////char f='y';while(f=='Y'||f=='y'){i=-100;while(i<0||i>=5){cout<<" 请输入需要申请资源的进程号(从P0到P4,否则表示想退出此程序!):";cin>>i;if(i<0||i>=5){cout<<" 输入的进程号不存在,系统退出!"<<endl;return;}}cout<<" 请输入进程P"<<i<<"申请的资源数"<<endl;for (j=0;j<3;j++){cout<<" 需要第"<<j+1<<"种资源数量: ";cin>>Request[j];if(Request[j]>Need[i][j]){cout<<" 进程P"<<i<<"申请的资源数大于它还需要的此类资源的资源量!"<<endl;cout<<" 申请不合理,出错!请重新选择!"<<endl<<endl;f='N';break;}else if(Request[j]>Available[j]){cout<<" 进程P"<<i<<"申请的资源数大于系统可用的此类资源的有效资源量!";cout<<"由于可能会产生死锁,所以银行家算法不予分配,请重新输入!"<<endl<<endl;f='N';break;}}if(f=='Y'||f=='y'){setdata(i);if(panduan(i)!=5){backdata(i);cout<<"\n当前状态不安全!!!!!"<<endl;showdata();}elsecout<<"\n安全的状态!!!"<<endl;showdata();}elsecout<<endl;cout<<" 是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ";cin>>f;}}。

相关文档
最新文档