基于C++实现的构建二级文件模拟系统

TrueLove

发布日期: 2018-11-17 22:59:43 浏览量: 1437
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

1 需求分析

  • 题目:构建二级文件模拟系统

  • 题目说明:使用一个普通的大文件(如 c:\myDisk.img ,称之为一级文件)来模拟 UNIX V6++的一个文件卷

一个文件卷实际上就是一张逻辑磁盘,磁盘中存储的信息以块为单位。每块 512 字节。

  • 磁盘文件结构:定义自己的磁盘文件结构,SuperBlock 结构,磁盘 Inode 节点结构,包括:索引结构,及:逻辑块号到物理块号的映射,磁盘 Inode 节点的分配与回收算法设计与实现,文件数据区的分配与回收算法设计与实现

  • 文件目录结构:文件目录结构,目录检索算法的设计与实现

  • 文件打开结构: 选做

  • 磁盘高速缓存:选做

  • 文件操作接口:

    1. // 格式化文件卷
    2. void fformat();
    3. // 列目录
    4. void ls();
    5. // 打开文件
    6. int fopen(char *name, int mode);
    7. // 关闭文件
    8. void fclose(int fd);
    9. // 读文件
    10. int fread(int fd, char *buffer, int length);
    11. // 写文件
    12. int fwrite(int fd, char *buffer, int length);
    13. // 定位文件读写指针
    14. int flseek(int fd, int position);
    15. // 新建文件
    16. int fcreat(char *name, int mode);
    17. // 删除文件
    18. int fdelete(char *name);
  • 主程序:初始化文件卷,读入 SuperBlock;图形界面或者命令行方式,等待用户输入;根据用户不同的输入,返回结果

  • 主程序输入及其范围:主程序采用命令行输入,输入相关指令,可以操作文件系统指令范围是:

  • 输出形式:

输出形式按照如上设计

  • 程序功能:初始化文件卷,读入 SuperBlock;命令行方式,等待用户输入;根据用户不同的输入,返回结果

2 概要设计

2.1 主要数据类型的定义

数据类型基本根据 Unix V6++源码设计成结构体,考虑到系统比较小,所以方法直接采用外部函数,保留其命名与参数设定。

2.1.1 外存索引节点(DiskINode)的定义

2.1.2 SuperBlock 的定义

2.1.3 DirectoryEntry 的定义

2.1.4 内存索引节点(INode)的定义

2.1.5 缓存控制块 buf 定义

2.1.6 Kernel 类的定义

2.1.7 参数设定

  • 一级文件:‘myDisk.img’

  • 磁盘 inode 节点最多 2048 个

  • 磁盘中存储的信息以块为单位。每块 512 字节

  • 最多同时打开的文件个数设置为 20

  • 缓存控制块的个数为 23

2.2 主程序流程

2.2.1 类图

2.2.2 主程序流程图

  • main.cpp 是用户输入控制源文件

  • filesystem.h 是文件系统的结构体,参数,函数头文件

主程序流程图如下:

3 详细设计

主要函数的流程调用关系图如下:

  1. //列出 name 路径下的所有文件
  2. void ls(char *name);

  1. //以 mode 模式打开 name 文件
  2. int fopen(char *name, int mode);

  1. //以 mode 模式创建 name 文件
  2. void fcreat(char *name, int mode);

  1. //删除 name 文件
  2. void fdelete(char *name);

  1. //移动文件指针
  2. int fseek(int fd, int offset);

把 kernel 的对应的 openFiles 类的 i_offset 改成 offset 即可。

  1. //从文件中读取
  2. int fread(int fd, void *buffer, int len);

  1. //向文件中写入
  2. int fwrite(int fd, void *buffer, int len);

  1. //关闭文件
  2. void fclose(int fd);

更改 kernel.openFiles[fd].i_flag,以及更新 inode 即可。

4 调试分析

4.1 最后的测试

测试截图如上,功能正确无误。

4.2 问题与解决

在具体的模块设计与代码编写的时候,我出现过以下问题:

  • String 与 char [] 使用混乱,导致指针出现错误,后来统一了设计才解决 这个 bug

  • 一开始的设计值设计了指令的绝对路径参数,没有考虑指令参数中的相对位置,考虑到实际情况有相对路径的参数,所以我在 main.cpp 的 main 函数中每个模块都加入了路径讨论:是相对路径还是绝对路径?

5 实例分析

在你的 volumeFile 文件模拟的文件系统中,依次执行下列操作:

  • 新建文件/test/Jerry

  • 打开该文件

  • 写入 800 个字节

  • 将文件读写指针定位到第 500 字节

  • 读出 20 个字节

