操作系统实验报告
3.3核心算法
bool Format(void); //格式化
bool install(void); //装载虚拟硬盘的数据 void login(void); /用户登陆
void showMenu(void);//显示功能菜单
bool onAction(void);//用户选择功能并执行
void showDir();//显示当前文件夹里面文件的信息 void logout();//注销
void createFile(string str);//创建文件 void createDir(string str);//创建文件夹 bool read(string str);//读取文件 void editFile(string str);//编辑文件
11
操作系统实验报告
int visit(string str);//打开一个文件夹 void attrib(string str);//显示文件属性 void Delete(string str);//删除一个文件 int rename(string str);//重命名一个文件
3.4数据结构
/*---------常变量------*/
const unsigned int BLOCK_SIZE=512; //块长
const unsigned int DATA_BLOCK_NUM=512; //数据块数量
const unsigned int DINODE_START=4*BLOCK_SIZE; //inode起始位置 const unsigned int DINODE_SIZE=512; //inode大小 const unsigned int DINODE_NUM=32; //inode数量
const unsigned int DATASTART=(2+DINODE_NUM)*BLOCK_SIZE; //数据区的开始地址
const unsigned int ACCOUNT_NUM=10; //用户数量
/*inode结构体*/ struct inode{ unsigned short di_tag; /*inode标识*/
unsigned short di_number; /*关联文件数,当为0时表示删除文件,如一个目录至少包含两个文件:\和\ unsigned short di_mode; /*存取模式:0为目录,1为文件*/
unsigned short di_userID; /*当前inode所属用户 0为根目录ID,一次下去是管理员目录、用户目录*/ unsigned short di_access; /*访问权限 0为不允许普通用户访问(公共目录),1为允许普通用户访问*/ unsigned short di_size; /*文件大小,目录没有大小,值为0*/ unsigned short di_ctime; /* 创建时间 */ unsigned short di_mtime; /* 最后一次修改时间*/ unsigned short di_block[DATA_BLOCK_NUM]; /* 数据块块地址编号 */ };
/**超级块***/ struct super_block{ unsigned short s_inodes_count; /* 文件系统中inode的总数 */ unsigned short s_blocks_count; /* 数据块总数 */ unsigned short s_r_blocks_count; /* 保留块总数 */ unsigned short s_free_blocks_count; // 空闲块总数 unsigned short s_free_inodes_count; /* 空闲的inode总数 */ unsigned short s_log_block_size; /* block 的大小 */
12
操作系统实验报告
};
/**账户信息**/ struct user{ unsigned short user_id; //用户ID unsigned short user_access; //权限 string username; //用户名 string password; //密码 };
/**文件/目录结构**/ struct directory{ string name; /*目录名*/ unsigned short d_ino; /*目录号*/ };
四、调试分析
4.1运行环境
编译平台:Microsoft Visual Studio 2010 运行平台:win7/xp
4.2调试分析
五、缺点及改进
5.1实验缺点
由于对Linux的文件系统理解不够深刻,导致程序在一些原理上的迷糊不清,而时间较短,因此采取了简化或者放开的方法。在写程序的开始,也没有做详细的规划,而且是四个人分工协作,因此在程序的结构上有些混乱。在后期做了一些调整,但是整体还是有缺陷的。
另外,程序只是很简单的模拟了Linux的文件管理系统,只有一些非常简单的功能,而且功能考虑的也不尽全面、严谨,难免会出现一些Bug,另外,我们整体在写的时候是用的C++的写法,但是在编写的时候,又混用了c的一些方法,所以,整个程序更加混乱,给阅读理解带来非常大的困难。
13
操作系统实验报告
5.2实验改进
首先,我们先要把一些原理知识搞清楚,其次,做一个统一的项目规划,做好一些定义的声明,结构再清晰一些。更深层次的模拟Linux文件管理系统,将一些函数的考虑更加严谨、全面,多次调试,减少一些bug。尽量用规范的C++语言才编写,注清函数功能,便于相互分享调用阅读。
六、实验总结
本实验是模拟Linux文件管理系统,而我们平时很少接触到Linux系统,只是在书上学了一些理论的皮毛,纸上得来总觉浅,因此在开始做的时候,感觉无从下手,只能去网上去查找一些相关知识,以及看老师给的例子,并且和其他组就行讨论,这个时间花了一天半的时间,但是成果不是很好,很多地方都不明白。但是时间紧迫,我们就边做边理解、讨论,这样造成一个非常大的困难,不知道从哪里下手,只能模仿着做,加深理解。在两天的仓促的时间里面,我们做出了一个简单可行的模拟文件系统,虽然问题不少,但是在时间的允许下,我们还是不错的。 在编程中,我们遇到了很多以前没有遇到的问题和知识,在通过相互讨论,上网查询等方法后,我们解决了大部分的问题,对C++语言的理解也加深了很多,对一个项目的需求也理解很多,一个合理的规划会提高不少效率。
七、参考文献
《C++程序设计》 《算法与数据结构(第二版)》 《操作系统教程(第四遍)》
清华大学出版社 谭浩强
高等教育出版社 张乃孝 高等教育出版社 孙钟秀
8.2源程序
#include
/*---------常变量------*/
const unsigned int BLOCK_SIZE=512; //块长
const unsigned int DATA_BLOCK_NUM=512; //数据块数量
const unsigned int DINODE_START=4*BLOCK_SIZE; //inode起始位置
14
操作系统实验报告
const unsigned int DINODE_SIZE=512; //inode大小 const unsigned int DINODE_NUM=512; //inode数量
const unsigned int DATA_START=(2+DINODE_NUM)*BLOCK_SIZE; //数据区的开始地址 const unsigned int ACCOUNT_NUM=10; //用户数量 const unsigned int DIRECTORY_NUM=12; //每个目录最多允许拥有的子目录和文件 const unsigned short FILE_NAME_LENGTH=20; //最大文件名长度
/************************** inode结构体
**************************/ /*inode结构体*/ struct inode{
unsigned short di_tag; /*inode标识*/
unsigned short di_number; /*关联文件数,当为0时表示删除文件,如一个目录至少包含两个文件:\和\ unsigned short di_mode; /*存取模式:0为目录,1为文件*/
unsigned short di_userID; /*当前inode所属用户 0为根目录ID,一次下去是管理员目录、用户目录*/ unsigned short di_access; /*访问权限 0为不允许普通用户访问(公共目录),1为允许普通用户访问*/ unsigned short di_size; /*文件大小,目录没有大小,值为0*/ unsigned short di_ctime; /* 创建时间 */ unsigned short di_mtime; /* 最后一次修改时间*/ unsigned short di_block; /* 数据块块地址编号 */ };
/*————————————————————————
超级块结构
————————————————————————*/ struct super_block{ unsigned short s_inodes_count; /* 文件系统中inode的总数 */ unsigned short s_free_inodes_count; /* 空闲的inode总数 */ unsigned short s_blocks_count; /* 块总数 */ unsigned short s_r_blocks_count; /* 保留块总数 */ unsigned short s_free_blocks_count; // 空闲块总数 unsigned short s_log_block_size; /* block 的大小 */
// unsigned short s_free_blocks_group[GROUPNUM];//新增 一个数组来记录每个数据块组中的空闲数据块计数
// unsigned short s_first_data_block; /* 第一个数据 block */
// unsigned short s_blocks_per_group; /* 每 block group 的 block 数量 */ // unsigned short s_inodes_per_group; /* 每 block group 的 inode 数量 */
15