操作系统课程设计报告

设计题目:多用户、多级目录结构文件系统的设计与实现

班    级:

组长学号:

组长姓名:

指导教师:

设计时间:20##年7月

设计分工

组长学号及姓名:

分工:构建系统框架,实现磁盘i节点调入内存,以及内存i节点的申请分配与回收,新建文件和目录,文件的读写

组员1学号及姓名:

分工:实现成组链接法分配与回收,实现用户登陆和注销,实现格式化初始化函数,参与系统界面的设计

组员2学号及姓名:

分工:

组员3学号及姓名:

分工:

组员4学号及姓名:

分工:


摘要

文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。

关键词:操作系统,文件系统


摘要.................................................................................................................. 3

1概述............................................................................................................... 5

2课程设计任务与要求................................................................................... 6

2.1设计任务............................................................................................. 6

2.2设计要求............................................................................................. 6

3算法及数据结构........................................................................................... 7

3.1算法的总体流程................................................................................. 7

3.2超级块................................................................................................. 8

3.2.1功能........................................................................................... 8

3.2.2数据结构................................................................................... 8

3.2.3算法........................................................................................... 9

3.3磁盘i节点与内存i节点................................................................... 9

3.3.1功能......................................................................................... 10

3.3.2数据结构................................................................................. 10

3.3.3算法.......................................................................................... 11

3.4文件夹操作....................................................................................... 12

3.4.1功能......................................................................................... 13

3.4.2数据结构................................................................................. 13

3.4.3算法......................................................................................... 13

3.5文件的操作....................................................................................... 14

3.5.1功能......................................................................................... 15

3.5.2数据结构................................................................................. 15

3.5.3算法......................................................................................... 15

4程序设计与实现......................................................................................... 16

4.1程序流程图....................................................................................... 17

4.2程序说明........................................................................................... 17

4.3实验结果........................................................................................... 23

5结论............................................................................................................. 24

6参考文献..................................................................................................... 25

7收获、体会和建议..................................................................................... 26


1概述

UNIX采用树型目录结构,每个目录表称为一个目录文件。

一个目录文件是由目录项组成的。每个目录项包含16B,一个辅存磁盘块(512B)包含32个目录项。在目录项中,第1、2字节为相应文件的外存i节点号,是该文件的内部标识;后14B为文件名,是该文件的外部标识。所以,文件目录项记录了文件内、外部标识的对照关系。根据文件名可以找到辅存i节点号,由此便得到该文件的所有者、存取权、文件数据的地址健在等信息。UNIX的存储介质以512B为单位划分为块,从0开始直到最大容量并顺序加以编号就成了一个文件卷,也叫文件系统。UNIX中的文件系统磁盘存储区分配图如下:

                                                                                                                         

本次课程设计是要实现一个简单的模拟UNIX文件系统。我们在磁盘中申请一个二进制文件模拟UNIX内存,依次初始化建立位示图区,I节点区,数据块区。并给已打开的文件建立文件打开表。

本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。 首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。


2课程设计任务与要求

2.1设计任务

多用户、多级目录结构文件系统的设计与实现。

2.2设计要求

1、在深入理解操作系统基本原理的基础上,对于选定的题目,以小组为单位,先确定设计方案;

2、设计系统的数据结构和程序结构,设计每个模块的处理流程。要求设计合理;

3、编程序实现系统,要求实现可视化的运行界面,界面应清楚地反映出系统的运行结果;

4、确定测试方案,选择测试用例,对系统进行测试;

5、运行系统并要通过验收,讲解运行结果,说明系统的特色和创新之处,并回答指导教师的提问;

6、提交课程设计报告。


3算法及数据结构

3.1算法的总体流程


3.2超级块

3.2.1功能

     超级块位于块组的最前面,描述文件系统整体信息的数据结构,主要描述文件系统的目录和文件的静态分布情况,以及描述文件系统的各种组成结构的尺寸、数量等。

3.2.2数据结构

//超级块

#define NICFREE     50//成组链接法中的每组50块

#define NICINOD     50//超级块中空闲节点的最大块

