一种模拟文件系统的设计与分析

时间:2022-06-30 05:58:26

一种模拟文件系统的设计与分析

摘要:在深入研究了多个实用文件系统的功能和实现原理的基础上,用一个文件模拟硬盘,采用多级目录结构,对文件实行按名存取,利用超级块对系统资源进行管理,利用对i节点的操作来实现对文件的各种操作,从而实现了一个小型文件系统。

关键词:文件系统;索引节点;超级块

中图分类号:TP319文献标识码:A文章编号:16727800(2012)008008103

作者简介:何俊(1982-),男,硕士,中国船舶重工集团公司第七一二研究所助理工程师,研究方向为计算机控制和电力电子技术;李松谭(1985-),男,硕士,中国船舶重工集团公司第七一二研究所工程师,研究方向为计算机控制和单片机程序开发。

1系统设计的基本思想

如同一般的文件系统,这个模拟的文件系统也由一个超级块(super_block)来管理。超级块包含文件系统中的基本信息,如系统的容量,数据块的大小,文件名的最大长度,可用块表,可用i节点表,省去了一些不重要的数据成员,如超级块上锁标志等。超级块用来管理文件系统资源,而i节点则使用这些资源,每个文件或目录都对应一个i节点,但两者的i节点属性并不完全相同,鉴于此,系统并没有把文件和目录区别对待,在i节点的属性中有文件类型这一数据成员,对于类型为目录的文件,只需简单地将其数据块地址设为空。显然,这样简化了系统的设计。每个文件或目录都对应一个系统中独一无二的i节点编号。有了超级块和i节点,就可以在此基础上实现用户的操作命令,例如创建目录,只需超级块为之分配一个可用的i节点,并在当前工作目录的文件入口栏一项中添加这个i节点编号。文件系统的工作流程与流程描述如图1所示。

图1文件系统的工作流程

2文件系统的具体设计

2.1超级块的设计与实现

超级块的数据结构设计如下:

超级块(super_block)

class super_block{

public:

super_block();

~super_block();

const int get_fs_size() const;//返回文件系统大小,即“硬盘”大小

const int get_block_size() const;//返回块的大小

const int get_max_file_num() const;//返回最大文件数

const int get_max_fn_len() const;//返回文件名的最大长度

int get_free_block();//取一个未用块

int get_free_inode() ;//分配一个i节点

const bool get_modified() const;//超级块是否被修改,本系统未用

void change_modified();//设置修改标志

const bool get_lock() const;//超级块是否上锁,本系统未用

void change_lock();//改变上锁标志

void add_free_inode(int inode_num);//回收i节点

void add_free_block(int block_num);//回收块

int get_bt_size();//返回系统中可用块的数目

int get_it_size();//返回系统中未用i节点的数目

void print();//显示文件系统相关信息,供调试用

private:

const intFS_SIZE;//文件系统的容量,即“硬盘”大小

const intBLOCK_SIZE;//块(用于存放文件数据)大小

const intMAX_FILE_NUM;//最多可容纳的文件数

const intMAX_FN_LEN;//文件名的最大长度

vector<int>free_block_table;//存储可用的块编号

vector<int>free_inode_table;//存储可用的i节点号

boolis_modified;//文件系统修改标志

boolsuper_lock;//文件系统上锁标志}

超级块中包含了文件系统的基本信息,如文件系统的容量、块大小、最多可容纳的文件数等。磁盘空间的管理也是通过超级块来实现的,当新建一个文件或者目录时,超级块为新建的文件或目录分配一个新的i节点号,如果是正规文件,还要为其分配一定的数据块,而如果是目录则不用分配数据块。分配过后,从vector中删除已经分配的i节点号与数据块编号。删除文件或目录时则刚好与其相反,收回原有文件或目录的i节点号与数据块编号,这样就完成了简单的磁盘管理。

超级块作为系统资源的管理者,包含了文件系统的基本信息:如表1所示。

2.2i节点的设计与实现

本文件系统包含的文件分为两类,正规文件与目录文件。

表1超级块属性

为了对文件实现良好的操作,在设计时决定了为每个文件都分配一个独一无二的i节点项,这个i节点项中包含了两个大的方面即:i节点号与文件属性。

i节点项的数据结构设计如下:

i节点(inode)

class inode{

public:

inode();

inode(const inode& in);

~inode();

const int get_id() const;//获取i节点号

void set_id(int new_id);//设置i节点号

const string get_owner() const;//取文件属主

上一篇:C语言的指针解析 下一篇:软件工程在运动会成绩管理中的应用与实践