Skip to content

Latest commit

 

History

11 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

东北大学操作系统课设-文件系统

开发工具

  • Linux Ubuntu环境
  • vscode开发
  • CMake构建
  • C++ 17代码
  • GCC 11.4编译
  • Git版本管理
  • clang前端提示
  • clang-format统一代码风格

编译与运行

将代码项目clone到本地

git clone https://github.com/Dog-Du/NEU-OS-filesystem.git

进入项目文件夹

cd NEU-OS-filesystem

创建build目录

mkdir build && cd build

cmake构建项目

cmake .. -G"Unix Makefiles"

或者

cmake .. -G"Ninja"

编译

make

运行

./FileSystem

支持功能:

  1. Load 导入本地文件
  2. 硬链接
  3. 拷贝
  4. 重命名
  5. 移动
  6. 树状用户管理
  7. 随写随刷保证一致性
  8. 共享内存实现多进程共享
  9. 用信号量上超大粒度锁避免竞争

框架设计:

  • disk.cpp 封装磁盘操作
  • file.cpp 调用 disk.cpp 函数实现并封装文件操作
  • user.cpp 和 director.cpp 调用 disk.cpp 和 file.cpp 实现高级操作
  • 拓展功能只要在对应模块修改即可,代码复用高。高级操作基本不需要调用 disk.cpp 的函数
  • 目标是管理50MB的磁盘,当然也可以进行拓展。只需要在disk和file之间加一个缓冲池buffer再一层封装磁盘操作即可。
  • 这里为了简单,让内存和磁盘一对一,可以直接拷贝
  • 磁盘组织:[superblock(512bytes)][inode(MAX_BLOCK_NUMBER * 128bytes)][block(MAX_BLOCK_NUMBER * 4096bytes)]。具体配置信息可见head.h
  • superblock 存储一些必要信息,根目录/和存储用户信息用的inode以及超级栈
  • inode 节点128字节 block 块4096字节
  • inode和block不存储空闲与否的状态信息,用分组链表管理节点分配
  • 用户管理采用树状的结构,上级可以修改下级,下级不可以修改上级
  • 用file.cpp中的getBlock函数屏蔽多级索引,其他地方无需关心多级索引

缺点:

  • 头文件里面定义了过多函数还有全局变量
  • 没有让磁盘、文件和高级操作这三个模块解耦,存在一些依赖,导致高级操作很多包含在了directory.cpp中
  • 最开始写的时候没考虑链接,把文件名存在了inode节点中,导致后面写链接的时候很麻烦
  • 分配inode节点编号和磁盘的block的编号是一个编号。会导致一些inode节点和block块被浪费掉,正确做法应该是为inode节点和block节点分别维护一个成组链接结构,避免浪费; 或者让inode和block共用一个块。测试之后,发现最好情况是50MB可以用到48MB存储内容。
  • 文件夹在写的时候,忘记考虑本级.和上级..了,导致一些操作在使用的时候很别扭,不过倒是挺容易修改的,因为inode节点里面存着上一级目录的编号
  • 因为没有解析路径的部分,所以仅支持相对路径,并且仅支持..,不支持绝对路径和多级路径
  • 随写随刷,效率不佳
  • 多进程锁粒度非常大
  • 写操作忘记考虑了文件夹的情况,导致在main.cpp中使用了disk.cpp的函数
  • 代码基本没有考虑效率,只为了更快完成

吐槽

听某个老师说,二十多年前东北大学的操作系统课设就是这个~🤣

这课设,本来寻思给网上抄个的,找着个,然后寻思看看就完事了🤔

结果发现,代码复用率极低,特别多重复无用的代码,函数基本没考虑复用,一千行左右就能完成的任务,却用两千多行😇

指针要么不用,要么乱飞,看懂代码比自己写代码还难😭

所以我重新写了一个,经过比较多测试,bug相对较少,供后人参考🤓

本来寻思用 Rust 或者 Go 来写的,但是 Go 的指针用的太麻烦,而 Rust 用的不太熟练🤦‍♀️

最后还是觉得C/C++更方便写🤡

前面工具链看着挺多,其实都怪C/C++没有官方配套的工具链,要是Rust或者Go,只需要一个vscode,剩下的连Linux Ubuntu都不需要,自带跨平台能力🤩

当然指针强转型和调用Linux系统调用的时候unsafe乱飞就一用一个不吱声了😀

C/C++我真是又爱用又爱喷😡

About

东北大学操作系统课设文件系统。

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages