多用户多级目录文件系统的实现实验报告_第1页
多用户多级目录文件系统的实现实验报告_第2页
多用户多级目录文件系统的实现实验报告_第3页
多用户多级目录文件系统的实现实验报告_第4页
多用户多级目录文件系统的实现实验报告_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计课程名称_____操作系统____题目名称多顾客多级目录文献系统的实现一、课程设计的内容本课程设计规定设计一种模拟的多顾客多级目录的文献系统。通过具体的文献存储空间的管理、文献的物理构造、目录构造和文献操作的实现,加深对文献系统内部功效和实现过程的理解。二、课程设计的规定与数据在内存中开辟一种虚拟磁盘空间作为文献存储器,在其上实现一种多顾客多目录的文献系统。文献物理构造可采用显式链接或其它办法。磁盘空闲空间的管理可选择位示图或其它办法。如果采用位示图来管理文献存储空间,并采用显式链接分派方式,则能够将位示图合并到FAT中。文献目录构造采用多顾客多级目录构造,每个目录项包含文献名、物理地址、长度等信息,还能够通过目录项实现对文献的读和写的保护。目录组织方式能够不使用索引结点的方式,但使用索引结点,则难度系数为1.2。设计一种较实用的顾客界面,方便顾客使用。规定提供下列有关文献操作:(1)含有login(顾客登录)(2)系统初始化(建文献卷、提供登录模块)(3)文献的创立:create(4)文献的打开:open(5)文献的读:read(6)文献的写:write(7)文献关闭:close(8)删除文献:delete(9)创立目录(建立子目录):mkdir(10)变化现在目录:cd(11)列出文献目录:dir(12)退出:logout系统必须可实际演示,选用程序设计语言:C++、C等。三、课程设计应完毕的工作1.充足理解设计的任务,完毕设计的基本规定。然后根据自己的基础和能力选择不同难度的算法和实现方式,以获得更高的分数。2.独立独立完毕系统的分析、设计、编码、测试工作。3.完毕设计报告的撰写。4.以光盘(以班为单位刻录)方式提交已调试通过的完整的有关源程序和能够运行的执行文献;提交“课程设计报告”的书面和电子两种版本。四、课程设计进程安排序号设计各阶段内容地点起止日期1查阅资料、分析题目、概要设计分散周一2具体设计、编码分散周二3调试实验室周三4撰写设计报告分散周四5运行、验收实验室周五五、应收集的资料及重要参考文献[1]计算机操作系统(修订版),汤子瀛等,西安电子科技大学出版社,[2]操作系统实验指导书,傅秀芬,广东工业大学(自编)[3]计算机操作系统教程(第二版),张尧学、史美林,清华大学出版社,[4]当代操作系统,A.S.Tanenbaum著,陈向群等译机械工业出版社,年发出任务书日期:6月15日指导教师签名:计划完毕日期:6月24日基层教学单位负责人签章:主管院长签章:目录1.设计思想阐明 12.系统构造阐明 13.数据构造阐明 13.1开发环境 13.2数据存储 23.3数据构造 23.3.1数据块在内存中的物理构造 23.3.2文献索引构造 23.3.3文献系统中文献元素的构造(含文献夹和文献) 23.3.4文献系统构造 33.3.5文献系统的现在运行状态 33.3.6顾客构造 44.各重要模块的算法流程图 44.1整体思路概述 44.1.1login(顾客登录) 44.1.2系统初始化 54.1.3文献的创立:create 54.1.4文献的打开:open 64.1.5文献的读:read 64.1.6文献的写:write 84.1.7文献关闭:close 94.1.8删除文献:delete 104.1.9创立目录(建立子目录):mkdir 124.1.10变化现在目录:cd 124.1.11列出文献目录:dir 144.1.12退出:logout 154.2算法流程图 165.使用阐明书 175.1登录 175.2新建目录和列出文献目录 175.3变化现在目录 175.4文献的创立 185.5文献的打开 185.6文献的写 185.7文献的读 185.8文献的关闭 185.9文献的删除 195.10返回根目录 195.11退出 196.心得体会 19参考文献 191.设计思想阐明本课程设计规定设计一种模拟的多顾客多级目录的文献系统。通过具体的文献存储空间的管理、文献的物理构造、目录构造和文献操作的实现,加深对文献系统内部功效和实现过程的理解。2.系统构造阐明2.1在内存中开辟一种虚拟磁盘空间作为文献存储器,在其上实现一种多顾客多目录的文献系统。2.2文献物理构造可采用显式链接或其它办法。2.3磁盘空闲空间的管理可选择位示图或其它办法。如果采用位示图来管理文献存储空间,并采用显式链接分派方式,则能够将位示图合并到FAT中。2.4文献目录构造采用多顾客多级目录构造,每个目录项包含文献名、物理地址、长度等信息,还能够通过目录项实现对文献的读和写的保护。2.5设计一种较实用的顾客界面,方便顾客使用。规定提供下列有关文献操作:2.5.1含有login(顾客登录)2.5.2系统初始化(建文献卷、提供登录模块)2.5.3文献的创立:create2.5.4文献的打开:open2.5.5文献的读:read2.5.6文献的写:write2.5.7文献关闭:close2.5.8删除文献:delete2.5.9创立目录(建立子目录):mkdir2.5.10变化现在目录:cd2.5.11列出文献目录:dir2.5.12退出:logout3.数据构造阐明3.1开发环境VisualC++6.0下的win32控制台程序,C语言。3.2数据存储在内存中申请1M的空间来模拟存取设备,空间划分为三部分,第一部分用来寄存位示图,用于标记数据块的使用状况,第二部分放置一种文献索引的数据,用于快速的查找数据,第三部分放置数据信息,第三部分划分为512块,每块512B,其256K,放置在1M空间的最末端,由第三部分的大小可知,第一部分只需64B即可,中间的部分用来寄存文献索引。其它用到的存储单元由系统分派。3.3数据构造3.3.1数据块在内存中的物理构造typedefstructfb{ unsignedFileBlockId; //文献块编号 unsignedBLOCK_SIZE; //文献块的容量 char*FileBlockAddr; //文献块地址 structfb*next; //下一种文献块的地址}FileBlock;3.3.2文献索引构造typedefstruct{ unsignedIndex; //文献元素索引编号 charFileName[NAME_LEN]; //文献元素名 charParentName[NAME_LEN]; //父节点名 unsignedFileBlockId; //文献元素所在物理块编号 unsignedFileLevel; //文献元素所在层次,层+文献元素名为一种文献元素逻辑位置 unsignedeffect; //与否有效,0-无效,1-有效}FileIndexElement;3.3.3文献系统中文献元素的构造(含文献夹和文献)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;3.3.4文献系统构造typedefstruct{ char*FSStart; //文献系统的起始地址 unsignedSuperBlockSize; //文献系统的容量 BitMapbm; //文献系统中的位示图 unsignedBLOCK_COUNT; //文献系统中文献块的数量 FileBlock*head; //文献系统中文献块首地址 FileIndexFI; //文献系统中的文献索引}SuperBlock;3.3.5文献系统的现在运行状态typedefstruct{ UserCurrentUser; //现在顾客 unsignedFileLevel; //顾客所在文献系统层 FSElement*CurrParent; //现在层的父节点 char*CurrentPath; //现在途径}CurrentStatus;3.3.6顾客构造typedefstruct{ char*UserName; //顾客名称 UserTypeut; //顾客类型}User;4.各重要模块的算法流程图4.1整体思路概述首先系统要完毕初始化的任务,建立一种系统,并等待顾客登录使用文献系统,顾客登录系统时,系统对顾客的顾客名和密码进行验证(允许顾客用限次的尝试,多最多尝试五次),如果顾客登录成功,则系统进入命令提示符状态,等顾客输入指令后,系统得用一种解释程序按照指定方式解决顾客请求,顾客退出后,系统转入登录模块,等待下一位顾客的登录。4.1.1login(顾客登录)内置9个顾客名和密码,用来验证登录顾客的身份,顾客登录成功后会初始化现在顾客等一系列的系统现在信息,默认顾客的类型为普通顾客,如果顾客未能通过身份验证,提示顾客登录失败,退出整个系统。顾客登录流程图4.1.2系统初始化系统的初始化要完毕文献系统的建立,涉及下列几部分:请求内存、设立位示图、初始化文献索引、初始化文本块链表、初始化系统的现在状态、创立一种根目录做为系统的根。4.1.3文献的创立:create只支持在现在目录创立文献,根据位示图找到一种未使用的文献块用来寄存顾客的文献信息,根据系统现在状态来构建一种文献系统元素放入到找到的文献块中,新创立的文献状态为关闭,同时更新位示图和文献索引。文献创立流程图voidCreate(char*filename){ if(strcmp(filename,"")==0) { printf("对不起,文献名不能为空。\n"); } else { CreateFileElement(protect,filename,file,NULL,CS.CurrParent); } printf("[%s@localhost%s]$",CS.CurrentUser.UserName,CS.CurrentPath);}4.1.4文献的打开:open只支持在现在目录进行操作,通过顾客给定的文献名在文献索引中搜索到文献的物理文献块ID,找到该文献元素后,将文献现在状态置为打开。打开文献流程图voidOpen(char*path){ chardisplay[100]; for(unsignedi=0;i<FS.FI.FICount;i++) { if(!strcmp(FS.FI.FIStart[i].ParentName,CS.CurrParent->FileName)&& FS.FI.FIStart[i].FileLevel==CS.FileLevel&&FS.FI.FIStart[i].effect==1&&strcmp(FS.FI.FIStart[i].FileName,path)==0) { FSElement*fselem=(FSElement*)FindBlankFileBlock(FS.FI.FIStart[i].FileBlockId); fselem->fileStu=opened; strcpy(display,"文献已打开完毕。\n"); break; } } if(strcmp(display,"")==0) { strcpy(display,"现在目录下没有您要打开的文献。\n"); } printf("%s\n",display); printf("[%s@localhost%s]$",CS.CurrentUser.UserName,CS.CurrentPath);}4.1.5文献的读:read只支持在现在目录进行操作,前提是顾客已执行文献打开的命令,否则会提示顾客先打开文献。通过类似的查找方式,找到文献的数据部分,将数据显示到界面。读文献流程图voidRead(char*path){ chardisplay[BLOCK_SIZE]; for(unsignedi=0;i<FS.FI.FICount;i++) { if(!strcmp(FS.FI.FIStart[i].ParentName,CS.CurrParent->FileName)&&FS.FI.FIStart[i].FileLevel==CS.FileLevel&&FS.FI.FIStart[i].effect==1&& strcmp(FS.FI.FIStart[i].FileName,path)==0) { FSElement*fselem=(FSElement*)FindBlankFileBlock(FS.FI.FIStart[i].FileBlockId); if(fselem->fileStu==closed) { strcpy(display,"文献尚未打开,请先打开文献。\n"); } else { if(!fselem->FileData||!strcmp(fselem->FileData,"")) { strcpy(display,"文献无内容。\n"); } else { strcpy(display,fselem->FileData); } fselem->fileStu=reading; } break; } } if(strcmp(display,"")==0) { strcpy(display,"现在目录下没有您要打开的文献。\n"); } printf("%s\n",display); printf("[%s@localhost%s]$",CS.CurrentUser.UserName,CS.CurrentPath);}4.1.6文献的写:write只支持在现在目录进行操作,前提是顾客已执行文献打开的命令,否则会提示顾客先打开文献。命令成功后,会等待顾客的输入,顾客输入完毕,使用CTRL+D,结束输入,系统会读入顾客的输入内容,保存到对应的文献块(注意,如果顾客的输入太多,会出现越界或截取顾客输入一部分的现象)。voidWrite(char*path){ chardisplay[BLOCK_SIZE]; memset(display,'\0',BLOCK_SIZE); for(unsignedi=0;i<FS.FI.FICount;i++) { if(!strcmp(FS.FI.FIStart[i].ParentName,CS.CurrParent->FileName)&& FS.FI.FIStart[i].FileLevel==CS.FileLevel&&FS.FI.FIStart[i].effect==1&&strcmp(FS.FI.FIStart[i].FileName,path)==0) { FSElement*fselem=(FSElement*)FindBlankFileBlock(FS.FI.FIStart[i].FileBlockId); if(fselem->fileStu==closed) { strcpy(display,"文献尚未打开,请先打开文献。\n"); } else { printf("\n注意:文献最大不能够超出%d字节!!按CTRL+D结束编辑。\n",BLOCK_SIZE-sizeof(FSElement)); charc; inti=0; while((c=getchar())!=0x04) { display[i++]=c; } getchar(); //解决回车 display[i]='\0'; strcpy(fselem->FileData,display); unsignedlen=strlen(display)<BLOCK_SIZE-sizeof(FSElement)?strlen(display):BLOCK_SIZE-sizeof(FSElement); strncpy(fselem->FileData,display,len); fselem->fileStu=writing; strcpy(display,"文献写入成功。\n"); } break; } } printf("%s\n",display); printf("[%s@localhost%s]$",CS.CurrentUser.UserName,CS.CurrentPath);}4.1.7文献关闭:close只支持在现在目录进行操作,通过顾客给定的文献名在文献索引中搜索到文献的物理文献块ID,找到该文献元素后,将文献现在状态置为关闭。voidClose(char*path){ chardisplay[100]; for(unsignedi=0;i<FS.FI.FICount;i++) { if(!strcmp(FS.FI.FIStart[i].ParentName,CS.CurrParent->FileName)&& FS.FI.FIStart[i].FileLevel==CS.FileLevel&&FS.FI.FIStart[i].effect==1&&strcmp(FS.FI.FIStart[i].FileName,path)==0) { FSElement*fselem=(FSElement*)FindBlankFileBlock(FS.FI.FIStart[i].FileBlockId); fselem->fileStu=opened; strcpy(display,"文献已关闭。\n"); break; } } if(strcmp(display,"")==0) { strcpy(display,"现在目录下没有您要关闭的文献。\n"); } printf("%s\n",display); printf("[%s@localhost%s]$",CS.CurrentUser.UserName,CS.CurrentPath);}4.1.8删除文献:delete删除文献并不真正清理文献的物理存储内容,只是将文献的有效状态更改为无效。删除文献流程图voidDelete(char*path){ chardisplay[100]=""; for(unsignedi=0;i<FS.FI.FICount;i++) { if(!strcmp(FS.FI.FIStart[i].ParentName,CS.CurrParent->FileName)&&FS.FI.FIStart[i].FileLevel==CS.FileLevel&&FS.FI.FIStart[i].effect==1&& strcmp(FS.FI.FIStart[i].FileName,path)==0) { FS.FI.FIStart[i].effect=0; //删除标记 strcpy(display,"文献已删除。\n"); break; } } if(strcmp(display,"")==0) { strcpy(display,"现在目录下没有您要删除的文献。\n"); } printf("%s\n",display); printf("[%s@localhost%s]$",CS.CurrentUser.UserName,CS.CurrentPath);}4.1.9创立目录(建立子目录):mkdir只支持在现在目录创立文献,与创立文献有点类似,只是文献夹在文献元素构造中的数据部分为空。同样会更新位示图和文献索引。创立目录流程图voidMkdir(char*filename){ if(strcmp(filename,"")==0) { printf("对不起,文献夹名不能为空。\n"); } else { CreateFileElement(protect,filename,dir,NULL,CS.CurrParent); } printf("[%s@localhost%s]$",CS.CurrentUser.UserName,CS.CurrentPath);}4.1.10变化现在目录:cd只支持进入下一层的一种文献夹和回到父目录,实现方式为通过系统的现在状态,获取一种指向目的文献夹的指针做为现在的父节点,变化现在的途径为目的途径,变化顾客现在所在层。变化现在目录流程图voidCd(char*path){ intsplitDisplayCou=0; //分割符出现的次数 if(strcmp(path,"..")==0)//返回上一级目录,即父目录 { if(CS.FileLevel>0) { CS.FileLevel--; CS.CurrParent=CS.CurrParent->parent; for(unsignedi=strlen(CS.CurrentPath)-1;i>0;i--) { if(CS.CurrentPath[i]=='/') { splitDisplayCou++; if(splitDisplayCou==2) //已过滤掉最后一种目录名 { break; } } } chartemppath[1000]; strcpy(temppath,CS.CurrentPath); memset(CS.CurrentPath,'\0',1000); strncpy(CS.CurrentPath,temppath,i+1); } } else { chardisplay[100]=""; for(unsignedi=0;i<FS.FI.FICount;i++) { if(!strcmp(FS.FI.FIStart[i].ParentName,CS.CurrParent->FileName)&& FS.FI.FIStart[i].FileLevel==CS.FileLevel&&FS.FI.FIStart[i].effect==1&&strcmp(FS.FI.FIStart[i].FileName,path)==0) { strcpy(display,"文献存在。\n"); CS.CurrParent=(FSElement*)FindBlankFileBlock(FS.FI.FIStart[i].FileBlockId); CS.FileLevel++; strcat(CS.CurrentPath,path); strcat(CS.CurrentPath,"/"); break; } } if(strcmp(display,"")==0) //文献夹不存在,什么都不做 { printf("现在目录下没有您要进入的文献夹。\n"); } } printf("[%s@localhost%s]$",CS.CurrentUser.UserName,CS.CurrentPath);}4.1.11列出文献目录:dir只支持在现在目录进行操作,根据文献元素的名称+文献元素所在层+父节点能够唯一的标记一种文献元素的关系在文献索引中搜索出现在层的全部文献元素。voidDir(char*path){ chardisplay[1000]; memset(display,'\0',1000); //查找显示内容 for(unsignedi=0;i<FS.FI.FICount;i++) { if(!strcmp(FS.FI.FIStart[i].ParentName,CS.CurrParent->FileName)&&FS.FI.FIStart[i].FileLevel==CS.FileLevel&&FS.FI.FIStart[i].effect==1) { strcat(display,FS.FI.FIStart[i].FileName); strcat(display,"\t\t"); } } printf("%s\n",display); printf("[%s@localhost%s]$",CS.CurrentUser.UserN

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论