typedef struct{

       unsigned short s_isize;//索引节点块块数

       unsigned long s_fsize;//数据块块数

       unsigned int s_nfree;//空闲块块数

       unsigned short s_pfree;//栈深

       unsigned int s_free[NICFREE];//空闲块堆栈

       unsigned int s_ninode;//空闲索引节点数

       unsigned short s_pinode;//空闲索引节点指针

       unsigned int s_inode[NICINOD];//空闲索引节点数组

       unsigned int s_rinode;//铭记索引节点

       char s_fmod;//超级块修改标志

}Filsys;

#endif

3.2.3算法


3.3磁盘i节点与内存i节点

3.3.1功能

linux中,文件查找不是通过文件名称来查找的。实际上是通过i节点来实现文件的查找定位的。我们可以形象的将i节点看做是一个指针。当文件存储到磁盘上去的时候,文件肯定会存放到一个磁盘位置上,i节点其实就是可以这么认为,把i节点看作是一个指向磁盘上该文件存储区的地址。事实上,i节点不仅包含了文件数据存储区的地址,还包含了很多信息,比如数据大小,等等文件信息。文件名是保存在一个目录项中。每一个目录项中都包含了文件名和i节点。我们可以通过一个图来看看目录项,i节点,文件数据四者之间的关系。

3.3.2数据结构

//内存i节点

#define NADDR     10//每个i节点最多指向10块

typedef struct inode{

       struct inode *i_forw;

       char i_flag;                                                                                               

       unsigned int i_ino;//磁盘索引节点编号

       unsigned int i_count;//引用计数   

       unsigned short di_number;//关联计数

       unsigned short di_mode;//文件模式

       unsigned short di_uid;//所属用户

       unsigned short di_gid;//所属用户组

       unsigned long di_size;//文件大小

       unsigned short di_addr[NADDR];//物理块号

}Inode;

//磁盘索引节点

#define NADDR     10//每个i节点最多指向10块

typedef struct {

       unsigned short di_number;//关联文件数

       unsigned short di_mode;//存取权限

       unsigned short di_uid;//所属用户

       unsigned short di_gid;//所属用户组

       unsigned long di_size;//文件大小

       unsigned short di_addr[NADDR];//物理块号

}Dinode;


流程图: 终止:     开始3.3.3算法


3.4文件夹操作

3.4.1功能

新建一个文件夹,文件夹的跳转,当前目录下的文件展示。对应的函数原型为:void _dir()//显示当前目录列表;

        void mkdir(char *dirname)//目录创建函数;

        void cd(char *dirname)//跳转到指定目录下;

3.4.2数据结构

//目录结构

#define DIRNUM      128//每个目录所包含的最大文件数

typedef struct {

       Direct direct[DIRNUM];//最大存储128个文件

       int size;//实际文件的个数

}Dir;

//目录项结构

#define DIRSIZ 14//每个目录项文件名所占字节数

typedef struct {

       char d_name[DIRSIZ];//目录名

       unsigned short d_ino;//目录对应的磁盘i节点编号

}Direct;


3.4.3算法

    总得来说就是根据目录的数据结构,再结合i节点去实现对文件夹的操作。

显示列表函数:因为我们的direct数据结构里每次保存的都是当前目录下的列表,所以调用_dir()函数就等于把当前direct结构里的文件名显示出来。

新建一个文件夹:创建一个目录时,先申请一个内存i节点,再分配相应的磁盘i节点,在当前目录表中进行登记,初始化自己的一些信息,记录该目录的上级目录,跳转的时候要用到。

文件夹跳转:因为在新建的时候已经把当前目录的上级目录给记录下来,所以只需找到上级目录的磁盘i节点信息,然后保存当前目录,调出上级目录的磁盘i节点,再重新显示上级目录的列表信息。


3.5文件的操作

3.5.1功能

新建一个文件,我们可以对其进行读、写、删除操作。关闭文件之后如果还想对其进行读、写、删除操作,那么我们就要重新打开文件,即将其i节点信息先调入内存。具体函数原型如下:

