操作系统课程设计说明书_第1页
操作系统课程设计说明书_第2页
操作系统课程设计说明书_第3页
操作系统课程设计说明书_第4页
操作系统课程设计说明书_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、中北大学操作系统课程设计说 明 书 学 院、系:软件学院专 业:软件工程学 生 姓 名:学 号:设 计 题 目:模拟文件系统的设计与实现 起 迄 日 期:2016年12月21日- 2017年1月4日指 导 教 师:   2016年12月20日1、 需求分析1.1课程设计题目和目的通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识,加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的力。1.2 课程设计要求 通过课程设计,要求学生主要掌握以下内容:a.文件的物理结构可以选用顺序分配

2、,链表分配或索引分配。b.建立文件:从命令中得到文件名,得到该文件的文件长度,建立文件修改目录表。c.删除文件:回收文件占用的空间,修改目录表d.读文件:read文件名显示开始字节显示的字节数,直接显示所需要的字节数。e.写文件:write文件名插入的位置插入的内容f.查询属性:显示文件属性,文件名,类型,长度,时间等。1.3程序设计思想 此课程设计把TXT文件作为研究对象来模拟操作系统的文件系统的文件系统工作过程。所以用一个字符串数组来模拟磁盘空间,顾名思义,模拟磁盘提供字符的存储服务。磁盘空间分配表,采用链表结构,每个节点保存模拟磁盘的一个逻辑块的信息,包括块的最大长度,文件占用长度,占用

3、标志。如果占用标志为0,即该空间可分配给文件。初始化磁盘空间时,从头开始遍历,检查占用位,如果该块位可分配,则检查块大小,若块长度大于或者等于申请空间的大小,则把块的前一部分(等于申请大小)分配给文件,并置标志位为占用。剩下的大小做来一个新块,做来一个新的节点插入到原节点的后边,标志位为可用。这样就实现了模拟磁盘的线性分配。 文件表,由于模拟文件系统的文件数量不多,故文件表采用线性表来存储。线性表每个节点存储一个文件的信息。打开文件表,采用数组形式存储打开的文件,数组每个元素保存一个打开文件的信息。文件信息和文件表中的文件信息类似。构造这些实体的关系图,数据流图。程序流程图来进行具体的设计。1

4、.4实验环境 eclipse+jdk1.6.0_10二、总体设计 2.1系统流程 开始输入用户名Y输入的用户名为空N用户登录成功,创建用户根目录用户进行各项操作, 包括目录的创建粘贴和删除以及文件的相应操作,等等Y用户是否进行注销并切换到其他用户文件夹N用户退出结束 图文件结构 采用类似于树状的结构。用户二(以用户名命名)用户一(以用户名命名)File111Dir1Dir2Dir3File2Dir4Dir5File3.Dir7Dir6 图实现操作-以下为显示和跳转操作- ls 显示文件目录 cd dirname: 跳转到指定目录 cd . 跳转到上层目录 -以下

5、为目录操作- mkdir dirname:创建目录 ptdir dirname:粘贴目录 cpdir dirname: 拷贝目录 rnmdir dirname:重命名目录 rmdir dirname:删除目录 -以下为文件操作- vim filename:创建文件 ptfile filename:粘贴文件 cpfile filename:拷贝文件 rnmfile filename:重命名文件 rmfile filename:删除文件 vi filename:显示文件内容 -以下为退出该系统操作- exit -以下为用户切换操作- logout 注销 login username 以该用户的身份

6、登录 add username 添加新的用户并登录 - 2.4数据结构Src文件结构用户类数据结构AllUser.java:维护着一个包含所有用户的Map,单例模式,用户唯一。文件类数据结构:MyFile.java磁盘块类数据结构:MyDiskBlock.java 磁盘类数据结构:MyDisk.java 目录类数据结构:MyDir.java2.5模块详解(流程图) 2.5.1.文件创建开始创建文件输入文件名称Y文件名称是否为空N创建文件失败是否存在同名文件N成功创建文件结束 图.2文件编辑开始编辑文件输入文件名称该文件是否存在Y进行编辑,点击回车保存内容N为其分配磁盘空间,循环

7、更新父节点大小编辑成功结束 图.3显示文件内容 开始输入文件名称该文件是否存在NDY显示文件内容失败成功显示该文件内容结束D 图.4文件删除开始删除文件输入文件名称N该文件是否存在Y删除失败删除成功循环更新父节点大小结束 图.5文件重命名开始输入文件名称N该文件是否存在YY输入新文件名重命名失败是否存在同名文件AYYN新文件名是否为空AN文件重命名成功结束 图2.5.5三、详细设计 1.进入模拟文件系统 图3.1.1 2.创建用户 输入用户名之后点击回车,即可成功创建用户根文件夹,此文件夹名称即为用户输入的用户名输入help即可查看相关帮助信息

