操作系统课程设计实验报告_第1页
操作系统课程设计实验报告_第2页
操作系统课程设计实验报告_第3页
操作系统课程设计实验报告_第4页
操作系统课程设计实验报告_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、华 南 农 业 大 学 信 息(软 件) 学 院操作系统课程设计成绩单开设时间:2010学年第一学期专业计算机科学与技术班级3学号58姓名林利民王广博实 验 题 目题目五:模拟磁盘文件系统自 我 评 价王广博:在这个实验里,我主要做出了整个项目的整体规划、GUI的设计、数据结构的设计以及部分方法的编写。在这个实验中,我感觉总体难度不是很大,关键方法只是利用递归实现目录树的分层,并没有让我真正学到一些新的知识,仅仅是在巩固已学过的知识。但我还是在这次实验中学会了如何更好地合作,我觉得对于这种小实验,如果一个人的话,也许会做得更快,但合作才是我们必须学会的东西。合作,就是要有一个比较厉害的人先站出

2、来,规划好整个项目的流程,然后在出现分歧的时候,要有一个人作出最终的拍案,否则将在分歧点上停滞不前。在本次实验中,我更深刻地理解了磁盘管理文件的工作原理,其次就是将这学期学的软件工程加以应用。林利民:在设计与实现模拟磁盘文件系统的过程中,我学到了很多的知识。首先很重要的一点是在写程序之前一定要多次地去阅读题目的要求,要对具体的要求有较好的理解,心里对于程序的具体实现要有一定的想法,要有模块化的思想,设计从上到下,实现从下到上。我主要偏重于文件操作部分的编写设计,在实现上我从队友那里学到了很多。在图形界面上,我则给予队友小小的帮助,写了磁盘使用情况的显示,FAT表和已打开文件表的显示。总的来说这

3、次的课程设计不是特别的困难,遇到的问题也不是特别地多,但是从中我学到了不少知识。教 师 评 语评价指标:l 题目内容完成情况 优 良 R 中 差 l 对算法原理的理解程度 优 良 R 中 差 l 程序设计水平 优 良 R 中 差 l 实验报告结构清晰 优 良 R 中 差 l 实验总结和分析详尽 优 良 R 中 差 成绩94教师签名张丽霞实验报告一、 需求分析这个程序主要通过模仿磁盘文件读取操作的过程,设计一个简单的文件系统,用文件模拟磁盘,用数组模拟缓冲区。实现了以下功能:(1) 支持多级目录结构,支持文件的绝对读路径。(2) 文件的逻辑结构采用流式结构,物理结构采用链接结构中的显示链接方式。

4、(3) 采用文件分配表:显示磁盘的使用情况。(4) 实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示文件内容、打开文件、读文件、写文件(追加方式)、关闭文件、改变文件属性。 我们对要求的理解:1文件的物理结构通过FAT表,选用链表分配。2建立文件:从命令中得到文件名,建立文件。修改目录表。3删除文件:回收文件占用的空间,修改目录表,模仿windows,删除文件时仅将文件占用空间回收,并没有将其内容致零。4读文件:文件名 显示的字节数 ,直接显示所需要的字节数。5写文件:文件名 插入的内容,按照指导书采用追加的方式6查询属性:显示、修改文件属性,文件名,类型等。二、 概要设计

5、public class FAT / public static char bad = 254;/坏盘块的值 public static char free = 0;/空闲盘块的值 public static char root = 2;/根目录的块号 public static char tail = 255;/文件结束的值 public static char fat = new char128;/定义一个FAT表 public static void init() / 程序初始化时,将FAT从磁盘文件中读出 public static void write() 将FAT表写回磁盘文件 p

6、ublic class MyFile /目录项 private String name;/文件名,长度为3个字节 private String type;/文件类型,长度为两个字节 private char attribute;/文件属性,一个字节 private char start;/起始盘块号 private char length;/文件长度public class OpenedFile /文件打开表项 private String filePath;/文件路径 private char attribute;/文件属性 private char start;/起始盘块号 private

7、 char length;/文件长度 private boolean writeAble;/打开方式 private char readBlockNum; /读文件块号 private char readBlockIndex; /读指针块内地址 private char writeBlockNum; /写文件块号 private char writeBlockIndex; /写指针块内地址public class OpenedFileList /文件打开表 public final static int maxSize = 5;/文件打开表最多能打开5项 public static List

8、ofl = new ArrayList();/文件打开表模拟文件系统创建文件删除文件读取文件写入文件查询属性显示内容显示目录创建文件夹FAT表打开文件关闭文件已打开文件表三、 详细设计主要函数操作:底层块操作类:public class BlockOperator public final static int blockSize = 64;/一个盘块64字节 public final static int numberOfBlocks = 128;/磁盘文件共有128个盘块 public static void init() /磁盘文件初始化 if: 已经存在磁盘文件 将FAT表从磁盘文件中

