《2914.模拟文件系统【操作系统课程设计含报告、源代码】.doc》由会员分享,可在线阅读,更多相关《2914.模拟文件系统【操作系统课程设计含报告、源代码】.doc(55页珍藏版)》请在三一办公上搜索。
1、工学院 操 作 系 统 课程设计说 明 书设计题目 模拟文件系统的工作 系 别 计算机工程系 专业班级 学生姓名 学 号 指导教师 日 期 2010-5-25 目 录一、课程设计题目和目的1二、课程设计要求1三、程序设计思想1四、文件系统的实现21.数据结构设计22.程序功能图33.实体关系图34.数据流图45.程序流程图5(1) 建立文件:create(文件名,记录长度)6(2) 写文件:write(文件名,开始位置,字符串)7(3) 读文件:read(文件名,开始位置,长度)8(4) 显示文件所有内容 type(文件名)8(5) 删除文件delete(文件名)9(6) 重命名文件ren(文
2、件名,新文件名)10(7) 查询文件属性ask(文件名)11(8) 关闭文件close(文件名)12五、程序运行结果及分析13六、课程设计总结15七、参考文献16八、附录17LinList.hOS.CPPSEQLIST.H一、课程设计题目和目的通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。二、课程设计要求通过课程设计,要求学生主要掌握如下内容:1文件的物理结构可以选用顺序分配、链表分配或索引分配。2建立文件:从命令中得到文件名,得到该文件的文件长度,建立
3、文件。修改目录表。3删除文件:回收文件占用的空间,修改目录表4读文件:read 文件名 显示开始字节 显示的字节数 ,直接显示所需要的字节数。5写文件:write 文件名 插入的位置 插入的内容6查询属性:显示文件属性 文件名,类型,长度,时间等。三、程序设计思想阅读操作系统方面的书籍,了解操作系统的文件系统原理。结合分析课程设计要求,确定实体以及它们之间的关系。实体关系有三张表(磁盘空间分配表、文件表、打开文件表)、一个模拟磁盘的数组、命令服务和用户构成。用户负责输入命令。命令服务实现命令的解释、命令检查、命令帮助以及调用相关模块执行相应的命令功能。此课程设计把TXT文本作来研究对象来模拟操
4、作系统的文件系统工作过程。所以用一个字符串数组来模拟磁盘空间,顾名思义,模拟磁盘提供字符的存储服务。磁盘空间分配表,采用链表结构,每个节点保存模拟磁盘的一个逻辑块的信息,包括块的最大长度,文件占用长度,占用标志。如果占用标志为0,即该空间可分配给文件。初始化磁盘空间分配表链表,首先把整个模拟磁盘作来一块,并置占用位为0.当有进程申请磁盘空间时,从头开始遍历,检查占用位,如果该块为可分配,则检查块大小,若块长度大于或等于申请空间大小,则把块的前一部分(等于申请大小)分配给文件,并置标志位为占用。剩下的大小作来一个新块,作来一个新节点插入到原节点的后边,标志位为可用。这样就实现了模拟磁盘的线性分配
5、。文件表,由于模拟文件系统的文件数量不多,故文件表采用线性表来存储。线性表每个结点存储一个文件的信息。打开文件表,采用数组形式存储打开的文件,数组每个元素保存一个打开文件的信息。文件信息和文件表中的文件信息类似。构造这些实体的关系图,数据流图、程序流程图来进行具体的设计。四、文件系统的实现1.数据结构设计通过分析课程设计要求,具体设计出如下数据结构: char disk10000; /模拟磁盘空间通过一个字符串数组来模拟磁盘空间,数组最大长度设置为10000,即磁盘空间最大容量为10000字节。作为模拟文件系统,主要理解文件系统的原理,可以把文本文件作为对象来研究。故磁盘空间用一个字符串数组来
6、模拟. struct freeDiskTable /碰盘空间分配表int start; /开始位置int length; /占用长度int maxLength; /最大长度int useFlag; /使用标志,1为占用,0为空闲;通过结构体,将磁盘空间使用情况(文件开始位置、占用长度、最大长度、使用标志)结合在一体。一个结构体变量记录磁盘一个块的信息。结构体作为链表的一个节点,设置一个链表将节点连接起来,构成一个磁盘空间分配表。 struct fileTable /文件表char fileName20; /文件名字int start; /开始位置int length; /文件长度int max
7、Length; /最大长度char fileKind8; /文件种类,此默认为txtstruct tm *timeinfo; /文件创建时间;通过结构体,将文件名字、文件在磁盘的开始位置、文件长度、文件最大长度、文件类型、创建时间结合在一起。文件类型,本模拟程序使用txt类型。设置一个线性表来存储文件。 struct openFileTable / 打开文件表char fileName20; /文件名字char fileKind8; /文件类型int start; /文件开始位置int length; /文件长度int maxLength; /最大长度int openCount; /打开文件的
8、进程数struct tm *timeinfo; /文件创建时间;通过结构体存储打开的文件信息,包括文件名字、文件类型、文件开始位置、文件长度、最大长度、文件打开数和文件创建时间。通过结构体数组存储所有打开文件信息。2.程序功能图 模拟文件系统创建文件删除文件条件读取写入文件查询属性显示内容显示目录重命名文件关闭文件文件系统提供的文件操作有建立文件(create)、删除文件(delete)、条件读取文件(read)、写入文件(write)、查询文件的属性(ask)、显示文件所有内容(type)、重命名文件(ren)、关闭文件(close)。可以通过键盘输入命令来模拟文件的操作。通过exit命令退
9、出程序。3.实体关系图用 户命令服务模拟磁盘磁盘空间分配表文件表打开文件表 命令服务使得用户能够输入命令,在需要时提供命令的帮助。同时能够分析命令,调用相应的命令模块对模拟磁盘、磁盘空间分配表、文件表、打开文件表进行操作。磁盘空间分配表记录模拟磁盘的使用情况。文件表记录文件的信息和在磁盘里的位置等信息。打开文件表记录已打开的文件,对应文件表中的文件信息,和文件表里的文件节点类似,记录了文件在模拟磁盘中的信息。4.数据流图模拟文件系统输入界面显示命令帮助文件表打开文件表磁盘分配表模拟磁盘语境级DFD显示信息文件信息文件信息长度、位置信息文件(字符串)用户命令5.程序流程图模拟文件系统提供的文件操
10、作有建立(create),读取(read),显示(type),删除(detele),写入(write),关闭(close),重命名(ren)和查询(ask)。在模拟程序中可从键盘上输入文件操作命令来模拟各用户程序中所调用的各种文件操作,用一个结束命令(exit)停止程序的执行。开始初始化命令表初始化文件表初始化磁盘分配表初始化打开文件表输入命令命令表中有该命令?分析命令显示:命令帮助无创建删除读取显示重命名写入查询列表关闭退出程序(exit)执行命令执行命令(1) 建立文件:create(文件名,记录长度)模拟文件系统进行“建立文件”的处理流程如下:开始查询文件表文件表中有名字?返回有显示重命
11、申请磁盘空间空间申请成功?显示失败否返回无在磁盘分配表中登记登记:长度=0,最大长度=申请长度,开始位置申请节点位置空闲情况占用在文件表中登记登记:长度=0,最大长度=建立长度,开始位置分配位置文件类型txt,时间当前时间在打开文件表中登记登记:信息和文件表中类似显示创建成功返回(2) 写文件:write(文件名,开始位置,字符串)模拟文件系统进行“建立文件”的处理流程如下:开始查询打开文件表查询文件表在打开文件表里?不在在文件表里?显示无文件返回不在写进模拟磁盘在在读取文件记录write参数合法?合法显示成功返回显示参数非法非法(3) 读文件:read(文件名,开始位置,长度)模拟文件系统进
12、行“读取文件”的处理流程如下:开始查询文件表在打开文件表里?不在在文件表里?显示无文件返回不在在在读取文件记录read参数合法?非法显示参数非法返回根据参数读取模拟磁盘里的记录返回合法(4) 显示文件所有内容 type(文件名)和read方法类似,只不过是在参数上显示文件所有内容,故不再重复画流程图(5) 删除文件delete(文件名)模拟文件系统进行“删除文件”的处理流程如下:开始查询打开文件表显示被进程占用无法删除在打开文件表里?在不在在查询文件表返回在文件表里?显示无此文件返回不在删除该文件节点定位该文件在磁盘分配表中的节点,置标志为空闲删除打开文件表中该文件条目返回显示删除成功(6)
13、重命名文件ren(文件名,新文件名)模拟文件系统进行“重命名文件”的处理流程如下:给文件赋新名不在显示无此文件在文件表里?查询文件表在不在在在打开文件表里?显示被进程占用无法重命名查询打开文件表开始返回返回显示重命名成功返回(7) 查询文件属性ask(文件名)模拟文件系统进行“查询文件属性”的处理流程如下:开始查询打开文件表显示文件属性文件名,类型,长度打开进程数创建时间在打开文件表里?在不在返回查询文件表在文件表里?显示无此文件返回不在显示文件属性文件名,类型,长度,创建时间返回在(8) 关闭文件close(文件名)模拟文件系统进行“关闭文件”的处理流程如下:开始查询打开文件表显示此文件没有
14、被打开在打开文件表里?不在在返回文件打开数openCount=0?显示:计数器减1大于0删除打开文件表中该文件条目显示删除成功返回返回五、程序运行结果及分析1.程序主界面2.输入create ?,显示命令的帮助3.创建一个长度为2000的文件 create what 2000 显示创建文件成功,并显示刚创建的文件信息 还有友情提示,create进程打开了文件what,需要用 close命令关闭4.往文件里写入内容 write what 0 welcome! 显示成功写入,用type命令显示刚写入的内容,显示正确5.继续从中间写入内容write what 3 test,之后用type命令显示内容
15、,能得到正确结果6.关闭文件 close what当计数器为0,显示成功关闭文件,结果比较满意7.读文件 read what 3 4 读出来 test字符串,结果正确8.查询文件属性 ask what显示了what文件的属性,结果正确,测试成功!对于测试用例,还有很多路径都有测试过,鉴于篇幅,就不再列出所有可能的路径来进行白盒测试。六、课程设计总结通过本次的课程设计,使我能够正确运用操作系统课程中所学的基本理论和知识,加深了对文件系统基本概念的理解,以及磁盘文件系统的文件操作。还有让我感受挺深的是对软件工程方法的应用。设计一个软件,先要做好需求分析,这一点很重要,如果没有分析好需求,到软件设计
16、的最后,发现所做的功能不符合要求,那么一切都得重做,前面所有的努力都付诸东流。还有比较重要的是,写好E-R图,至少画出语境级的数据流图,以及仔细画好程流程图。在程序设计的开始,由于分析工作做得不够深入和细致,吃了点小苦头。对于这样一个小设计来说,都会吃苦头,要是大工程更是无法想像,有可能会项目失败。以后得加强对软件工程的学习。另外在运用C语言的时候,感觉有点生疏,在组织语言时时而出错,在编程和调试的过程中,经常会出现意想不到的问题,并非每个问题都可以从相关资料中找到解决方法,有些问题是无法预料到的,这就需要通过自己理性的分析得出问题的解决方案。 在设计过程中,查询了不少相关资料,不断的发现问题
17、、提出问题、解决问题。在对自己所编写的源程序段的纠错的过程中,使我更好的理解了操作系统中文件系统的理论知识,同时在编程时用到了模块化的设计思想,这种编程方法可以使我们的编程变的更简单,可以使我们的查错与纠错变的更方便。总的来说通过这次的设计的学习使我学到了很多在平时的学习中学不到的很多东西,通过这次课程设计,使我对操作系统和编程产生兴趣,我想我会在这条路上继续前进下去。我相信,只要不断的严格要求自己,注意培养自己的思维能力,就一定会有更大更辉煌的发展和提高。七、参考文献1美Abraham Silberschatz Peter Baer Galvin Greg Gagne 郑扣根 译.OPERA
18、TING SYSTEM CONCEPTSSixth Edition 操作系统概念.高等教育出版社,2004,012(美)Roger S.Pressman 著 梅宏 译.软件工程-实践者的研究方法.机械工业出版社,2002,093蔡启先.C语言程序设计教程(第二版).重庆大学出版社,2003,074朱战立.数据结构.西安电子科技大学出版社,2003,05八、附录1.程序源代码及注释/ 编译工具:Visual c+ 6.0 / / 作者:小楚*smill 、蓝色的天空 / 邮件:qvb20974151 / / 复制、传播请保留作者信息,谢谢! / /#include #include #inclu
19、de #include #include void fileCreate(char *fileName,int fileLenght); /创建文件void fileDel(char *fileName); /删除文件void fileRead(char *fileName,int postion,int lenght);void fileWrite(char *fileName,int position,char *s); /函数声明void fileAsk(char *fileName); /查询文件属性void fileType(char *fileName); /显示文件内容void
20、fileRen(char *fileName,char *newName); /重命名文件void fileDir(); /列出所有文件void fileClose(char *fileName); /关闭一个文件int requestDisk(int *startPosition,int *maxLength); /分配磁盘空间/模拟磁盘空间char disk10000; /磁盘空间管理 struct freeDiskTable int start; /开始位置int length; /占用长度int maxLength; /最大长度int useFlag; /使用标志,1为占用,0为空闲;
21、/文件表struct fileTablechar fileName20; /文件名字int start; /开始位置int length; /文件长度int maxLength; /最大长度 char fileKind8; /文件种类,此默认为txtstruct tm *timeinfo; /文件创建时间;/打开文件表struct openFileTablechar fileName20; /文件名字char fileKind8; /文件类型int start; /文件开始位置int length; /文件长度int maxLength; /最大长度int openCount; /打开文件的进
22、程数struct tm *timeinfo; /文件创建时间;/typedef struct freeDiskTable LinDataType; /定义链表的数据类型#include LinList.h /链表操作集合SLNode *freeDiskTableHead; /定义磁盘分配表链表 头指针#define MaxSize 100 /定义线性表 最大长度typedef struct fileTable SeqDataType; /定义线性表数据类型#include SeqList.h /线性表操作集合SeqList L; /文件表,模拟文件操作嘛,文件数不多,故可以用 线性表,简化操作
23、_struct openFileTable OFT10; /打开文件表数组int OFT_count=0; /打开文件表占用长度void main()struct orderTable /命令表char name8; ;char orderInput30; /存储用户输入的命令字符串char orderName8; /命令名字char fileName20; /命令参数1,是文件名字char parameter26; /命令参数2,是个数字char parameter330; /命令参数3,是字符串或数字struct orderTable u9; /命令表int i=0; int flag=0
24、; /用户输入串 读写位置 标志int flagOrder=-1;/ LinListInitiate(&freeDiskTableHead);/磁盘空间分配键表初始化struct freeDiskTable temp; temp.length=0;temp.maxLength=10000;temp.start=0;temp.useFlag=0;if(!LinListInsert(freeDiskTableHead,0,temp)printf(初始磁盘空闲表失败!);system(pause);exit(0);/文件表初始化SeqListInitiate(&L); /初始化 文件表/for(i=
25、0;i2;i+) for(int j=0;j2;j+)system(color fc);printf(nnnnnnnnn 计 046 何珠举 操作系统课程设计n);for(int k=0;k30000000;k+);system(cls);system(color f3);printf(nnnnnnnnn 计 046 何珠举 操作系统课程设计n);for(k=0;k);fflush(stdin); /清空缓冲区gets(orderInput); /获取用户输入串if(!strcmp(orderInput,exit)exit(0); /当用户输入 exit 退出程序system(cls); /清
26、屏for(i=0;orderInputi!= &orderInputi!=0;i+)/以空格为界 分解用户输入串orderNamei=orderInputi;flag=i;/保存读写指针if(flag6) /命令名长度 小于6printf(输入的命令有误,请重新输入!n);continue ;orderNamei=0;flagOrder=-1; /初始化标志位,flagOrder 指明命令在命令表中的位置for(i=0;i9;i+)if(!strcmp(orderName,ui.name)flagOrder=i; /记录命令的位置,以便访问break;if(flagOrder=-1)print
27、f(你输入的命令有误!请重新输入!n);continue ;/以空格为界,分解字符串,分解出第一个字符串放到fileName中for(i=flag+1;orderInputi!= &orderInputi!=0;i+)fileNamei-flag-1=orderInputi;fileNamei-flag-1=0; /为字符串数组 置一个结束标志/flag=i; /下一个字符串 读写指针if(!strcmp(fileName,?) /显示命令帮助switch(flagOrder)case 0: printf(创建一个文件 格式 create filenamefilelengthn);printf
28、(例如: create a1 1000 ,将创建名为a1,长度为1000字节的文件n);break;case 1:printf(删除一个文件 格式 delete filename n);printf(例如: delete a1,将删除名为a1的文件n);break;case 2: printf(读取一个文件 格式 read filenamepostionlengthn);printf(例如: read a1 8 3,从a1文件第8个字节开始,显示3字节内容n);break;case 3:printf(写一个文件 格式 write fileNamepostionconten n);printf(
29、例始: write a1 15 test,从a1文件第15字节开始写入 test 字符串n);break;case 4:printf(显示文件的属性,格式 ask filenamen); printf(例如 ask a1 ,将显示文件 a1的属性n);break; case 5:printf(显示文件的所有内容,格式 type filenamen);printf(例如 type a1,将显示文件 a1的所有内容n);break;case 6:printf(重命名一个文件,格式 ren oldFileNamenewFileNamen);printf(例如ren a1 b1 ,将a1改名为b1n)
30、;break;case 7:printf(显示所有文件,例如 dir,将显示所有文件n);break;case 8:printf(关闭文件,格式 close fileNamen);printf(例如,close a1,将关闭文件a1n);break;default:printf(命令错误);getch();elseswitch(flagOrder)/对相应的命令 进行参数处理case 0:int Temp4=1,10,100,1000;int sum=0;int len=0;for(i=flag+1;orderInputi!= &orderInputi!=0;i+)parameter2i-fl
31、ag-1=orderInputi;parameter2i-flag-1=0; /为字符串数组 置一个结束标志flag=i; len=strlen(parameter2); /求字符串数组的长度for(i=0;ilen;i+) /把第二个参数 字符串变成整数sum=sum+(int)parameter2len-i-1-48)*Tempi;fileCreate(fileName,sum); /将命令和参数 传给建文件模块执行break;case 1:fileDel(fileName); /删除文件 break;case 2:int Temp4=1,10,100,1000;int sum=0;int
32、 len=0;int sum2=0;/for(i=flag+1;orderInputi!= &orderInputi!=0;i+)parameter2i-flag-1=orderInputi;parameter2i-flag-1=0;flag=i; len=strlen(parameter2); /求字符串数组的长度for(i=0;ilen;i+) /把第二个参数 字符串变成整数sum=sum+(int)parameter2len-i-1-48)*Tempi;/for(i=flag+1;orderInputi!= &orderInputi!=0;i+)parameter3i-flag-1=orderInputi; /把第三个参数变成整型parameter3i-flag-1=0;flag=i; len=strlen(parameter3);for(i=0;ilen;i+)sum2=sum2+(int)parameter3len-i-1-48)*Tempi;fileRead(fileName,sum,sum2); /调用读文件模块break;case 3:int Temp4=1,10,100,1000;int sum=0;int len=0;/for(i=flag+1;orderInput