1、 武汉理工大学华夏学院 课程设计报告书 课程名称: 操作系统原理 题 目: 编程序模拟银行家算法 系 名: 信息工程系 专业班级: 计算机1102班 姓 名: 何利华 学 号: 10210410211 指导教师: 赵传斌 苏永红 2013 年 1 月 17 日 课程设计任务书 学生姓名:
2、何利华 专业班级: 计算机1102 指导教师: 苏永红 赵传斌 工作单位: 信息工程系 设计题目:编程序模拟银行家算法 初始条件: Linux操作系统,GCC编译环境 要求完成的主要任务: 主要任务: 银行家算法是避免死锁的一种重要方法,本实验要求用用c/c++语言在Linux操作系统环境下编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 思想:将一定数量的资金供多个用户周转使用,当用户对资金的最大申请量不超过现存
3、资金时可接纳一个新客户,客户可以分期借款,但借款总数不能超过最大的申请量。银行家对客户的借款可以推迟支付,但是能够使客户在有限的时间内得到借款,客户得到所有的借款后能在有限的时间内归还。用银行家算法分配资源时,测试进程对资源的最大需求量,若现存资源能满足最大需求就满足当前进程的申请,否则推迟分配,这样能够保证至少有一个进程可以得到所需的全部资源而执行到结束,然后归还资源,若OS能保证所有进程在有限的时间内得到所需资源则称系统处于安全状态。 设计报告撰写格式要求: 1设计题目与要求 2 设计思想 3系统结构 4 数据结构的说明和模块的算法流程图 5 使用说明书
4、即用户手册):内容包含如何登录、退出、读、写等操作说明 6 运行结果和结果分析(其中包括实验的检查结果、程序的运行情况) 7 自我评价与总结 8 附录:程序清单,注意加注释(包括关键字、方法、变量等),在每个模块前加注释; 时间安排 1月14日 布置课程设计任务;分配题目后,查阅资料、 准备程序; 1月 15~1月17 日上机调试程序、书写课程设计报告; 1月18 日 提交课程设计报告及相关文档。 指 导 教 师 签 字: 2012年 12月 29日 系 主 任 签 字: 2013年 1月 2 1设计题
5、目与要求 1.1 设计题目 编程序模拟银行家算法 1.2 要求 本实验要求用用c/c++语言在Linux操作系统环境下编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 2 设计思想 思想:将一定数量的资金供多个用户周转使用,当用户对资金的最大申请量不超过现存资金时可接纳一个新客户,客户可以分期借款,但借款总数不能超过最大的申请量。银行家对客户的借款可以推迟支付,但是能够使客户在有限的时间内得到借款,客户得到所有的借款后能在有限的时间内归还。用银行家算法分配资源时,测试进程对资源的最大需求量,若现
6、存资源能满足最大需求就满足当前进程的申请,否则推迟分配,这样能够保证至少有一个进程可以得到所需的全部资源而执行到结束,然后归还资源,若OS能保证所有进程在有限的时间内得到所需资源则称系统处于安全状态。 3系统结构 图 1 4数据结构的说明和模块的算法流程图 4.1数据结构: 1)可利用资源向量Available 是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目。如果Available[j]=K,则表示系统中现有Rj类资源K个。 2)最大需求矩阵Max 这是一个n×m的矩阵,
7、它定义了系统中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] 4.2程序流程图:
8、1、系统主要过程流程图1 图1 图1 2、安全性算法流程图 5 使用说明书(即用户手册) 5.1首先在终端中使用vi编辑器建立c的源文件 5.2然后使用gcc编辑器编译生成可执行文件 5.3使用命令./当前名字,来执行 6运行结果和结果分析 6.1运行结果: 申请成功如图2,申请失败如图3: 图2申请金额在需求范围之内同意
9、 图3申请金额在需求范围之外拒绝 5.2 结果分析 首先是自己定义5个用户所需的金额数,银行可以给用户贷款的总金额数是100,用户Id号的范围是在0到4,超过4之后的id请求贷款,会显示拒绝提示信息,每个客户的贷款数量必须是在之前定义的范围之内,如果超出,也会出现错误提示,只有在规定的用户id和在客户所要求金额的范围之内请求,才会给予贷款,并且输出安全序列号。 6自我评价与总结 经过本周的课程设计,我对操作系统的掌握又进了一步,收获了很多知识。由于对c语言不够熟练,在试验过程中,进行了反复的修改和调试,,终于我了解银行家算法的基本原理,并且在此次的课程设计中我又复习了一下c语
10、言,加深了对它的了解,而且在课程设计的过程中我们同样学会了如何简单的操作与使用Linux操作系统,学习到了许多Linux操作系统中常用的一些密令。
这次的设计数据是通过一道实际的题目来体现银行家算法避免死锁的问题,先用银行家算法给其中一个进程分配资源,看它所请求的资源是否大于它的需求量,才和系统所能给的资源相比较.让进程形成一个安全队列,看系统是否安全.再利用安全性算法检查此时系统是否安全。
7附录:
源程序清单
#include
11、D[5]; int REQUEST=0; int main() { int cid=-1; int m; for(m=0;m<5;m++){ scanf(“%d”,&NEED[i]); while(1) { printf("\n请输入要贷款客户的ID:"); scanf("%d",&cid); printf("请输入%d号客户的请求贷款金额:",cid); scanf("%d",&REQUEST); //对客户的请求进行合法性检测 if(REQUEST>NEED[cid]) { printf("拒绝%
12、d号客户的贷款请求!\n",cid); continue; } if(REQUEST>AVAILABLE) { printf("拒绝%d号客户的贷款请求!\n",cid); continue; } //试探分配 ALLOCATION[cid]+=REQUEST; AVAILABLE-=REQUEST; NEED[cid]-=REQUEST; //进行安全性检查,若安全则贷款成功,否则取消贷款 int WORK=AVAILABLE; int FINISH[5]={0,0,0,0,0};
13、 int safe_indexs[5]; int i=0; int j=0; for(;i<5;i++) { if(0==FINISH[i] && NEED[i]<=WORK) { FINISH[i]=1; WORK+=ALLOCATION[i]; safe_indexs[j]=i; j++; i=0; } } for(i=0;i<5;i++) { if(0==FINISH[i]) { break; } }
14、 if(5==i) { printf("同意%d号客户贷款请求!\n",cid); printf("安全序列为:"); for(j=0;j<5;j++) { printf("%d ",safe_indexs[j]); } printf("\n"); } else { printf("拒绝%d号客户贷款请求!\n",cid); ALLOCATION[cid]-=REQUEST; AVAILABLE+=REQUEST; NEED[cid]+=REQUEST;
15、 } } return 0; } 设计过程中质疑(或答辩)记载: 1. 在怎样的情况下会出现拒绝客户的请求? 答:由于客户的需求已知,当客户输入的id号不正确和客户此时需申请的金额超过之前要求的金额数量时,会提示拒绝客户的请求。只有在规定的序列号范围和要求的金额之内的请求,才会允许客户的申请。 2.在什么情况下,会产生安全序列? 答:安全序列,是保证客户正常贷款的一个安全机制,之有出现安全序列的情况下,才会允许客户的申请,故只有在正常的情况才会出现,即客户输入的id号正确和金额在要求范围之内,才会出现安全序列号。 指导教师评语: 签名: 年 月 日






