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
Load导入本地文件- 硬链接
- 拷贝
- 重命名
- 移动
- 树状用户管理
- 随写随刷保证一致性
- 共享内存实现多进程共享
- 用信号量上超大粒度锁避免竞争
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++我真是又爱用又爱喷😡