int create(int user_id,char *filename,short mode)//返回值代表用户打开文件的编号;

int open(int user_id,char *filename,short openmode){//从用户打开文件表找到系统打开文件表再找到文件的i节点;

void close(int user_id,int fd1)///修改一下系统打开文件表和用户打开文件表;

bool _delete(char *filename)//更新目录表,释放i节点;

int read(int fd1,char *&buf,int size)//读文件操作;

int write(int fd1,char *buf,int size)//文件内存i节点指针,数据,数据大小;

3.5.2数据结构

//系统打开表

#include"inode.h"

typedef struct{

       unsigned short f_flag;//文件操作标志

       unsigned int f_count;//引用计数

       Inode *f_inode;//指向内存索引节点

       unsigned long f_off;//读写指针

}File;

#endif

      


3.5.3算法

总得来说就是根据系统打开文件表去找到内存i节点指针,只有找到了内存i节点指针才能对文件进行操作。

创建一个新的文件:先查看要创建的这个名字是否存在,若存在就不允许在继续创建了,因为不允许重名是文件系统的基本要求。若不存在就说明允许创建此文件。先申请一个内存i节点,在当前目录表中进行登记,在系统打开文件表中也进行登记一下,返回该文件在系统打开文件表的位置,以便将接下来进行读写操作。

打开一个文件:当我们把一个文件关闭之后又想继续对此文件进行操作就必须先把文件的i节点信息调入内存。

关闭一个文件:当我们对一个文件读写完毕之后,不想再对此文件操作,出于保护的目的,防止别的用户找到我们的内存i节点信息,就需要我们把该文件的i节点信息从内存里注销掉,即关闭一个文件。

删除一个文件:更新目录表,释放i节点。释放i节点信息时还要考虑有没有被别的用户关联。

读一个文件:从系统打开文件表中获取内存i节点信息,找到其对应的文件物理块信息,将其读入到内存并显示出来。

写一个文件:从系统打开文件表中找到内存i节点信息,获取相应的物理磁盘块的分配情况以及文件的访问模式(涉及到权限问题),根据将要写入的信息的大小为其分配相应的磁盘块,写入之后保存。


4程序设计与实现

4.1程序流程图

流程图: 终止:   结束


4.2程序说明

运行程序,首先跳出界面为一个欢迎界面,如图4-1所示:

   

图4-1运行程序欢迎界面

点击确定进入用户登陆界面,如图4-2所示:(第一次必须格式化登陆)

图4-2用户登陆界面

格式化登陆后的界面如图4-3所示:

  图4-3用户操作界面

新建文件夹界面,如图4-3-1所示:

                     图4-3-1新建文件夹界面


    新建文件界面,如图4-3-2所示:(单选按钮一定要选到文件,然后再点击新建。本来想实现文件夹一个图片,文件一个图片,能力有限没有实现)

                     图4-3-2用户新建文件界面

    单击想要删除的文件夹,单击之后点击删除文件夹按钮,会弹出一个对话框,询问是否删除。点是就会删除,点取消就会取消。界面如图4-4所示:

图4-4删除文件夹操作界面

新建一个文件之后,我们可能要对其进行读、写、删除操作,单击文件会弹出功能对话框让你进行选择。例如我们新建了一个名字为su的文件,当我们单击这个文件的时候就会弹出一个界面,界面如图4-5所示:

             图4-5用户对文件操作功能选择界面

如果我们选择了写功能,就在目录右边的编辑框里输入我们想要写入的信息,写完之后点击输入完毕,即可保存。界面效果如图4-5-1所示:

                  图4-5-1写操作界面提示

如果我们选择了读功能,他会读出文件内容并显示在目录右边的编辑框里,这个时候我们可以在其后面追加信息,追加完毕之后点击输入完毕按钮,即可保存我们追加的信息,这个算是隐藏的功能。别如我们在写文件时对su这个文件写了“我是东北大学的一名学生”,在读的时候就应该读出刚才写的信息。界面如图4-5-2所示:

                 图4-5-2用户读文件界面

如果我们选择了删除文件的功能,那我们就会删除该文件,不在记录中出现。比如我们要删除su这个文件,点完确定之后再次显示该目录列表时就不会显示出su这个文件。界面如图4-5-3所示:

                 图4-5-3用户删除一个文件操作

停机按钮,是我们最后退出程序的时候,要对我们的信息进行一下保存。保存到相应的文件中,以便下次非格式化登陆时能读取出来信息。这个就不用界面来演示了。

隐藏的功能还有文件夹的跳转,这个我们在实现的时候就是想做到跟Windows一样双击文件夹进入文件夹里面显示里面的内容,然后我们根据MFC利用双击函数实现了类似Windows的文件跳转功能,这个地方有必要说明一下。

    另外,多用户登陆和切换用户这个地方也有实现,但是功能比较低级就不再演示。


4.3实验结果

    我们的系统基本实现了老师的要求,多用户下的多级目录,用户登陆和退出,系统的初始化,文件的创建,文件的打开,文件的读,文件的写,文件的关闭,删除文件,创建目录,改变目录,列出文件目录,格式化登陆,以及非格式化登陆。其实实验结果在程序说明的时候已经举出了实例,我们这里不再重复说明,只说在说明里没有提到的非格式化登陆一个用户。指定用户名3966,用户密码20123966。假定在main目录里创建一个文件夹3966,跳转到3966文件夹里,在3966文件夹里创建一个名字叫3966的文件(逻辑上是可以的,实际上我们也实现了),对这个文件进行写操作,写入“我们是东北大学的学生,来自计算机1206班,我们班的学生操作系统课设都做的可好了。我们是东北大学的学生,来自计算机1206班,我们班的学生操作系统课设都做的可好了。我们是东北大学的学生,来自计算机1206班,我们班的学生操作系统课设都做的可好了。我们是东北大学的学生,来自计算机1206班,我们班的学生操作系统课设都做的可好了。我们是东北大学的学生,来自计算机1206班,我们班的学生操作系统课设都做的可好了。我们是东北大学的学生,来自计算机1206班,我们班的学生操作系统课设都做的可好了。我们是东北大学的学生,来自计算机1206班,我们班的学生操作系统课设都做的可好了。(重复7遍,内容尽量多一点)”。停机之后,我们非格式化登陆,依然可以找到这些信息。这一点老师在验收的时候已经看到了,所以就不再继续展示了。


5结论

操作系统课程设计是本课程重要的实践教学环节。课程设计的目的,一方面使学生更透彻地理解操作系统的基本概念和原理,使之由抽象到具体;另一方面,通过课程设计加强学生的实验手段与实践技能,培养学生独立分析问题、解决问题、应用知识的能力和创新精神。与本课程的实验教学相比,课程设计独立设课,具有更多的学时,给学生更多自行设计、自主实验的机会,充分放手让学生真正培养学生的实践动手能力,全面提高学生的综合素质。

现代操作系统都有文件管理功能,通过本次操作系统的课程设计我对于C++语言中的磁盘文件输入和输出操作的运用有了很大的进步,基本搞懂了操作系统中文件的管理方法和文件的读取方式。同时也对于操作系统中的文件存取方式,文件的逻辑结构和文件在系统中的存储方法有了比较清晰的理解。在本次实验中开始的时候遇到了很多困难,比如对人文件的存储方式,怎样管理多用户下的文件都不了解,但是通过看书、网上查资料有了了解。通过开始的简单的实现一两个模块来慢慢的前进,最终基本实现了系统的设计,虽然还是有一些缺陷但是已经比较接近指导书上的要求。


6参考文献

1. 徐虹等编著.操作系统实验指导——基于Linux内核.北京: 清华大学出版社.2004.

2. 陈向群等编著. Windows内核实验教程. 北京: 机械工业出版社.2002.

3. 周苏等编著. 操作系统原理实验. 北京: 科学出版社.2003.

4. 张尧学编著. 计算机操作系统教程习题解答与实验指导. 北京: 清华大学出版社.2000.

5.MSDN帮助文档


7收获、体会和建议

    操作系统是计算机科学与技术领域中最为活跃的学科之一,因而操作系统课程也自然是计算机专业的一门核心专业基础课。操作系统课程内容综合了基础理论教学、课程实践教学、最新技术追踪等多项内容。但由于操作系统的高度复杂性,使得它成为专业课中最难学的课程之一。

通过对操作系统原理的学习,要求理解操作系统在计算机系统中的作用、地位和特点,熟练掌握和运用操作系统在进行计算机软硬件资源管理和调度时常用的概念、方法、策略、算法、手段等。

    操作系统课程概念多、内容广、难度大,抽象强。因此,操作系统课程的学习面临这样一些难题:如何形象化地学习和理解抽象的操作系统概念及原理,如何紧跟飞速发展的操作系统技术。为了解决这些问题,我们认为不但要学好操作系统原理,还要加强操作系统实验。操作系统实验可帮助学生理论联系实际,巩固和复习所学过的操作系统概念与原理;也增强学生的实践能力,培养学生的动手能力,提高学生综合分析问题和解决问题的能力。

    Linux是目前常用的流行操作系统之一,其最大的特点是开放源代码。使用Linux操作系统和分析¨nux内核代码是学习操作系统课程的很好选择。通过对Linux操作系统内核源代码的分析和实践,可以帮助学生对操作系统的用户界面和编程界面、体系结构、各组成部分的实现技术等,有更深入的整体认识;帮助学生进一步掌握操作系统原理。

Linux内核的学习可以分两个阶段:在Linux内核分析阶段,通过阅读Linux内核源代码,改变部分内核源程序,改变系统行为,从而学习操作系统各个组成部分的实现机理,巩固操作系统原理知识。在Linux内核改进阶段,通过深人、综合分析Linux操作系统的实现机理,通过一定规模的源代码重写,使Linux系统功能或行为产生实质性变化,这个阶段可以锻炼学生综合知识运用的能力。

   这次课程设计我们选择的是 Windows系统资源管理器与任务管理器。利用C++语言和MFC封装技术,编写程序,完成管理器的基本能。由于要实现的功能较多较复杂,而且对于MFC不太熟悉,刚开始的时候我们并没有很好的设计思路,但是上学期有过Windows编程学习的经历,所以上手也比较快,搜集了有关MFC编程的一些基本的框架,特别是窗体的设计和信息传递。一开始把程序设计复杂化了,感觉无从下手。后来通过查找资料和请教别人,了解了基本的实现框架,我们理清了设计思路。此次设计重要的是获取文件等信息,主要是内存映射以及使用MFC怎么实现。然而MFC的API很方便地提供了相应的文件操作封装。我们先按思路画出程序流程图,然后根据流程图分配任务。在领到自己的任务后,我们各自编写任务部分的代码。很多是我们不会或已经忘记了。所以刚开始时很焦急,有挫败感。但通过翻查老师给的代码,请教别人和不断调试,慢慢知道该怎么弄。最后我们把各自的代码放在一起进行整合和调试,在整合过程中,我们学习组内其他人找的代码。在完成整合过程中,我们最头痛的就是总是出现细小的编译错误,弄得我们很无奈,更觉得编程要很心细才行。最后终于通过了编译,可以实现功能,我们那一刻的喜悦是无法描述的。通过此次课程设计,不仅让我们学到了MFC编程的有关技巧,以及文件管理系统是怎么运行实现的,当然对于计算机系统的理解也是更上了一层。此次设计实践,更加的锻炼了我们的动手能力,理论与实际相结合的学习方式,同时也让我们各方面的能力得到了锻炼和提高。但同时我们深深感受到自己还有很多方面的不足,还需要掌握和学习更多的知识.我们要培养对编程的兴趣,多多动手练习,我们会更加努力的!

   建议:我们做的是在内存模拟Linux文件管理系统,所有的都是在内存操作,最后写入外存。这和老师讲的文件管理系统在实际上还是有些差别,希望老师们能带着我们真正的去对磁盘做分区处理,以便真正从物理上理解文件管理系统。

相关推荐