8、图3.2.1 3.清屏 如果感觉屏幕输入信息较为繁杂,影响后续输入,可以输入cls进行清屏(注:此处的清屏为假清屏,实际上是在控制台打印了30个空的换行,因为未能找到jdk中可以进行控制台清屏的方法) 图3.3.1 4.显示文件输入vi sun即可把文件显示出来代码实现: else if (s.startsWith("vi") && s.length() > 3) / 显示文件内容,1String filename = s.substring(3, s.length();MyFile a = nowdir.getFile(filename);if (a

9、 != null) ArrayList<MyDiskBlock> list = a.getBlocklist();StringBuffer all = new StringBuffer();for (MyDiskBlock one : list) all.append(one.getContent();System.out.println(all); elseSystem.out.println("文件名称输入有误"); 图3.4.15.复制和粘贴文件 图示如下,在根目录下创建了两个目录ln和linan,同时在ln目录中创建了一个名为sun的文件,在文件中输入了

10、“first”的内容。之后输入cpdir ln将ln目录复制到剪切板中,在进入linan目录之后,输入ptdir指令将剪切板中的ln目录粘贴到linan目录中,可以看到目录的大小也随之更新,为确保该目录已经成功复制而不是简单的引用(包括其下的所有文件),以下进行验证进入linan/ln目录,可以看到sun文件,同时打开该文件进行编辑,输入“ 我是小太阳”等字样,保存退出,再进入根目录下的ln,显示其中的sun文件中的内容,发现依然是“first”而没有被修改为“我是小太阳 ”说明目录确实复制成功而非简单的引用代码实现:复制: else if (s.startsWith("cpfile

11、") && s.length() > 7) / ->文件复制,1String real = s.substring(7, s.length();MyFile a = nowdir.getFile(real);if (a != null) filesave=new MyFile();filesave = a;System.out.println("复制文件到剪切板成功"); elseSystem.out.println("对不起,文件名输入有误");粘贴:else if (s.equals("ptfile&q

12、uot;) / ->文件粘贴,1if (filesave != null) ArrayList<MyDiskBlock> fileblocklist = filesave.getBlocklist();if (nowdir.canPasteFile(filesave) / 判断目录下是否有同名文件StringBuffer realcontent = new StringBuffer();for (MyDiskBlock one : fileblocklist) realcontent.append(one.getContent(); / 先将文件中的StringBuffer全

13、部拷贝出来int point = 0;ArrayList<MyDiskBlock> newFileBlocklist = new ArrayList<MyDiskBlock>(); / 创建新的磁盘块列表用来存放这个StringBufferint blocksize = MyDiskBlock.getSize();int sizecount = 0;ArrayList<Integer> thenw = new ArrayList<Integer>();if (realcontent.length() > blocksize) for (in

14、t i = 0; i < realcontent.length()- blocksize; i = i + blocksize) StringBuffer op = new StringBuffer(realcontent.substring(i, i + blocksize);MyDiskBlock newblock = new MyDiskBlock(op);MyDisk.getInstance().addUsed(newblock); /thenw.add(newblock.getId();newFileBlocklist.add(newblock);point = i;sizec

15、ount+;StringBuffer rest = new StringBuffer(realcontent.substring(point + blocksize,realcontent.length();sizecount+;MyDiskBlock ano = new MyDiskBlock(rest);MyDisk.getInstance().addUsed(ano); / 修改后的内容保存到磁盘,一定要先保存到磁盘,在分配好磁盘号之后,再保存到文件thenw.add(ano.getId();newFileBlocklist.add(ano); / 保存到文件 else StringBu

16、ffer shortone = new StringBuffer(realcontent.substring(0,realcontent.length();MyDiskBlock one = new MyDiskBlock(shortone);sizecount+;MyDisk.getInstance().addUsed(one);thenw.add(one.getId();newFileBlocklist.add(one);MyDir save2 = new MyDir();save2 = nowdir;while (nowdir.getFatherDir() != null) nowdir

17、.addnew(thenw);nowdir.updateSize();nowdir = nowdir.getFatherDir();nowdir = save2;MyFile anoth = new MyFile(filesave.getName(); anoth.setBlocklist(newFileBlocklist);anoth.setNewsize(filesave.getNewsize();anoth.setOldsize(filesave.getOldsize();nowdir.addFile(anoth); elseSystem.out.println("该目录下已经

18、有同名文件,不能粘贴");elseSystem.out.println("剪切板中没有文件"); 图3.5.1四、心得体会 经过俩周的课程设计,使我对操作系统有了更深的了解,进一步掌握了对操作系统的运用。 文件系统的编写过程中遇到了或大或小的问题,尤其在文件复制的操作中因为对剪切板中对象的误操作导致出现了非常奇怪的问题,几近奔溃,最终 debug用时两个小时最终找到了问题的根源。文件系统最终能够顺利完成离不开 debug时的细心和耐心。同时在代码的编写过程中,使用了单例和原型这两种设计模式,对设计模式的理解更近了一步。当然,此文件系统也存在不足之处,如因为各个用户之间的目录文件相互独立,使用户的文件无法实现共享,对共享的文件在磁盘上磁盘块的分配也是需要考虑的问题;缺少超级管理员,缺乏对不同

温馨提示

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

最新文档

评论

0/150

提交评论