一、设计目的、意义和背景
操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。本课程设计的目的综合应用我们所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统开发的基本技能。
在系统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统可能发生死锁,则不予分配,否则予以分配。

通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。
二、设计思想及详细设计过程
1.银行家算法的思路
先对用户提出的请求进行合法性检查,即检查请求的是不大于需要的,是否不大于可利用的。若请求合法,则进行试分配。最后对试分配后的状态调用安全性检查算法进行安全性检查。若安全,则分配,否则,不分配,恢复原来状态,拒绝申请。
2.银行家算法中用到的主要数据结构
int Available[10]; //可使用资源向量
int Max[10][10]; //最大需求矩阵
int Allocation[10][10]={0}; //分配矩阵
int Need[10][10]={0}; //需求矩阵
int Work[10]; //工作向量
int Finish[10]; //状态标志
int Request[10][10]; //进程申请资源向量3.银行家算法bank()
进程i发出请求申请k个j资源,Request i[j]=k
(1)检查申请量是否不大于需求量:Request i[j]<=need[i,j],若条件不符重新输入,不允许申请大于需求量。
(2)检查申请量是否小于系统中的可利用资源数量:Request i[j]<=available[i,j],若条件不符就申请失败,阻塞该进程,用goto语句跳转到重新申请资源。
(3)若以上两个条件都满足,则系统试探着将资源分配给申请的进程,并修改下面数据结构中的数值:
Available[i,j]= Available[i,j]- Request i[j];
Allocation[i][j]= Allocation[i][j]+ Request i[j];
need[i][j]= need[i][j]- Request i[j];
(4)试分配后,执行安全性检查,检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程;否则本次试探分配作废,恢复原来的资源分配状态,让该进程等待。
(5)用do{…}while 循环语句实现输入字符y/n判断是否继续进行资源申请。
4.安全性检查算法
(1)设置两个向量:
工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,在执行安全性算法开始时,Work= Available。
Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]=0;当有足够的资源分配给进程时,再令Finish[i]=1。
(2)在进程中查找符合以下条件的进程:
条件1:Finish[i]=0;
条件2:need[i][j]<=Work[j]
若找到,则执行步骤(3)否则,执行步骤(4)
(3)当进程获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work[j]= Work[j]+ Allocation[i][j];
Finish[i]=1;
goto step 2;
(4)如果所有的Finish[i]=1都满足,则表示系统处于安全状态,否则,处于不安全状态。
三、作品测试结果
1.示例数据(课本例题)
进程数量:5
资源种类3(三种资源以abc表示)
资源
Max
Allocation
Need
Available
进程
abc
abc
abc
abc
0
753
010
743
332
1
322
200
122
2
902
302
600
3
222
211
011
4
433
002
431
2. 运行结果(以1中的示例为例)
模拟银行家算法
请输入系统总共有的资源数:3
请输入总共有多少个进程:5
第1类资源有的资源实例:3
第2类资源有的资源实例:3
第3类资源有的资源实例:2
进程P[1]对第1类资源的最大需求量:7
进程P[1]对第2类资源的最大需求量:5
进程P[1]对第3类资源的最大需求量:3
进程P[2]对第1类资源的最大需求量:3
进程P[2]对第2类资源的最大需求量:2
进程P[2]对第3类资源的最大需求量:2
进程P[3]对第1类资源的最大需求量:9
进程P[3]对第2类资源的最大需求量:0
进程P[3]对第3类资源的最大需求量:2
进程P[4]对第1类资源的最大需求量:2
进程P[4]对第2类资源的最大需求量:2
进程P[4]对第3类资源的最大需求量:2
进程P[5]对第1类资源的最大需求量:4
进程P[5]对第2类资源的最大需求量:3
进程P[5]对第3类资源的最大需求量:3
初始化完成
当前的系统状态
目前占有量 最大需求量 尚需要量
进程 1类 2类 3类 1类 2类 3类 1类 2类 3类
P[1] 0 0 0 7 5 3 7 5 3
P[2] 0 0 0 3 2 2 3 2 2
P[3] 0 0 0 9 0 2 9 0 2
P[4] 0 0 0 2 2 2 2 2 2
P[5] 0 0 0 4 3 3 4 3 3
系统剩余资源量: 3 3 2
-------------------------------------------------------------------------------------------------------
演示计算完毕
四、问题与总结
程序基本实现了银行家算法的功能,并在其基础上考虑了输出显示的格式的美观性、输入错误要求重新输入等几个方面,尽可能的使程序完整一些。这段程序算是最困难最复杂的一个,由于能力有限,所以在紧张的的编写和调试过程中遇到了许多的问题,通过查询资料、翻阅课本、向同学请教、多次调试等方法逐渐解决了大部分问题,编写的过程中也有比较一些算法的优劣性,找出比较好的算法,收获非常大。
第一次尝试用C语言来实现银行家算法,通过对程序的设计思路的分析,算法编写、优化、调试、错误处理等一系列的问题的逐步解决,是我在在操作系统课程学习上也有了很大的进步。
由于课本上给了这个算法的要用到的数据结构,所以数据结构的设计上并没有花费很多时间,只是具体实现考虑了很久。也让我得到了一个启示,以后的学习中一定要多动手,看懂程序不一定写的出来,我们一定要自己动手去写一些程序。说实话,我参考了很多网上的高手写的程序,也跟同学讨论了他们写的程序,从他们身上学到了许多东西,终于有了一些思路,写出来了一些东西感觉有很大的进步,我很高兴。
五、系统说明
1、所需的运行环境
运行平台:Windows XP
开发软件:VC++ 6.0
2、可运行的程序(系统)的具体安装及设置过程
直接点击运行
3、参考的资料
(1).《计算机操作系统》汤子瀛等 西安电子科技大学出版社
(2).《操作系统教程》孙钟秀 高等教育出版社
六、自我评价
1、难度评分:90
2、创新程度:88
3、自我评分:85