9、读出 return; 新建一个磁盘文件 byte b = new byte128 * 64;/创建一个大小为128*64字节的磁盘文件 初始化FAT表内容 For i from 0 to 64 : i+=8 b2*64+i = $; 将初始化内容写入磁盘文件 public static char read(int blockIndex) /读出指定盘块号的盘块内容 byte b = new byte64; RandomAccessFile raf = new RandomAccessFile(disk, r); 将读指针移动到要读取的盘块的首部 将盘块的内容读出 raf.close(); 将读

10、到的盘块内容返回 public static void write(char c, int blockIndex) /写入指定盘块号的内容 byte b = changeToByte(c); RandomAccessFile raf = new RandomAccessFile(disk, rw); 将写指针移动到要写的盘块的首部将内容写入盘块 raf.close(); public static int findAvailableBlock()/寻找空闲的盘块 for i from; to FAT.fat.length;i+ if FAT.fati=0: 返回空闲块号 返回无空闲块 文件操作

11、类:public class MyFileOperator public static void createDirectory(String paths, String fileName, int blockIndex) /创建目录 String path = null; if (如果路径中“/”后还有目录) path = 目录名 paths = 去掉path之后的路径 MyFile mf = read(blockIndex);/将父目录的盘块读出 if (没有子目录) if (要创建的目录没有与之重名的) 寻找空闲的目录项 if (没有空闲的目录项) 创建新的目录失败返回寻找空闲的盘块if