实例分析:进入用户输入界面,输入 test 指令进行实例分析。实例分析如下图:

  • 首先调用 ls,输出目前的目录情况

  • 然后创建 test 文件夹以及 Jerry 文件

  • 外部读取 test,txt 文件(800 字节)入缓存,缓存数据写入 test/Jerry

  • 将指针移动到文件的 500 字节位置,读出 20 个字节

  • 因为我的 800 字节的 txt 文件是 0123456789 十个字符循环 80 次得到的,所以移动 500 字节后取 20 字节的结果就是 01234567890123456789,与输出结果一致吻合,实例分析正确

流程图如下:

6 用户使用说明

本项目的开发环境是 Windows 10, Dev Cpp, 其中包括以下文件:

  • filesystem.h 头文件

  • main.cpp 源文件

  • makefile.win makefile 文件

  • myDisk.img 模拟磁盘,一级文件

  • os.dev Dev-cpp project 文件

  • os.exe 可执行文件

  • test.txt 预设的 800 字节文件

  • test1.txt 测试文件

用户只要打开 os.exe 文件就会进入文件系统,界面如下:

  • 首先进行初始化设定,创建 superblock,写入 1024 字节,创建 inode, 构建如图所示的 5 个根目录

  • 命令行形式,等待用户输入指令,初始界面是指令介绍

  • 输入指令,开始你的文件系统之旅吧。。。。。。。

7 实验总结

本次实验在理论基础上,实现虚拟二级文件系统,在实现过程中,梳理了一遍课本知识,总的来说,文件系统出现是为了解决多用户存储、管理信息时出现的问题。

用户所有的操作都是基于逻辑文件的,文件系统最终需要将用户对逻辑文件的操作 转换成对物理文件的操作。物理文件可以是在存储设备上的存储区域,也可以使一 个设备、管道、套接字,文件系统将用户对文件的操作转换成用户对设备的操作、用户间的通信操作和网络操作。在实现过程中,我对目录管理,文件存储空间管理,unix v6++的文件系统模块类结构有了更深入的了解。

遇到的问题主要还是设计思路与编程的细节问题。一开始我是按照(或者照抄) unix 源码的思路,但是随着代码解读的深入,很多源码的功能与成员函数其实在本实验中并不需要,也过于复杂,为此我走了很多弯路,最后放弃照抄源码,改成在自己理解的基础上实现了系统。编程的细节问题就是自己不好的代码习惯导致的。比如对于字符数组的不理解,对于 string 与 char *的混乱,还有就是目前长期 python 语言的编程导致自己对于 c++/c 语言编程的不熟悉,比如 C 语言中的函数,有着严格的顺序限制,如果要调用函数,该函数需要在本次调用之前就需要被实现,或者在程序开头事先声明,而 Python 中则没有这个限制,Python 中还有高阶函数这一概念,即函数名也可当作函数参数,函数名也是一种变量,指向内存中的某个函数,这种写法可以大大减少代码长度。我在编程的时候,由于没注意这个函数的位置,导致一直报错,最后看到了 python 与 c 语言的区别才改正了这个错误。

最后,对于本次课设与上学期理论课程的认知,我觉得上学期最后期末学的文件系统其实还不太够(至少我自己学的很不透彻),然后做课设的时候处处碰壁,不得不重新读教材,所以我觉得可以在大三上学期理论课的实验中提前加加入一点文件系统的内容,方便学生大三上做课设的时候及时上手。

最后,还是感觉自己对于 unix 源码的理解不够,所以导致最后做的课程设计其实比较坎坷,同时在最近找工作面试中也经常被问操作系统的问题,所以暑假还是要继续读操作系统课本以及源码。

参考文献

[1] 操作系统原理(讲义) [M]. 同济大学计算机系. 2017(09): 293-335

[2] 构造嵌入式 Linux 的文件系统[J]. 郑桦, 刘清, 邢航, 徐智穹. 微计算机信息. 2004(08)

[3] UNIX 操作系统的发展[J]. 荣广颐. 微电子学与计算机. 1989(02)

[4] UNIX 操作系统分析报告[J]. 刘日升, 孙玉方. 计算机研究与发展: 1982(09)

上传的附件 cloud_download 基于C++实现的构建二级文件模拟系统.7z ( 1.76mb, 72次下载 )
error_outline 下载需要8点积分

发送私信

放空的心,是最好的礼物;独走的路,是最美的风景

9
文章数
14
评论数
最近文章
eject