操作系统课程设计报告模拟文件系统设计班级:计0301学号:姓名:指导老师:提交时间:2006-7-11实验地点:西配楼机房太原理工大学计算机与软件学院1一、课程设计题目和目的通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识。二、课程设计要求通过课程设计,要求学生主要掌握如下内容:1.设计出文件系统中常用的数据结构;2.理解文件系统的工作流程,给出程序流程图;3.设计出文件系统中关键的算法;4.模拟实现二级目录文件系统,并给出一组运行结果。三、课程设计内容本课程设计要求模拟采用二级目录结构的磁盘文件系统的文件操作。其主要内容有:1、采用二级目录结构为主文件目录MFD和用户文件目录UFD。2、为每个用户设置一张“用户打开文件表”(UOT),用以说明用户当前使用文件的情况。3、假定文件系统提供的文件操作有建立文件;打开文件;关闭文件;读文件;写文件和撤消文件。4、用输入命令来模拟用户程序中调用的文件操作,其命令格式和处理要求见指导书。5、在各命令的实现流程中“寻找空闲块”的工作可以用一个随机数来模拟,取到的随机数即为空闲块号。四、文件系统实现1、数据结构设计通过分析设计题目,具体设计出主要的三个数据结构。UFD:通过结构体,将文件名,文件属性,记录长度和文件的地址结合在一体。UOF:同样是通过结构体,将文件名,文件属性,记录长度,当前状态,读指针,写指针以及最后一块的指针结合在一起。MFD:通过一个类来实现其功能。类中包括用户名,UFD及UOF中的文件个数,以及与用户相对应的UFD和UOF。另外还包括两个初始化函数。模拟二级目录结构时,第一级为主文件目录MFD,第二级为用户文件目录UFD。假定系统可同时管理N个用户的文件,每个用户最多在磁盘上保存L个文件,则二级目录结构可用如下形式表示:NL栏栏主文件目录MFD用户文件目录UFD整个系统只有一张主文件目录表,但有N张用户文件目录表。用户文件UFD中的“文件属性”规定文件的使用权限为“只可读”或“只可写”或“可读可写”。用户名用户文件目录文件名文件属性记录长度文件地址2可为每个用户设置一张“用户已打开文件表(UOF)”,用以说明该用户当前正在使用文件的情况。如果用最多同时打开或建立S个文件,那么,用户已打开文件表UOF应该有S个登记栏,其结构如下:S栏用户请求打开或建立一个文件时,相应的文件操作把在关该文件的信息登记到UOF中,读指针和写指针用于指出对文件的进行存取的当前位置。2、程序流程设计1、程序结构框图:文件系统提供的文件操作有建立文件(create),打开文件(open),关闭文件(close),读文件(read),写文件(write)和撤消文件(delete)。在模拟程序中可从键盘上输入文件操作命令来模拟各用户程序中所调用的各种文件操作,用一个结束命令(end)停止程序的执行,其程序的结构图如下:文件名文件属性记录长度状态(打开/建立)读指针写指针32、用输入命令来模拟用户程序中调用的文件操作,这些命令的格式和处理要求如下:开始初始化已有的用户或新建用户初始化文件表输入用户名MFD中是否有该用户输入命令分析命令显示:无此用户关闭显示:命令错误无有建立打开关闭读写撤消立4显示:同名文件不能建立(1).建立文件:create(文件名,记录长度,文件属性)模拟文件系统进行“建立文件”的处理流程如下:“建立文件”模拟流程:(2).打开文件:open(文件名,操作类型)其中操作类型指出文件打开后用户将对文件进行读还是写。约定操作类型与文开始查该用户的UFDUFD中有该文件在UFD和UOF中找空登记栏在UFD和UOF中登记文件名,记录长度,文件属性找一磁盘空闲块D:=找到的块号在UFD登记栏中文件地址:=d在该用户的UOF中登记状态:=建立写指针:=d显示:建立成功返回返回5属性不符合或正处于“建立”状态的文件不允许打开,处理流程如下:“打开文件”模拟流程(3).读文件:Read(文件名,读文件)开始查用户UFDUFD中有该文件吗?查用户UOF该文件为“建立”状态?显示:文件已打开返回显示:正在建立不能打开UOF中有该文件?文件属性与操作类型相符?登记UOF:文件名,记录长度,文件属性状态:=“打开”读指针:=UFD中文件地址写指针:=UFD中文件地址显示:“打开”成功返回显示:不存在该文件,打开失败返回显示:非法操作,不能打开返回有无有无否否是是6文件打开后,可用“读文件”操作请求读指定文件中的若干记录,既可顺序读写也可随机读。这里约定总是顺序读文件中的记录本,读长度表示本次操作需计的记录个数。处理流程如下:“读文件”模拟流程:(4).关闭文件:close(文件名)开始查用户UOF文件已打开?从“读指针”得到当前起始地址按读长度把把信息读出传送给用户(用显示物理块号来模拟)修改“读指针”显示:“读文件”成功返回显示:文件未打开,不能读返回是否7对某个文件不需要再读或写时,用户应关闭文件。若关闭一个新建立的文件,则要建立文件的结束标志。对链接文件来说,最后一块中的链接字应为“0”。关闭文件的工作流程如下:“关闭文件”模拟流程(5).删除文件:delete(文件名)开始查用户UOF文件为“建立”状态?文件为“打开”状态?显示:文件已关闭置文件结束标志消除该文件在UOF中的登记栏显示:“关闭文件”成功返回是是是否否8把请求撤消的文件从用户文件目录表中除名,收回该文件占用的存储区域。处理流程如下:“删除文件”模拟流程(6).写文件:write(文件名,记录号)执行写文件操作时要区分两种情况,第一种是在执行create后要求写。第二种是开始查该用目录表UFDUFD中有该文件?查该用户的UOFUOF中有该文件?在UOF中清除该文件的登记栏归还文件所占的存储区域在UFD中清除该文件登记栏显示:文件已撤消返回是是否否9在执行open后要求写的。对第二种情况可认为用户要对一个已建立好的文件进行修改。一个文件可以分多次写,既可按记录顺序写也可随机写一个记录,采用顺序写时可省略记录号。模拟写文件操作的工作的流程图如下:“写文件”模拟流程开始UOF中有该文件查用户的UOF该文件为“建立”状态?把记录信息写到“写指针”指出的物理块中(用显示物理块号来模拟)文件属性为“只读”?顺序修改?取出“写指针”指出的块号修改“写指针”显示:操作不合法,不能写找出存放指定记录的块号把修改后的信息写入找到的物理块中显示:“写文件”成功返回显示:文件尚未建立或打开,不能写返回返回是是否否是是10注:流程图中“寻找空闲块”的工作可以用取一个随机数来模拟,取到的随机灵敏即为空闲块号五:源程序及注释如下:#defineS10#defineL20#defineN30#includestdio.h#includestring.h#includestdlib.hstructUFD{charfname[20];charshuxing[20];intlength;intaddr;};structUOF{charfname[20];charshuxing[10];intlength;charstate[10];int*w,*r;};structMFD{charuname[25];structUFDufd[L];structUOFuof[S];};structMFDmfd[N];create(intx);open(intx);close(intx);Read(intx);write(intx);delete(intx);main(){charnamestr[20],order[20];inti,j;/*chushihuaMFD*//************************************************************/strcpy(mfd[0].uname,zhangjian);11strcpy(mfd[0].ufd[0].fname,wenjian1);strcpy(mfd[0].ufd[0].shuxing,read);mfd[0].ufd[0].length=25;mfd[0].ufd[0].addr=6120;/*printf(uname:%s,fname:%s,shuxing:%s,length:%d,address:%d\n,mfd[0].uname,mfd[0].ufd[0].fname,mfd[0].ufd[0].shuxing,mfd[0].ufd[0].length,mfd[0].ufd[0].addr);*/strcpy(mfd[0].ufd[1].fname,wenjian2);strcpy(mfd[0].ufd[1].shuxing,rw);mfd[0].ufd[1].length=20;mfd[0].ufd[1].addr=0;strcpy(mfd[0].ufd[2].fname,wenjian3);strcpy(mfd[0].ufd[2].shuxing,rw);mfd[0].ufd[2].length=20;mfd[0].ufd[2].addr=1000;strcpy(mfd[1].uname,hey);strcpy(mfd[1].ufd[0].fname,wenjian5);strcpy(mfd[1].ufd[0].shuxing,read);mfd[1].ufd[0].length=30;mfd[1].ufd[0].addr=4020;strcpy(mfd[1].ufd[1].fname,wenjian8);strcpy(mfd[1].ufd[1].shuxing,rw);mfd[1].ufd[1].length=21;mfd[1].ufd[1].addr=1;/*chushihuaUOF*/strcpy(mfd[0].uof[0].fname,wenjian1);strcpy(mfd[0].uof[0].shuxing,mfd[0].ufd[0].shuxing);mfd[0].uof[0].length=mfd[0].ufd[0].length;strcpy(mfd[0].uof[0].state,open);mfd[0].uof[0].w=mfd[0].ufd[0].addr;mfd[0].uof[0].r=mfd[0].ufd[0].addr;strcpy(mfd[0].uof[1].fname,wenjian3);strcpy(mfd[0].uof[1].shuxing,mfd[0].ufd[2].shuxing);mfd[0].uof[1].length=mfd[0].ufd[2].length;strcpy(mfd[0].uof[1].state,open);mfd[0].uof[1].w=mfd[0].ufd[2].addr;mfd[0].uof[1].r=mfd[0].ufd[2].addr;/*printf(w=%d,mfd[0].uof[0].w);*//*******************************************************/12shuru:printf(Initialhasfinished.Pleaseinputyournametologin:\n);scanf(%s,namestr);for(i=0;iN;i++){if(!strcmp(namestr,mfd[i].uname))/*xiangdeng*/break;}/*for*/if(i=N){printf(Thenameyouhaveinputediswrong!\n);gotoshuru;}instructions:printf(Welcome!Inputyourinstruction:\n);printf(create———→createafile\n);printf(open———→openafile\n);printf(close———→closeafile\n);printf(read———→readafile\n