12、 (没有空闲的盘块) 创建新的目录失败返回 修改父目录的目录项 将父目录写回盘块 将新建的目录的目录项置为空并写入盘块 修改FAT表 else 有重名的,不能创建 else 寻找名为path的子目录 if (有名为path的目录) createDirectory(paths, fileName, (int) mfmatch.getStart();/向下递归 else 没有该目录,返回 public static void createFile(String absolutePath, String paths, String fileName, String type, char attrib

13、ute, int blockIndex) /创建文件 String path = null; if (如果路径中“/”后还有目录) path = 目录名 paths = 去掉path之后的路径 MyFile mf = read(blockIndex);/将父目录的盘块读出 if (没有子目录) if (要创建的目录没有与之重名的) 寻找空闲的目录项 if (没有空闲的目录项) 创建新的文件失败返回寻找空闲的盘块if (没有空闲的盘块) 创建新的目录失败返回 修改父目录的目录项 将父目录写回盘块 将新建的目录的8个目录项置为空并写入盘块 修改FAT表以写方式填写文件打开表 else 有重名,不能

14、创建 else 寻找名为path的子目录 if (有名为path的目录) createFile(absolutePath, paths, fileName, type, attribute, (int) mfmatch.getStart();/继续向下递归 else 没有该目录,返回 public static void openFile(String absolutePath, String paths, String fileName, String type, boolean canWrite, int blockIndex) /打开文件 String path = null; if (

15、如果路径中“/”后还有目录) path = 目录名 paths = 去掉path之后的路径 MyFile mf = read(blockIndex);/将父目录的盘块读出 if (没有子目录) if (要创建的目录没有与之重名的) if (以写方式打开 & 要打开的文件时只读文件) 不能以写方式打开只读文件,返回 if (如果已打开文件表中已经存在该文件) 不能打开已经存在的文件,返回 else 打开成功,填写已打开文件表 else 不存在该文件,返回 else 寻找名为path的子目录 if (有名为path的目录) openFile(absolutePath, paths, fileNam

16、e, type, canWrite, (int) mfmatch.getStart();/往下递归 else 没有该子目录,返回 public static void writeFile(String filePath, String buffer) /写文件 在文件打开表中寻找要写的文件 if (存在该文件) if (该文件不可以写) 返回 int writeIndex = 文件的写指针的块内地址 int writeBlockNum = 文件的写指针的块号 char fileLength = 文件长度 char c = BlockOperator.read(writeBlockNum);/将

17、要写入的盘块读出 for i from 0 to buffer.length(); i+ if (writeIndex = 64) /一块写完了 writeIndex = 0; /写指针置0 将已经写满的盘块写回磁盘文件 c = new char64; /申请新块, 寻找空闲的盘块 修改FAT表修改写指针的块号 fileLength+;/文件长度加1 cwriteIndex+ = buffer.charAt(i);/将buffer的内容写入盘块 Buffer的内容写完了,添加文件尾 将盘块写回 FAT.fatwriteBlockNum = (char) -1;/修改FAT表 将写指针的块号写回

18、打开文件表 将写指针的写指针写回已打开文件表 将文件长度写回已打开文件表 else 没有该文件,返回 public static void closeFile(String filePath) /关闭文件 在文件打开表中寻找要写的文件 if (存在该文件) int writeIndex =文件的写指针的块内地址 int writeBlockNum =文件的写指针的块号 char c = BlockOperator.read(writeBlockNum);/将要写入的盘块读出添加文件尾 BlockOperator.write(c, writeBlockNum);/写回块中 读出该文件父目录 修改

19、该文件的目录项的文件长度 将父目录写回盘块中 在已打开文件表中将该文件去掉 else 没有该文件,返回 public static String readFile(String filePath, int numOfChar) /读文件 在文件打开表中寻找要写的文件 if (存在该文件) if (该文件以写方式打开) 不能读写方式打开的文件 int readIndex = 该文件的读指针的块内地址 int readBlockNum = 该文件的读指针的块号 charc = BlockOperator.read(readBlockNum);/将要读的盘块从磁盘文件中取出 while(还有要读的字

20、节) if (readIndex = 64) /已经读完了一块 readIndex = 0;/读指针的块内地址置为0 readBlockNum = 取出要读的下一块盘块号 if (已经读到了文件尾) 返回读出的内容 c = BlockOperator.read(readBlockNum); /将要读的盘块取出 if (没有读到文件尾) 继续读下一个字节 else 已经到了文件尾了 返回读出的内容 将读指针的块内地址写回已打开文件表 将读指针的块号写回已打开文件表 返回读出的内容 else 没有该文件 返回空 public static String typeFile(String paths,

21、 String fileName, String type, int blockIndex) /显示文件 String path = null; if (如果路径中“/”后还有目录) path = 目录名 paths = 去掉path之后的路径 MyFile mf = read(blockIndex);/将父目录的盘块读出 if (没有子目录) 寻找要读出文件的目录项 if (找到该文件) int readBlockNum = 该文件的起始盘块号 一块一块地将文件内容读出 将读出的内容返回 else 没有该文件,返回空 else 寻找名为path的目录项 if (存在该目录项) typeFil

22、e(paths, fileName, type, (int) mfmatch.getStart();/继续向下递归 else 不存在该目录,返回 /修改属性: public static void changeAttribute(String paths, String fileName, String type, char attribute, int blockIndex) /调用了hasSameFile后再调用 String path = null; if (如果路径中“/”后还有目录) path = 目录名 paths = 去掉path之后的路径 MyFile mf = read(bl

23、ockIndex);/将父目录的盘块读出 if (没有子目录) 寻找该文件 if (找到该文件) 修改文件的目录项的属性 将父目录的盘块写回磁盘文件 else 不存在该文件,返回 else 寻找名为path的目录 if (找到该目录) changeAttribute(paths, fileName, type, attribute, (int) mfmatch.getStart();/继续向下递归 else 没有该目录 函数调用关系图:开始初始化文件表初始化磁盘分配表初始化打开文件表监听命令输入无创建删除读取显示属性写入查询列表关闭退出程序执行命令执行命令四、 调试分析1)算法的时间复杂度:目

24、录与文件的创建、删除、打开、关闭、查找等与目录结构有关的部分由递归实现,目录结构为一棵8叉树,复杂度约为O(8n)。2)经验与体会:王广博:通过本次的课程设计,使我能够正确运用操作系统课程中所学的基本理论和知识,加深了对文件系统基本概念的理解,以及磁盘文件系统的文件操作。还有让我感受挺深的是对软件工程方法的应用。设计一个软件,先要做好需求分析,这一点很重要,如果没有分析好需求,到软件设计的最后,发现所做的功能不符合要求,那么一切都得重做,前面所有的努力都付诸东流。在这次实验中,我觉得比较遗憾的是我并没有完全按照课本说的做,虽然有写出了一些数据结构以及底层函数,但并没有完整地画出E-R图以及程序

25、流图,只是在心里粗略打了个草稿而已,因此做到最后,感觉还不是那么完美,函数之间还是有存在部分的冗余成分,层次之间的调用也不是很明确。林利民:设计实现模拟磁盘文件系统我得到一个重要的经验是:整体结构要设计好,数据结构要定好,要有模块化的思想,设计要从上到下,实现要从下到上。3)遇到的问题及解决方法:a.新建一个文件后,父目录被意外的填充满了,其他空的目录项被填充成没有名字的文件,后来发现文件的属性要求两个字节,若是创建属性名少于两个字节是就会出现这种错误,后来加了一个循环把属性补到2个字节问题就解决了。b.作品在合成的时候,由于没有事先约定所传参数的格式,导致在使用对方的函数时出现错误,结果花了不少时间调试,后来经过双方讨论后才解决了。C.也是事先规划得不太好,结果方法中有很多冗余的成分,例如写递归的时候可以把递归的成分做成一个findFile函数,之后可以通过调用该方法得到目录项。五、 用户使用说明1)新建文件:创建新的文件有两种方式,第一种是在菜单栏中点击文件-新建-文件,在弹出的对话框中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论