操作系统课程设计 银行家算法报告.docx
- 文档编号:3130377
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:33
- 大小:5.06MB
操作系统课程设计 银行家算法报告.docx
《操作系统课程设计 银行家算法报告.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计 银行家算法报告.docx(33页珍藏版)》请在冰点文库上搜索。
操作系统课程设计银行家算法报告
操作系统课程设计报告
院(系):
计算机工程学院
专业:
计算机科学与技术专业
学生姓名:
__
班级:
__计算073_学号:
题目:
仿真模拟银行家算法对死锁的避免
起迄日期:
__2010-7-6至2010-7-16_
设计地点:
2号实验楼402
指导教师:
2009—2010年度第2学期
完成日期:
2010年7月16日
一、课程设计目的
《操作系统》是一门重要的专业基础课,是涉及较多硬件知识的计算机系统软件课程。
在计算机软硬件课程的设置上,它起着承上启下的作用。
操作系统对计算机系统资源实施管理,是所有其他软件与计算机硬件的唯一接口,所有用户在使用计算机时都要得到操作系统提供的服务。
操作系统课程设计的主要任务是研究计算机操作系统的基本原理和算法,掌握操作系统的进程管理、存储管理、文件管理和设备管理的基本原理与主要算法。
目的是使学生掌握常用操作系统(如DOS、Windows或Linux)的一般管理方法,了解它是如何组织和运作的,对操作系统的核心概念和算法有一个透彻的理解,并对系统运行的机制有一个全面的掌握,从而充分理解系统调用与程序设计之间的关系。
二、课程设计内容
仿真模拟银行家算法对死锁的避免。
对于进程死锁的避免问题,分为两种状态:
安全状态和非安全状态。
在避免死锁的方法中,允许进程动态地申请资源分配之前,应先计算此次资源分配的安全性。
若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,令进程等待。
所谓安全状态是指系统能按某种进程顺序,来为每个进程pi分配所需的资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成。
如果系统无法找到这样一个序列,则系统处于不安全状态。
只要系统处于安全状态,系统便可避免进入死锁状态。
因此避免死锁的实质在于:
系统在进行资源分配时,如何使系统不进入不安全状态。
银行家算法就是一种最有代表性的避免死锁的算法。
三、系统分析与设计
1、系统分析
系统分析的主要任务是将在系统详细调查中所得到的文档资料集中到一起,对组织内部整体管理状况和信息处理过程进行分析。
目的是将用户的需求及其解决方法确定下来,这些需要确定的结果包括:
开发者关于现有组织管理状况的了解;用户对信息系统功能的需求;数据和业务流程;管理功能和管理数据指标体系;新系统拟改动和新增的管理模型等等。
系统分析所确定的内容是今后系统设计、系统实现的基础。
根据银行家算法,设计这个银行家算法的模拟系统。
算法中涉及到进程的个数,资源的种类。
进程当前占有的资源保存在数组allocation中,需要的资源数目need数组中。
用户添加进程数目,并且设置每个进程对于每一类资源的占有情况和需要情况,还可以设置每一类资源的库存容量。
根据算法,找出安全序列,如果不存在安全序列的话,会显示安全序列不存在。
2、系统设计
程序是利用java语言编写的,直接调用java中的GUI接口进行界面的设计。
设计出两个窗口,一个主窗口,一个执行算法并且将结果显示的对话框。
涉及到java中的JFrame、JPanel、JDialog主要是这三个。
其中面板类用到了最多的。
下面将这两个窗口的任务叙述如下:
1、对于主窗口,包括添加进程的功能、设置每个进程的Allocation的数目、设置Available的数值。
可以设置每个进程的Request的情况。
(1)添加进程的功能。
利用了一个JtextField输入进程的名字。
利用JcomboBox选择各个给进程所需要的资源的最大数目。
利用按钮添加监听器实现添加功能。
如果进程名字没有添加的话,默认是:
进程+序号。
(2)设置Allocation。
与上面的基本相同。
利用了一个JtextField输入进程的名字。
利用JcomboBox选择各个给进程所占有的各类资源的数目。
利用按钮添加监听器实现添加功能。
如果没有见输入进程的名字,功能不能执行。
根据算法,所占有的各类的资源的数目不能超过给进程所需要的各类资源的最大数目。
否则不会执行。
(3)设置Request。
功能执行的时候,用JtextField输入进程的名字。
利用JcomboBox选择各个给进程所申请的各类资源的数目。
利用按钮添加监听器实现添加功能。
如果没有见输入进程的名字,功能不能执行。
根据算法,所申请的各类的资源的数目不能超过给进程所需要的数目,即不能超过Need中的数目。
如果满足的话,还必须检查是否超过了Available中的数目。
只有这两个条件同时满足了,才能够继续执行。
2、对于另一个窗口,主要是通过内部类来实现的。
这个窗口相当于主窗口中的一个变量。
这个窗口实现了算法和显示结果。
(1)显示Request后的各个变量的结果。
利用Jlist控件将结果显示。
因为使用的是内部类,所以可以自由调用外部的变量。
(2)显示执行算法后的结果。
同样也是利用Jlist控件将结果显示。
执行算法的时候,先将数据的字符串形式转化为数字形式。
然后根据银行家算法执行,查找到安全序列。
将结果显示。
3、设计的过程,填入了两个实例。
一个是正确的存在安全序列的实例。
一个是不存在安全序列的实例。
3、模块设计:
程序的设计主要有两个模块,分别是设置数值和检查安全性序列模块。
对于设置数值模块,主要有添加进程、清空进程、进程申请资源(即,Request资源)。
对于检查安全性序列就是执行银行家算法。
程序运行的时候,先是设置数据,通过点击添加进程、设置Allocation和Request的值来设置数据。
在点击“执行算法”,弹出对话框显示申请资源后的结果。
在点击对话框中的执行算法按钮进行查找安全序列。
其中涉及的数据结构和模块调用图如下:
1、对于设置数值模块(包括添加进程、清空进程、申请资源)用到的数据结构是一个类:
publicclassMyJlistextendsJFrameimplementsActionListener
{
privateJTextFieldcurrent_text=newJTextField();//添加到标签("当前进程资源非配情况:
")之后,添加到容器panel1的中间
privateJListthreadName_list;//显示添加的进程名字
privateJListmax_resource1_list;//显示各个进程所用到的资源1的最大数量
privateString[]max_resource1_list_num=newString[10];//存储各个进程所用到的资源1的最大数量
privateJListmax_resource2_list;//显示各个进程所用到的资源2的最大数量
privateString[]max_resource2_list_num=newString[10];//存储各个进程所用到的资源2的最大数量
privateJListmax_resource3_list;//显示各个进程所用到的资源3的最大数量
privateString[]max_resource3_list_num=newString[10];//存储各个进程所用到的资源3的最大数量
privateJListallocation_resource1_list;
//显示各个进程所占有的资源1的数量
privateString[]allocation_resource1_list_num=newString[10];
//存储各个进程所占有的资源1的数量
privateJListallocation_resource2_list;
//显示各个进程所占有的资源2的数量
privateString[]allocation_resource2_list_num=newString[10];
//存储各个进程所占有的资源2的数量
privateJListallocation_resource3_list;
//显示各个进程所占有的资源3的数量
privateString[]allocation_resource3_list_num=newString[10];
//存储各个进程所占有的资源3的数量
privateJListneed_resource1_list;
//显示各个进程所需要的资源1的数量
privateString[]need_resource1_list_num=newString[10];
//存储各个进程所需要的资源1的数量
privateJListneed_resource2_list;
//显示各个进程所需要的资源2的数量
privateString[]need_resource2_list_num=newString[10];
//存储各个进程所需要的资源2的数量
privateJListneed_resource3_list;
//显示各个进程所需要的资源3的数量
privateString[]need_resource3_list_num=newString[10];
//存储各个进程所需要的资源3的数量
privateJListavailable_resource1_list;
//显示资源1的库存数量
privateString[]available_resource1_list_num=newString[]{"10"};
//存储资源1的库存数量
privateJListavailable_resource2_list;
//显示资源2的库存数量
privateString[]available_resource2_list_num=newString[]{"5"};
//存储资源2的库存数量
privateJListavailable_resource3_list;
//显示资源3的库存数量
privateString[]available_resource3_list_num=newString[]{"7"};
//存储资源3的库存数量
privateJTextFieldadd_ThreadName;
//添加的进程的名字
privateString[]name_num_add_ThreadName=newString[10];
//存储所要添加的进程的名字
}
2、对于执行银行家算法的所用到的数据结构是一个内部类:
classComputeDialogextendsJDialogimplementsActionListener
{
//银行家算法所用的变量
privateint[][]work=newint[10][3];
privateint[][]need=newint[10][3];
privateint[][]allocation=newint[10][3];
//以下是显示申请资源后进程和资源中类的情况
privateJListthreadName0_list;
privateJListmax0_resource1_list;
privateJListmax0_resource2_list;
privateJListmax0_resource3_list;
privateJListneed0_resource1_list;
privateJListneed0_resource2_list;
privateJListneed0_resource3_list;
privateJListallocation0_resource1_list;
privateJListallocation0_resource2_list;
privateJListallocation0_resource3_list;
privateJListavailable0_resource1_list;
privateJListavailable0_resource2_list;
privateJListavailable0_resource3_list;
//以下显示利用银行家算法执行后的各个进程和资源的结果
privateJListthreadName1_list;
privateJListmax1_resource1_list;
privateString[]max1_resource1_list_num=newString[num_add_ThreadName];
privateJListmax1_resource2_list;
privateString[]max1_resource2_list_num=newString[num_add_ThreadName];
privateJListmax1_resource3_list;
privateString[]max1_resource3_list_num=newString[num_add_ThreadName];
privateJListneed1_resource1_list;
privateString[]need1_resource1_list_num=newString[num_add_ThreadName];
privateJListneed1_resource2_list;
privateString[]need1_resource2_list_num=newString[num_add_ThreadName];
privateJListneed1_resource3_list;
privateString[]need1_resource3_list_num=newString[num_add_ThreadName];
privateJListallocation1_resource1_list;
privateString[]allocation1_resource1_list_num=newString[num_add_ThreadName];
privateJListallocation1_resource2_list;
privateString[]allocation1_resource2_list_num=newString[num_add_ThreadName];
privateJListallocation1_resource3_list;
privateString[]allocation1_resource3_list_num=newString[num_add_ThreadName];
privateJListavailable1_resource1_list;
privateString[]available1_resource1_list_num=newString[num_add_ThreadName];
privateJListavailable1_resource2_list;
privateString[]available1_resource2_list_num=newString[num_add_ThreadName];
privateJListavailable1_resource3_list;
privateString[]available1_resource3_list_num=newString[num_add_ThreadName];
privateJListfinish_list;
privateString[]finish=newString[num_add_ThreadName];
privateJTextFieldsafe_arry;//显示安全序列
}
3、整个程序主要就是两部分,在主窗口部分由添加进程、清空进程、进程实例、申请资源、设置进程当前资源的占有情况、设置资源的库存情况、执行算法。
4、数据结构说明:
程序分为两个模块,其中第一个模块涉及到添加进程、清空进程、设置Allocation、申请资源等等。
第二个模块涉及到将申请资源的结果显示、执行银行家算法。
对于这两个模块的实现主要通过两个类来实现的。
(1)第一个模块是类publicclassMyJlist来实现的,因为用的编程语言是JAVA,所以程序对于各种功能是显示是通过给按钮添加事件监听器来实现的,即add_button.addActionListener(this);//用来实现添加进程
allocation_button.addActionListener(this);
//用来设置对应进程的当前各类资源的占有情况
request_button.addActionListener(this);//用来实现进程对资源的申请
available_button.addActionListener(this);//用来设置当前各类资源的当前的数
clear_button.addActionListener(this);//清空各个进程的记录
example1_button.addActionListener(this);//实例1
example2_button.addActionListener(this);//实例2
check_safe_arry.addActionListener(this);//执行算法,弹出对话框
(2)第二个模块的实现通过一个内部类:
classComputeDialogextendsJDialogimplementsActionListener,与第一模块类似,该模块的功能的实现也是通过按钮添加事件监听器来实现的。
check_safe_button.addActionListener(this);//实现银行算法,查找到安全序列。
查//不到的时候,显示安全序列不存在。
safe_arry.setText("安全序列不存在!
");//安全序列不存在的时候,设置为此文本
对于模块在程序中的作用,第一个模块是主体,第二个模块是在第一个模块的基础上实现的。
5、算法流程图:
1、第一个模块中涉及添加、清空、设置Allocation、设置Available。
(1)主程序初始化。
(2)添加功能
(3)清空功能
(4)设置Allocation
(5)设置Available。
(6)设置Request
2、第二模块主要是实现银行家算法:
loop控制循环次数,超过指定次数,说明没有安全序列
四、模块调试与系统测试
1、模块调试
●输入的形式和输入值的范围
程序的输入过程主要在主窗体中,对于进程名,可以使用任意字符,但是对于进程的名字不能重复。
如果没有填写进程的名字,程序默认这个进程的名字是:
进程+当前的进程数目。
所添加的进程数目不能超过10个进程。
对于进程共享的资源,一共有三类,但是每一类的资源总数不能超过10个。
资源的最大剩余量是10。
●输出的形式
数据的显示在主窗口中和子窗口中都可以显示。
将所有数据填写好后,单击按钮,会在主窗口中显示出所显示的数据。
点击“执行算法”按钮就会弹出一个对话框,显示数据。
对话框中点击按钮“检查安全性”,执行银行家算法,将结果显示在对话框中。
●程序所能达到的功能
程序功能:
1、添加进程及其最大资源。
点击添加按钮进行添加,添加的进程的名字不能重复。
2、给每一个进程的Allocation进行修改。
点击Allocation按钮,会显示当前修改的进程中的资源情况。
3、清空所有记录。
点击“清空”按钮,一切都会初始化。
4、提供了两个实例。
点击按钮“实例1”,显示实例1的所有进程及其资源的分布情况。
同样的点击“实例2”。
4、修改Available的数值。
点击按钮“Available”,显示修改当前各个资源的剩余量。
2、系统测试
测试的数据依照课本上的例子来写:
资源
进程
Max
Allocation
Need
Available
1类2类3类
1类2类3类
1类2类3类
1类2类3类
p0
753
010
743
332
p1
322
200
122
p1
902
302
600
p3
222
211
011
p4
433
002
431
操作过程及其结果如下:
操作步骤
数据输入
操作过程
预期结果
实际结果
结论
1
输入进程名字;选取各类资源对应的数目
点击添加按钮
结果显示在列表框中
结果显示在列表框中
程序正确执行
2
在Request中写上进程名p1
选取资源为1,0,2
点击按钮Request
进程的p1的相应数值改变
进程的p1的相应数值改变
程序正确执行
3
在Available中写资源为3,3,2
点击按钮
Available
列表中相应的数值改变
列表中相应的数值改变
程序正确执行
4
点击执行算法按钮
显示假定分配对话框
显示假定分配对话框
程序正确运行
5
点击检查安全性按钮
得到安全序列
安全序列输出并显示
程序正确执行
6
在Request中写上进程名p4
选取资源为3,3,0
点击按钮Request
弹出对话框,提示不能分配资源
弹出对话框,提示不能分配资源
程序正确执行
7
在Request中写上进程名p0
选取资源为0,2,0
点击按钮Request
进程的p0的相应数值改变
进程的p0的相应数值改变
程序正确执行
8
点击执行算法按钮
显示假定分配对话框
显示假定分配对话框
程序正确执行
9
点击检查安全性按钮
安全序列不存在
显示安全序列不存在
程序正确执行
10
关闭对话框
相应的数值恢复为假定分配之前的数据
相应的数值恢复为假定分配之前的数据
程序正确执行
3、调试分析:
(1)程序测试的时候,发现在执行了银行家算法后,只要进程超过3个很容易死机。
即使不超过3个也会死机。
经过对按钮事件处理的书写仔细检查,才发现程序中控制循环从0开始的变量i的数值有问题。
当一次循环结束后,再进行下一轮循环的时候,i的数值为1,越过了0,以至于程序死机。
将其修改为-1之后,就没有问题了。
(2)对java中的控件的使用非常麻烦,在使用控件Jlist的时候,直接添加到容器中,程序运行的时候会改变大小。
后来从网上查询到了控件的正确使用方法,就是将控件添加到JscrollPane中,在将JscrollPane添加到容器中。
(3)对于Jcombobox的使用也是非常的麻烦,程序中有有一个清空功能,使用了之后必须将控件的数据都要清掉。
于是使用了控件的removeallitem()函数,但是一旦调用这个函数的时候,程序中的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统课程设计 银行家算法报告 操作系统 课程设计 银行家 算法 报告