广东工业大学操作系统课程设计报告书.docx
《广东工业大学操作系统课程设计报告书.docx》由会员分享,可在线阅读,更多相关《广东工业大学操作系统课程设计报告书.docx(16页珍藏版)》请在冰点文库上搜索。
广东工业大学操作系统课程设计报告书
课程设计
课程名称操作系统
题目名称文件系统
学生学院计算机学院
专业班级计算机科学与技术10级8班
学号
学生姓名
指导教师_______
2013年1月5日
1设计目的
模拟文件系统实现的基本功能,了解文件系统的基本结构、内部功能和实现,通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,实现文件系统的管理和控制功能。
2设计内容
2.1实现功能
实现一个简单的多用户多级目录要求如下(具体选做):
1)实现二级目录管理及文件管理基本操作;
2)实现无穷级目录管理及文件管理基本操作;
3)在1)或2)基础上实现共享“别名”;
4)在1)或2)基础上加快了文件检索;
5)基于某项实际应用进行文件系统设计。
2.2开辟空间
在内存中开辟一个虚拟磁盘空间作为文件存储器,用位示图来管理文件存储空间,采用显式链接分配方式,将位示图合并到FAT表中。
2.3目录结构
文件的物理结构采用显式链接的方式。
文件的目录结构是多用户多目录结构的。
如:
主文目录MFD,用户文件目录UED,运行文件目录AFD,每级目录都有具体内容。
目录用索引节点的方式组织。
2.4实现的操作
1)create:
创建文件
2)delete:
删除文件
3)open:
打开文件
4)close:
关闭文件
5)read:
读文件
6)write:
写文件
7)mkdir:
创建目录(子目录)
8)cd:
改变当前目录
9)dir:
列出文件目录
10)login:
登陆系统
11)logout:
退出系统
2.5设计一个用户友好的界面
3设计步骤
3.1需求分析
在内存中申请1M的空间来模拟存取设备,空间划分为三部分,第一部分用来存放位示图,用于标识数据块的使用情况,第二部分放置一个文件索引的数据,用于快速的查找数据,第三部分放置数据信息,第三部分划分为512块,每块512B,其256K,放置在1M空间的最末端,由第三部分的大小可知,第一部分只需64B即可,中间的部分用来存放文件索引。
其他用到的存储单元由系统分配。
需要实现的功能:
1)实现二级目录管理及文件管理基本操作;
2)实现无穷级目录管理及文件管理基本操作;
3)在1)或2)基础上实现共享“别名”;
4)在1)或2)基础上加快了文件检索;
5)基于某项实际应用进行文件系统设计。
3.2概要设计
首先系统要完成初始化的任务,建立一个系统,并等待用户登录使用文件系统,用户登录系统时,系统对用户的用户名(允许用户有限次的尝试,最多尝试五次),如果用户登录成功,则系统进入命令提示符状态,等用户输入指令后,系统得用一个解释程序按照指定方式处理用户请求,用户退出后,系统转入登录模块,等待下一位用户的登录。
3.3详细设计
3.3.1函数调用关系:
FindBlankFileBlockId()
*FindBlankFileBlock()
GetCurrentTime()
AddFileIndex()
UpdateBitMap()
*CreateFileElement():
FindBlankFileBlockId(),AddFileIndex(),UpdateBitMap()
*CreateFileBlockList()
InitFileSys():
*CreateFileBlockList(),*CreateFileElement()
Login()
Create():
*CreateFileElement()
Dir()
Mkdir():
*CreateFileElement()等等
3.3.2各程序流程图:
1)创建文件(create):
在当前目录里创建文件,在内存中找到空闲文件块来存放用户文件信息,新创建的文件的状态默认为关闭,同时更新位示图和索引表。
2)删除文件(delete):
在目录中找到要删除的文件的目录项,使之成为空项,回收该文件所占用的存储空间。
3)打开文件(open):
在当前目录进行操作,根据文件名,在索引表里找到该文件的物理块号,然后找到该文件的信息,将文件的状态设为打开。
4)关闭文件(close):
在当前目录进行操作,根据给出的文件名,在索引表里找到该文件的物理块号,根据块号找到该文件信息,若此文件当前状态是打开则将该文件的状态设为关闭。
否则,输出“当前目录没有要关闭的文件”。
5)读文件(read):
在当前目录进行操作,根据文件名,检测文件是否已经打开,若文件已经打开则将文件的信息显示到屏幕上。
6)写文件(write):
在当前目录进行操作,根据文件名。
检测文件是否打开,若已经打开,用户输入完成后,使用CTRL+D,结束输入,系统将用户的输入内容,保存到相应的文件块(小心越界情况)。
7)创建目录(子目录)(mkdir):
在当前目录创建目录,与创建文件类似,但文件夹在文件元素结构中的数据部分为空。
同样新位示图和文件索引表。
8)改变当前目录(cd):
进入下一层的一个文件夹和回到父目录,通过系统的当前状态,获取一个指向目标文件夹的指针做为当前的父节点,改变当前的路径为目标路径,改变用户当前所在层。
9)列出文件目录(dir):
在当前目录进行操作,根据文件名+文件元素所在层+父节点可以唯一的标识一个文件元素的关系在文件索引中搜索出当前层的所有文件元素。
10)用户登录(login):
文件系统里已经存在9个用户(user1~user8和root),。
用户登陆成功后会初始化当前用户的信息。
若失败,则退出系统。
11)退出系统(logout):
执行此命令时,退出系统,回到登陆模块。
下一个用户可以进行登陆操作。
3.4调试分析
voidUpdateBitMap(unsignedfileblockid){//计复所在位示图的位置
intdirInBitmap=((int)(fileblockid/8));
intdirInChar=fileblockid%8;
char*c=&(FS.bm.BMStart[dirInBitmap]);
charxor;
switch(dirInChar){
case0:
xor=0x80;
break;
case1:
xor=0x40;
break;
case2:
xor=0x20;
break;
case3:
xor=0x10;
break;
case4:
xor=0x08;
break;
case5:
xor=0x04;
break;
case6:
xor=0x02;
break;
case7:
xor=0x01;
break;}
*c=*c^xor;}
这种需要涉及到地址的是我不会的,这个程序是请教同学才做出来的。
这里有一点汇编语言的知识。
3.5系统测试
3.5.1实现的功能:
create,delete,open,close,read,write,mkdir,cd,dir,login,logout
多级目录:
文件共享(重名):
3.5.2错误的测试例子
要先创建文件或者目录才能对其进行操作,否则会出错:
读写文件之前都要先打开文件,否则操作出错:
3.6使用说明
1)create:
创建文件
在目录x下可以创建文件名为y的文件,输入命令的格式为createy,可以用命令dir显示在x目录下的文件y,如图:
2)delete:
删除文件
若文件已存在,则可以执行命令deletey来删除文件y,如图:
3)open:
打开文件
若文件已存在,则可以执行命令openy来打开文件y,如图:
4)close:
关闭文件
若文件已打开,则可以执行命令closey来关闭文件y,如图:
5)read:
读文件
若文件已存在,则可以执行命令ready来读文件y,如图:
6)write:
写文件
若文件已存在,则可以执行命令writey来写文件y,如图:
7)mkdir:
创建目录(子目录)
登陆系统后,要先创建目录x,执行命令mkdirx创建目录(在已有目录下可以在创建子目录),如图:
8)cd:
改变当前目录
登陆系统后,默认路径是根目录,执行命令cdx就可以进入刚才新建的目录x,路径由/变为/x/,执行命令cd..可以返回上一级目录如图:
9)dir:
列出文件目录
执行dir命令查看系统里目录的情况,如图:
10)login:
登陆系统
文件系统内置9个用户(user1~user8共8个普通用户,一个管理员root),登录时输入用户名就能出现操作界面。
现在以root用户为例:
/表示根目录,:
后面可以输入命令。
11)logout:
退出系统
执行logout命令,退出文件系统回到登陆界面,下一个用户可以进行登陆操作。
4经验与体会
这次的课程设计比之前的实验都要难,实验的功能也比较多和复杂,所以,花费了比较长的时间来做,期间遇到很多困难,经过问同学和查资料,总算解决了,不过我也知道这个程序还有不足的地方,所以尽量修改,得到最终结果。
深入了解文件系统,发现自己有很多不懂得,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,把以前所学过的知识重新温故。
这次课程设计终于顺利完成了。
这次的课程设计基本完成老师的要求,但是还有一些没能完成,这次的程序没有实现:
1)实现共享“别名”;2)基础上加快了文件检索;这是比较遗憾的。
其他功能还是比较好的实现了:
1)实现二级目录管理及文件管理基本操作;2)实现无穷级目录管理及文件管理基本操作;3)实现了重名
通过课程设计,掌握的比较多吧,可以对文件系统有一个深刻的认识,收获比较多。
5附录
数据结构:
数据块在内存中的物理结构
typedefstructfb{
unsignedFileBlockId;//文件块编号
unsignedBLOCK_SIZE;//文件块的容量
char*FileBlockAddr;//文件块地址
structfb*next;//下一个文件块的地址
}FileBlock;
文件索引结构
typedefstruct{
unsignedIndex;//文件元素索引编号
charFileName[NAME_LEN];//文件元素名
charParentName[NAME_LEN];//父节点名
unsignedFileBlockId;//文件元素所在物理块编号
unsignedFileLevel;//文件元素所在层次,层+文件元素名为一个文件元素逻辑位置
unsignedeffect;//是否有效,0-无效,1-有效
}FileIndexElement;
文件系统中文件元素的结构(含文件夹和文件)
typedefstructfse{
structfse*parent;//指向自己的父亲节点
unsignedFileLevel;//文件元素所在层次,层+文件元素名为一个文件元素的逻辑位置
charFileName[NAME_LEN];//文件元素名
unsignedFileBlockId;//文件元素所在物理块编号
unsignedFileElemLen;//文件元素的长度
FileTypeType;//文件元素类型
FileAccessAccess;//文件元素可供操作的权限
UserCreator;//文件创建者
charCreateTime[18];//创建时间,日期格式:
MM/DD/YYHH:
MI:
SS
charLastModTime[18];//最后一次修改时间
char*FileData;//一个文件的数据开始地址,文件夹时该值为NULL
FileStatusfileStu;//如果是一个文件表示文件当前的状态
}FSElement;
文件系统结构
typedefstruct{
char*FSStart;//文件系统的起始地址
unsignedSuperBlockSize;//文件系统的容量
BitMapbm;//文件系统中的位示图
unsignedBLOCK_COUNT;//文件系统中文件块的数量
FileBlock*head;//文件系统中文件块首地址
FileIndexFI;//文件系统中的文件索引
}SuperBlock;
文件系统的当前运行状态
typedefstruct{
UserCurrentUser;//当前用户
unsignedFileLevel;//用户所在文件系统层
FSElement*CurrParent;//当前层的父节点
char*CurrentPath;//当前路径
}CurrentStatus;
用户结构
typedefstruct{
char*UserName;//用户名称
UserTypeut;//用户类型
}User;