当这门课助教,这门课的实验三和实验四都是我设计的。其中实验三虽然也是我设计的,但交给我同门负责了,因此实验三的代码我没有写,这里只放上实验四的代码(以及一些实验材料,课程结束后再放链接),但也会讲一下实验三的思路。
实验三 页面替换算法
本质就是模拟FIFO、LRU等经典算法,很简单,不详细说了(主要是忘了实验内容是什么了)~
实验四 文件系统
设计实验的过程
首先用一个固定大小的空白文件来模拟磁盘,在这个磁盘上仿照ext2文件系统建立一个自己的小型文件系统。这一步旨在让学生通过解决实际编码过程中遇到的问题来熟悉一个经典的文件系统,自己亲自设计才能更深刻地熟悉文件系统的结构和运作方式。此外,要求这个文件系统能够支持ls、创建指定大小文件和文件夹、删除文件和文件夹、移动文件等功能,这样一是可以通过检查这些功能是否正常运行来判断系统的正确性,二是可以锻炼学生的操作系统编程能力,考验他们的系统设计能力。该实验只要能较为合理地设计一个文件系统并实现上述指令,就可以算是通过,而不必完全实现一个ext2系统。另外,这里只考察对文件的索引,不涉及文件的实际内容(比如,创建文件时必须指定文件大小,以便文件系统提前为其分配好空间)。(这个实验是我2019年当助教时出的,2020年的OS课程实验采用了MIT的S6.081的第1、2、3、7个实验。但据老师说2019年学生对这个实验的反馈很好,因此2020年保留了这个文件系统的实验作为实验五,但是出于多方面的考虑把这个实验给简化了。2020版的实验去掉了所有与删除相关的功能,把难度降了一半;同时为了防止抄袭往届学长的实验,2020年规定使用统一给的模拟磁盘读写的接口,这一部分是由我的一个师弟完成的,我这里并没有用那个接口,懒得改)。完成这篇博客时已经是2020年,我自己的代码因此是包含了这两年的功能的(第二年加了copy指令),同时为了方便还实现了cd命令。
完成实验的思路
数据结构
块大小我定义成1024B。
#define _FILE_ 0
#define _FOLDER_ 1
#define DEVICE_SIZE (1<<22)
#define BLOCK_SIZE 1024
#define MAX_FILE_BLOCK_NUM 6
#define MAX_INODE_NUM 1024
索引节点:
对文件夹文件来说size是占用的块的数量,对普通文件来说是文件大小;link是指有多少文件与它关联,在删除时有作用(如果删除时发现link不为0说明还有其他进程在访问这个文件,这时只删除文件的逻辑结构,物理结构要等link为0才能释放),但其实在本系统中没有考虑它,这是个冗余位。
typedef struct inode {
// 32 bytes;
uint32_t size;
// for folder, it's the number of blocks it have;\
// for file, it's the real size.
uint16_t file_type;
// 1->dir; 0->file;
uint16_t link; // it doesn't matter if you \
// don't know what this variable means.
uint32_t block_point[MAX_FILE_BLOCK_NUM];
// the blocks belonging to this inode.
} inode