操作系统课程设计报告之磁盘管理模块告Word格式.docx
《操作系统课程设计报告之磁盘管理模块告Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计报告之磁盘管理模块告Word格式.docx(84页珍藏版)》请在冰豆网上搜索。
要求磁盘管理模块的实时性非常好,能够迅速对文件管理模块的请求作出响应。
并且需要有统一的消息格式,以便取得一致性。
最后还要有较好的容错性能,当磁盘模块出现异常或消息出现某些特殊情况是,要能给出错误提示。
磁盘调度模块需要友好的界面。
让使用者输入数据,观察各种磁盘调度算法,保证算法的正确性。
磁盘管理模块和文件管理模块的接口使用Socket来实现,接收一个专门的文件消息对象,处理完毕后,返回给文件管理模块结果。
结果也是一个文件消息对象。
4、数据结构设计
磁盘管理中,采用二维表来存储每一个盘块。
磁盘中文件存放形式有链式和索引,单独的文件采用链式存储,文件夹中的文件采用索引节点存储。
使用对象来存储数据,进行信息转移。
磁盘调度算法演示中,采用一维数组来存放所有磁道。
左边用一系列磁道号静态显示磁道的访问过程,右边就是动态变化。
用不同的颜色来区分,将要访问磁道、已访问的磁道和新的磁道访问请求。
5、运行设计
磁盘管理模块
磁盘信息
Disk
MessageControl
文件操作
MessageMessage读取磁盘信息
Blocks
修改磁盘信息
初始数据改变返回
用户输入
存储结果
用户界面:
0|file1|2
2|file1|-1
磁盘大小:
128KB已用空间:
32KB可用空间:
36KB当前文件:
file1
磁盘调度管理
运行算法
用户
选择数据
性能结果
用户界面
总磁道数:
100原始请求数据:
4,20,44,8,78添加磁道请求:
添加
其实磁道:
初始方向:
6、故障处理说明
出现故障,磁盘会产生一个Message对象,对象中的异常信息能够描述异常,并返回给文件系统。
故障
原因
文件创建失败
磁盘已满、需要空间>
剩余空间、文件名重复
找不到该文件
文件信息错误
修改文件失败
剩余空间
7、其他设计
当需求发生变化后,要能够修改并满足新的需求。
如磁盘初始空间要求更大、要求增加二级索引节点,增加文件类型后也要能够较好维护。
磁盘管理的基本概念和原理
首先用,给用户展示磁盘的分布情况,未分配给任何文件的盘块号为黑色。
分配给同一文件的盘块号为同一种颜色,系统总共获取了十四种颜色。
因此可以看到彩色的磁盘分布情况。
除了使用颜色区分盘块所属的文件,每个盘块上面写明了盘块的编号,所分配的文件类型,所分配文件的名字,以及其父文件的节点。
默认情况下,其父节点为-1,就是直接放在根目录下的文件
所有的文件类型分为两种,一种是“文件”,用file表示。
一种是“文件夹”,用folder表示。
文件的大小任意,只要不超出磁盘的空间。
而文件夹的大小就是固定的,只能是1。
文件夹中有十个索引节点,每个节点链接到一个文件或文件夹,以此建立起一棵以文件夹为根节点的文件树。
此外在现实框的最下层,显示了磁盘的使用情况。
总盘块数,已使用盘块和未使用盘块。
展示给用户的界面如下图所示
每一个盘块的信息显示实图
文件夹:
文件:
文件夹的子文件:
磁盘的使用信息:
磁盘管理及调度模块详细设计说明书
一、引言
目的:
磁盘调度算法是一个专门的演示模块,与磁盘管理模块物理相似,和其他模块无实际联系
2、软件结构
磁盘管理模块采用C/S模式,模块又分成三个子模块。
磁盘管理、图形化显示,磁盘调度分为一个模块,六个功能。
3、模块设计说明
磁盘管理模块
磁盘管理模块需要对磁盘进行增删查改操作,以下是每一个操作的流程图。
磁盘演示模块的整体流程图
对应于这个模块的用户界面如下:
New代表新建一个文件,delete选项用来删除一个文件,add选项用来为一个文件增加空间,dec选项为一个文件减小空间,rename给文件重命名。
整个显示的是一个JToolBar类,JToolBar需要增加动作类来产生Button按钮,总共new出了五个抽象动作类,于是出现了上面看到的五个按钮。
相应的代码如下
//新建一个工具条
JToolBartoolBar=newJToolBar();
toolBar.setFloatable(true);
//新建五个抽象动作类
ToolBarActionfile_new=newToolBarAction("
NEW"
null,this);
ToolBarActionfile_del=newToolBarAction("
DELETE"
ToolBarActionfile_add=newToolBarAction("
ADD"
ToolBarActionfile_dec=newToolBarAction("
DEC"
ToolBarActionfile_sea=newToolBarAction("
RENAME"
//把第一个按钮加入工具条
JButtonjb;
jb=toolBar.add(file_new);
jb.setActionCommand("
);
//设置其产生事件所显示的命令
jb.setToolTipText("
新建"
jb.setFocusPainted(false);
toolBar.addSeparator();
//增加一个隔离栏
//把第删除按钮加入工具条
jb=toolBar.add(file_del);
开始"
jb=toolBar.add(file_add);
//把第增加按钮加入工具条
增加"
jb=toolBar.add(file_dec);
//把第减少按钮加入工具条
减少"
jb=toolBar.add(file_sea);
//把第重命名按钮加入工具条
查找"
this.add(toolBar,BorderLayout.NORTH);
//设置其布局,放在最上面
为新建的文件分配磁盘空间,该函数是Disk中的allocate方法
publicMessageallocateSpace(Messagemessage)
删除一个文件的流程图,该函数是Disk中的deleteFF()方法,
publicvoiddeleteFF(intstartAdd)
修改一个文件的流程图,它对应Disk中的两个函数,addSpace和reclaimSpace(Message),程序中是:
publicMessageaddSpace(Messagemessage),publicMessagereclaimSpace(Messagemessage)。
文件重命名的流程图如下,其对应的是renewFile函数,
publicvoidrenewFile(Messagemessage)
文件重命名
最开始设计时,把消息模块也加入了程序中,后来这个模块被删掉了。
1)接收消息
功能名称:
接收消息
参与执行者:
用户
前置条件:
一个合法的登录用户
程序流:
A.if没有消息
继续等待
else
获取消息
If消息对象是Message实例
交给消息控制着处理
返回A
Else
返回Message实例,提示该消息类型错误。
EndIf
Endif
2)消息处理
功能名称:
消息处理
消息控制对象
收到一个Message对象
Aif操作类型合法
If文件类型合法
把消息交给磁盘来处理
Else把消息交给磁盘处理
添加操作消息文件类型无法识别
Else生成新信息,返回操作类型不合法
3)磁盘分配
磁盘分配
磁盘对象
已经收到一个可操作的消息对象
if磁盘未满
If所需空间<
=剩余空间
if此文件的父文件为文件夹
找到其父文件
把一个空闲的盘块号分配给新文件,并把改记录添加到父文件的索引中。
继续给改文件分配全部空间
生成新的信息对象并返回
Else分配给该文件新的空间
生成新的信息对象并返回
Endif
返回空间不足信息
返回磁盘已满信息
4)发送消息
发送消息
参与执行者:
消息发送对象
前置条件:
已经从磁盘对象模块获取了一个消息对象
程序流:
发送消息
磁盘调度模块
磁盘调度
参与执行那个者:
已经登录的合法用户
A。
用户输入数据
If用户选择fcfs算法
运行fcfs算法
Elseif用户选择sstf算法
运行sstf算法
Elseif用户选择scan算法
运行scan算法
Elseif用户选择ccsan算法
运行ccan算法
Elseif用户选择NStepScan算法
运行NStepScan算法
Elseif用户选择Fscan算法
If有新的磁盘访问加入
添加到磁盘队列中
Endif
磁盘管理和调度模块的类图
磁盘管理的完成情况
经过两个星期的努力,最终完成本模块所要求的任务。
对磁盘的增删改查都定义了良好的借口,便于和文件管理模块集成。
此外,我也单独写了一个磁盘调度模块,用来展示五种磁盘调度算法。
不过,我并没有完成当初预想的任务,即把我的模块写成C/S模式,并加入一个消息管理模块,专门来接受、发送、处理消息。
由于我们的模块不是很庞大,王昭阳直接调用我写给他的函数即可。
最后,我还负责整合团队中其他三位成员的代码,并加入了注册登录界面。
下面来看我们的系统。
首先是模拟Linux多用户登录,输入账号和密码,便可以进入我们的系统。
如果用户还未有账号和密码,可以先注册,再进入系统。
1)进入系统
点击登录后,就可以看到我们模拟操作系统的各种管理了。
2)选择演示模块
界面上的四个按钮,分别代表我们四人负责的模块
其中虚拟文件系统已经包跨了磁盘管理与调度系统,但我编写的模块独立性很强,接口定义良好,作为一个单独的模块演示也很好看。
由于磁盘调度与磁盘管理和文件管理没有太多关系,用户会看到两个窗口,第一个是磁盘管理窗口,第二个是磁盘调度算法窗口。
实际效果如下面截图
3)新建文件
磁盘上本来就有一些文件和文件夹,我们把它当做系统文件。
点击新增按钮,会弹出一个窗口,提示用户输入相应的数据。
如新建一个大小为5,名字为li,直接放在根目录下的文件。
点击确定,磁盘上就会多出五个绿色的盘块号,并写着li,实际如下面所示
当你点击new时,就会new一个FileDialog类,该类继承了抽象坚挺器接口,如下所示。
publicclassFileDialogextendsJDialogimplementsActionListener
用户输入数据后,点击确定,系统获取用户输入的数据,并调用相应的方法,为文件分配盘块。
代码如下
if(dialog_type.equals("
)){//用户要新增一个文件
//创建函数所需的信息对象
m=newMessage(text_name.getText(),text_fileType
.getSelectedItem().toString(),Integer
.parseInt(text_size.getText()),Integer
.parseInt(text_parentN.getText()));
//调用分配空间方法
m=d.allocateSpace(m);
4)删除文件
当用户点击delete时,也会有一个相应的对话框弹出,示意用户所需要输入的数据。
输入8并按确定后,初始盘块为8的文件就被删除了,结果如下图
删除的流程和新建差不多,系统获取用户输入的信息后,new一个信息对象,便执行删除方法,代码如下
elseif(dialog_type.equals("
)){//执行删除功能
//创建删除磁盘上文件所需的信息
m=newMessage(Integer.parseInt(text_fileSA.getText()));
m=d.reclaimSpace(m);
//执行删除方法
frame.setMessage(m);
5)增加空间
点击增加空间按钮,同样有一个增加空间的对话框,用户输入必须的数据后,就可以为相应的盘块号增加空间。
这次拿初始盘块号为1,末尾盘块号为3的文件,增加空间为3。
未增加前分布和颜色如下
点击增加
增加以后,盘块分布如下
6)减少空间
减少是增加的逆操作,下面值演示,不解释了
减少空间后,分布如下
7)重命名
点击重命名按钮,输入重命名文件的其实盘块号,文件大小,以及需要改变的新名称,就可
以更改文件的名称了。
更改后的名称如下
,其颜色也会有相应的改变。
磁盘调度算法,
磁盘调度模块总共展示五种磁盘算法,fcfs算法,sstf算法,scan算法,cscan算法,NS算法。
磁道的总数由用户自己决定,初始盘块号也有用户自己决定。
如果用户不想输入磁盘数和初始磁道,那么系统会分配一个默认值。
默认情况下,磁道的总数是10,初始盘块号为100。
需要点击创建磁道来获取初始化磁道的信息,一步步如下图
上面显示的是初始化后,磁道的分布情况。
左边是磁道出现的先后顺序,由于没有开始演示调度算法,访问距离和平均访问距离都为0。
右边则按磁道的编号来展示磁道的分布,最小编号牌最上面,最大编号排最下面。
黑色的代表未被访问的磁道,红色的代表初始磁道号。
如果点击fcfs算法,左边会给每一个磁道填上相应的访问距离,并统计平均访问距离,右边会按照磁道访问的先后顺序,以此显示磁道的颜色。
蓝色代表将要访问的磁道,绿色代表已经被访问过的磁道。
磁盘调度算法演示完成后,右边的磁盘便会恢复原状。
下面展示每一种磁盘调度算法的演示情况
由于NStepScan算法是scan算法的累加,于是没有动态演示效果,只有静态的访问顺序。
总结和心得
经过两个星期的努力,终于如愿完成了操作系统课程设计。
整个过程虽然比较辛苦,有时也会感到比较烦躁,但我学到了很多东西,领悟了许多道理。
学习
1.第一次真实感受到软件工程方法所带来的巨大成效。
以前都只是凭着脑子想东西,就一行行写下了代码。
写出来的东西没有一个清晰的架构,整个过程也没有明显的步骤。
基本上是想到哪就写到哪,写出来的程序能完成功能,但兼容性很差,更别提到和其他的模块兼容。
这次,我们小组按照软件工程的一般做法。
从概要设计,详细设计,程序设计,编码,模块测试,集成测试,系统测试和最后的交付验收,我们每一步都做了相应的工作,结果很让人满意。
我们各自都提出了自己的设想,最后也都基本完成了各自设计的程序。
2要勇于想象。
我以前从来都没有写过磁盘管理模块的相关程序,这次我阅读了磁盘管理和调度的基本原理后,就有了初步的想法。
接着把自己所想的东西,变成自己可以看到的东西。
Java的功能十分强大,我想是想的相应算法,它都提供了相应的接口和类来供我使用。
自己做出了漂亮的磁盘管理界面后,心中也十分欢快。
3.要擅于参考优秀的代码。
我以前从未用java图形界面工具Swing做过如此复杂的动态想过演示。
一个个控件、按钮、以及数据的输入和输出,我都不知道如何整理。
但我从一个漂亮的图形界面程序中学习良好的架构,从而做出了自己想要的效果。
当然,在这个过程中,也遇到了很多问题,有客观的,也有主观的,下面我分析这些问题都是怎样的,以及我是怎样解决的。
问题
1.接口问题。
磁盘管理模块和文件管理模块联系十分紧密,但偏偏分成了两个模块,分别给两个人做。
我们要写一个公用的接口,以便到时候集成到一起时,能够让磁盘分配和文件分配同步。
我们考虑再三,便决定用一个javaBean来作为信息的在体,我们进行增删查改时都是根据这个对象中的信息来进行操作。
除此之外,我们没一个操作都对应一个独立的方法,这样操作间就不会有太大的影响。
最后,我们把两个模块集成到一起时,很快就实现了同步,因为大家都用了类似的接口。
2.数据结构的使用。
用什么来记录磁盘上文件的数据,以及如何记录文件的分配情况。
要能够既快又节省空间。
最后我使用了一个二维的boolean数组来记录磁盘的使用情况,当这个数据为false时,该盘块号没有被使用,为true时,就使用了。
那么进行增删改查时,都要根据这个二维布尔数组来进行操作。
而相应的存储磁盘的信息,就存放在一个Block二维数组中,现实磁盘信息就存储在JButton的数组中,这样,存储,现实,和整体磁盘信息分离,能够很好的兼容其他的情况,能根据需求做出相应的改变。
最后,我很高兴自己能够设计出这样的一个磁盘管理系统。
日后再遇到一些任务时,便可以更好的应对。
这次可程设计,也为我日后编写程序打下了坚实的基础。
自己这么多天的努力总算没有白费,以后我可以自信的说自己能够设计出对用户友好的,并且有漂亮图形界面的软件。
参考文献:
(1)汤小丹,梁红兵,哲凤屏,汤子瀛计算机操作系统西安电子科技大学出版社
(2)胡志刚等.计算机操作系统.中南大学出版社,2005
(3)陈向群等.Windows内核实验教程.机械工业出版社,2004
(4)罗宇等.操作系统课程设计.机械工业出版社,2005
我所负责模块的结构
DiskDemo.java
packagecom.csu.disk.display;
importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.Container;
importjava.awt.Dimension;
importjava.awt.Font;
importjava.awt.GridLayout;
importjava.awt.Toolkit;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JMenu;
importjavax.swing.JMenuBar;
importjavax.swing.JMenuItem;
importjavax.swing.JPanel;
importjavax.swing.JSplitPane;
importjavax.swing.JTabbedPane;
importjavax.swing.JTextArea;
importjavax.swing.JToolBar;
importjavax.swing.UIManager;
importcom.csu.action.ToolBarAction;
importcom.csu.attemper.AttemperAlgorithm;
importcom.csu.disk.pojo.Message;