操作系统文件系统课程设计实验.docx
《操作系统文件系统课程设计实验.docx》由会员分享,可在线阅读,更多相关《操作系统文件系统课程设计实验.docx(48页珍藏版)》请在冰豆网上搜索。
操作系统文件系统课程设计实验
《操作系统原理》课程设计任务书
题目:
文件系统实现
学生姓名:
学号:
班级:
________________
题目类型:
软件工程(R)指导教师:
一、设计目的
学生通过该题目的设计过程,可以初步掌握操作系统中有关文件系统的原理、软件开发方法并提高解决实际问题的能力。
二、设计任务
用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
要求设计一个n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。
三、设计要求
1.分析设计要求,给出解决方案(要说明设计实现所用的原理、采用的数据结构)。
2.设计合适的测试用例,对得到的运行结果要有分析。
3.设计中遇到的问题,设计的心得体会。
4.文档:
课程设计打印文档每个学生一份,并装在统一的资料袋中,资料袋前面要贴有学校统一的资料袋封面。
四、提交的成果
1.课程设计说明书内容包括
(1)封面(学院统一印制);
(2)课程设计任务书;
(3)中文摘要150字;关键词3-5个;
(4)目录;
(5)正文;(设计思想;各模块的伪码算法;函数的调用关系图;测试结果等)
(6)设计总结;
(7)参考文献;
(8)致谢等。
注:
每一部分是单独的一章,要另起一页写。
2.排版要求
(1)所有一级标题为宋体三号加粗(即上面写的2~8部分,单独一行,居中)
(2)所有二级标题为宋体四号加粗(左对齐)
(3)所有三级标题为宋体小四加粗(左对齐)
(4)除标题外所有正文为宋体小四,行间距为固定值22磅,每个段落首行缩进2字符
(5)目录只显示3级标题,目录的最后一项是无序号的“参考文献资料”。
3.其他要求(班长负责,务必按照以下方式建文件夹)
(1)以班级为单位刻录光盘一张,光盘以班级命名,例如:
“10级计算机科学与技术1班”;
(2)光盘内每人一个文件夹,以学号姓名命名——如“10730101陈映霞”,内容包括任务书、设计文档。
五、各阶段时间安排(共2周)
根据教学计划安排,于2015年12月8日~2015年12月19日安排为期二周的操作系统课程设计。
周次
日期
内容
地点
完成情况
教师签字
第1周
星期一~二
教师讲解设计要求
查找参考资料
教室
图书馆
星期三~五
算法设计,编程实现
教室
第2周
星期一~三
算法设计,编程实现
教室
星期四~五
检查程序,答辩
教室
六、考勤、纪律及注意事项
1.每日准时教室设计,不得无故缺席、早退。
2.独立、按时完成课程设计任务,准时上交资料。
七、主要参考文献
1.汤子瀛,哲凤屏.《计算机操作系统》[M].西安:
西安电子科技大学学出版社.1996年
2.王万森.《计算机操作系统原理》[M].北京:
高等教育出版社.2001年
3.周长林,左万历.《计算机操作系统教程》[M].北京:
高等教育出版社.1994年
4.黄廷辉,王宇英.《计算机操作系统实践教程》[M].北京:
清华大学出版社.2007年5月
5.殷兆麟.《计算机操作系统》[M].北京:
清华大学出版社.2007年3月
6.张尧学,史美林,张高.《计算机操作系统教程》[M].北京:
清华大学出版社.1993年
摘要
文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构,即在磁盘上组织文件的方法。
本次课程设计是为了让我深入了解文件系统的基本结构和学习文件的各种管理方法,加深理解文件系统的内部功能及内部实现,理解文件管理系统的工作过程,加深各种文件操作命令的实质内容和执行过程的了解,更加深刻的理解编程模拟一个简单的文件系统,以实现对文件系统的管理和控制功能,支持用户对自己文件创建、删除、打开、关闭、读取、写入等命令。
关键字:
文件系统;操作系统;
1.1设计目的
课程设计目的是熟悉文件管理系统的设计方法,加深对所学各种文件操作的了解及其操作方法的特点。
通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识,加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用操作系统专业知识的能力。
1.2设计内容
1.本系统初始化了十个用户,每个用户初始化五个文件,最多可拥有十个文件,所以每个用户在此基础上可为自己再创建五个文件,也可以在删除文件后再创建。
2.系统使用create,open,read,write,close,delete,exit来创建文件,打开文件,读文件,写文件,关闭文件,删除文件和显示文件。
3.程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)另外,为打开文件设置了运行文件目录(AFD)。
4.为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。
1.3设计思想
随着信息化进程,文件管理越来越受到重视,并且逐渐成为国内外业界研究的热点。
在现有的操作系统中,几乎都是通过文件系统来组织和管理计算机中所存储的程序和数据等大量的文件。
在现代OS中,几乎是通过文件系统来组织和管理在计算机中存储和大量程序和数据的,文件系统的管理功能,是通过把它所管理的程序和数据组织成一系列文件的方法来实现的。
而文件则是指具有文件名的若干相关元素的集合,元素通常是记录,而记录又是一组有意义的数据项的集合。
通过分析,可知文件系统对大多数文件的操作,过程大致都是这样两步
第一步是通过检索文件目录来找到指定文件的属性及其在外存上的位置.
第二步是对文件实施相应的操作,如读文件或写文件。
为了便于管理和控制文件,根据系统管理员或用户所规定的存取控制属性,将文件分为只读文件、读写文件和只执行文件三类。
而文件系统的模型主要分为三个层次,分别是对象及其属性、对对象的操纵和管理的软件集合、文件系统接口,对象及其属性,中间层对对象进行操纵和管理的软件集合,最高层是文件系统提供给用户的接口。
用户通过文件系统所提供的系统调用实施对文件的操作,如创建文件、删除无文件、读文件、写文件等,为了方便用户使用文件而提供了更多对文件的操作,如打开和关闭文件。
1.4需求分析
功能划分:
本模拟系统主要针对文件的管理和操作名主要有:
创建用户、文件、文件夹,读文件,写文件,执行文件,关闭文件,删除用户、文件夹、文件的功能。
创建用户、文件、文件夹:
在对系统发出操作命令之前必须先登录用户,然而登录之前必须创建该用户。
在创建完后,可通过登录用户来创建文件和文件夹。
在创建文件时可设置文件的属性和输入文件的内容。
读文件:
读取任何已创建的只读或读写文件的内容;如果所要读的文件不是可读文件时,系统会显示该文件不可读;如果所读文件不存在,系统会显示文件不存在。
写文件用户可写或重写读写文件中的内容,并保存文件中的重写内容,以供下次读取;当所要写的文件不是可写的文件时,系统会显示该文件不可写;当所要写的文件并不存在时,系统会显示该文件不存在。
执行文件:
登录用户后,用户可执行系统中已创建的执行文件;当该文件不是可执行文件时,系统会显示该文件不可执行;当该文件不存在时,系统将会显示该文件不存在。
关闭文件:
可通过选择关闭文件的功能选项,来关闭系统中所有打开的文件,如果没有文件被打开,则系统会显示没有文件打开。
删除用户、文件、文件夹:
用户可通过选择删除的功能选项来删除不想再保存的文件和文件夹,删除后,用户会自动注销;当选择删除用户的功能选项时,系统会删除该用户,以及该用户所创建的所有文件和文件夹。
1.5小组分工
组长:
苏颜回
负责概述和概要设计两个模块并积极寻找各种书籍资料。
组员:
苏晓东
负责程序详细设计,总结,参考文献,以及程序的调试,并将文档模块总合在一起。
2概要设计
2.1总体设计思路
运行程序时,首先系统要进行初始化,然后等待输入操作类型,但是在创建用户之前,只能进行显示目录和退出的操作。
当用户创建成功后,即可通过登录用户来创建文件和文件夹。
在输入操作选项之后,必须先登录用户,当确认用户身份正确后,系统才能根据指定的命令进行操作,否则,不能进行操作,必须创建用户后,才能以该用户的身份进行操作。
操作完之后,用户会自动退出,每发出一个操作命令,用户必须登录一次。
只有在发出的命令是显示目录或退出或返回上级目录时,才不需要用户的登录。
2.2总体流程图
图2.1总体流程图
2.3部分子模块程序流程图
(1)打开文件的程序流程图:
图2.2打开文件流程图
打开文件:
首先输入文件名程序判断文件是否存在,若不存在程序错误提示,若存在則提示是否打开,打开文件程序运行完成。
(2)关闭文件的程序流程图:
图2.3关闭文件流程图
关闭文件:
可通过选择关闭文件的功能选项,来关闭程序中所有打开的文件,如果没有文件被打开,则程序错误提示。
(3)写文件的程序流程图:
图2.4系统开始程序
写文件:
用户可写或重写读写文件中的内容,并保存文件中的重写内容,以供下次读取;当所要写的文件不是可写的文件时,系统会显示该文件不可写;当所要写的文件并不存在时,系统会显示该文件不存在。
(4)删除文件的程序流程图:
图2.5删除文件流程图
删除文件:
用户可通过选择删除的功能选项来删除不想再保存的文件和文件夹,删除后,用户会自动注销;当选择删除用户的功能选项时,系统会删除该用户,以及该用户所创建的所有文件和文件夹。
3详细设计
3.1实现原理
本程序是一个文件系统模拟程序,模拟文件管理的工作过程。
本程序设计一个最多有10个用户的文件系统,实现文件系统的模拟管理过程,可以进行创建用户、删除用户、创建文件、删除文件、创建文件夹、删除文件夹、读文件、写文件、执行文件、打开文件、关闭文件、显示目录等操作。
程序设置了主目录MFD、用户文件目录UFD和用户文件夹目录UDD,为打开文件设置了运行目录AFD。
文件保护简单使用了保护码:
只读为’r’,读写为’wr’,只执行为’do’,其他则表示不允许读写、执行。
3.2数据结构说明
Typedefstructfund{…}是文件的数据结构,即用户文件目录。
Typedefstructudd{…}是文件夹的数据结构,即用户文件夹目录。
Typedefstructmfd{…}是用户的数据结构,即主文件目录。
Typedefstructafd{…}是运行中文件的数据结构。
Typedefstructsfile{…}是指向文件的索引节点的数据结构。
3.2.1用户的数据结构
typedefstructmfd{
charusername[10];/*用户名*/
structufd*link;/*指向该用户的第一个文件*/
structudd*clink;/*指向该用户的第一个文件夹*/
用户的信息的结点,包含用户名、指向用户文件和文件夹的两个指针。
所以的结点都存放在一个名字为filesystem的数组中。
3.2.2文件夹的数据结构
typedefstructudd{
charfoldername[10];/*文件夹名*/
structufd*clink;/*指向该文件夹的第一个文件*/
structudd*cnext;/*指向该文件夹的第一个文件夹*/
structudd*link;/*指向同级文件夹*/
用来描述文件夹的信息的结点。
3.2.3文件的数据结构
typedefstructufd{
charfilename[10];/*文件名*/
charfilecon[100];/*文件内容*/
charprocode[8];/*属性*/
intlength;/*文件长度*/
structufd*nextfile;/*指向下一个文件*/
用来描述文件信息的数据结构,用户的文件结点用一条链链接在一起。
3.2.4运行文件的数据结构
typedefstructafd{/*运行文件目录*/
charfilename[10];/*打开文件名*/
charfilecon[100];//文件内容
charprocode[4];//属性
intrwpointer;/*读写指针*/
存放运行文件的信息,标示着某文件正在执行,当关闭文件时,释放结点。
3.2.5共享文件的结点的数据结构
typedefstructsfile{
charusername[10];//用户名
structufd*file;//共享的文件
structsfile*next;//指向下一个共享文件的指针
每一个文件都有一个共享的结点,该节点存放文件的信息、文件的创造者的名字和指向下一个共享文件的指针,所有文件的共享结点链接在一起,由sharefile指针指向该共享链。
3.3重要函数说明
voiddisplayallfile()是用于显示目录的函数;在实验中,我将创建的所有用户都存储在一个结点数组中,每个用户结点都有指向其文件和文件夹的指针,通过遍历结点数组来遍历用户,通过用户的指针来遍历用户的文件和文件夹。
voidcreateuser()是用于创建用户的函数;将创建的用户以mfd结点的结构存储在filesystem数组中。
intfindusername(char*username)是用户查找用户的函数,当找到函数时返回保存用户的节点的下标;当返回值大于等于用户个数时,表示找不到用户。
voiddeleteuser()是用于删除用户的函数;在filesystem数组中寻找指定名字的用户,当找到该用户时,将用户从数组中删除,并将数组中该用户后面的其他用户的下标往前移一位,如果找不到指定用户,则输出:
“用户不存在!
删除失败!
”。
sfile*findsharefile(char*filename)是用于查找共享文件的函数,当找到共享文件锁时返回指向该文件的节点指针,如果找不到,则返回空。
UFD*findfilename(char*filename,UFD*filepointer)是查找文件的函数,返回指向特定文件名的指针,或返回值为NULL。
UDD*findfoldername(char*foldername,UDD*folderpointer)是查找文件夹的函数,返回指向特定文件名的指针,或返回值为NULL。
voiddisplayfile(UFD*link)是用于显示文件属性的函数。
voidcreatefile()是用于创建文件的函数;当要创建文件时,首先输入登录的用户名,如果该用户不存,输入是否创建用户,否则退出,是的话则创建用户,然后再创建文件;当用户存在时,则直接创建文件。
创建文件时,若该登录的用户的文件中没有同名文件,则直接创建,否则输出:
“文件名已存在,请输入新的文件名!
”,通过输入新的文件名后再创建文件。
创建一个文件,都会为文件创建一个共享结点,添加到共享链中。
voidcreatefolder()是用于创建文件夹的函数;首先输入登陆的用户名,然后再创建,步骤与穿件文件相似,只是没有共享结点。
voiddeletefile()是用于删除文件的函数;首先查找文件所属用户,然后再查找文件,找到则删除,否则删除失败。
voiddeletefolder()是用于删除文件夹的函数。
AFD*openfile()是用于打开文件的函数,当找到文件时打开文件,创建该文件的运行文件结点,并返回;找不到文件时,返回值为NULL;当要打开一个文件之前,首先登录,如果登录的用户不存在则不能打开文件,如果用户存在,输入需要打开的文件名,如果用户没有创建该文件则寻找共享文件中是否存在其他用户创建的该文件,有则打开,为文件创建运行文件的结点,没有则输出不存在该文件。
在对文件的所有操作之前都需要先调用该函数打开文件,才能进行操作。
voidclosefile()是用于关闭文件的函数;关闭文件时释放文件的运行文件结点。
voidreadfile()是用于读文件的函数;打开文件后首先判断文件是否可读,如果是可读文件则读出文件中的内容,否则输出文件不可读。
voidwritefile()是用于写文件的函数;首先打开文件,判断文件是否可写。
voidexecutefile()是用于执行文件的函数。
//菜单,即有关用户界面的函数
voidmenu()是主菜单,程序执行时就会显示该菜单,初始化界面,并通过该菜单选择相应的功能选项。
voidmenu1()是menu的子菜单,包含了所有的创建功能选项和返回上级菜单的选项;
voidmenu2()是menu的子菜单,包含了所有的删除功能选项和返回上级菜单的选项;
voidmenu3()是menu的子菜单,包含了对文件的各种操作选项、返回上级菜单的选项和显示目录的选项。
4调试分析
4.1测试结果
图4.1
创建用户、文件夹、文件:
从文件系统中找到存放文件的空间,在目录中为该文件添加新目录项
读文件(read)
给出文件名以及内存地址,用于存放读出的下一个文件块,文件系统查找目录,找到对应的文件目录项,系统保存一个读指针指出下一个操作开始的位置:
读指针每个进程都不一样
写文件(write)
给出文件名和需要写入文件的信息,文件系统查找目录,从文件目录项中找到文件的位置,文件系统保存了一个写指针,指出下一个写操作开始的位置。
删除文件、用户(delete)
查找文件的目录所在,找到给定文件名对应的目录项,释放文件所占用的所有空间,删除对应的目录或用户。
4.2系统优缺点分析
文件系统优点:
保存形式外存,可随时更改;无需知道实际地址;既可顺序存取,也可直接存取;以记录为单位;界面明朗用户操作方便;
文件系统缺点:
数据重复时程序容易自动关闭,程序简单只能完成基本的操作,写入过于庞大的数据应用程序会崩溃。
总结
通过做操作系统课程设计,怎样如何打开硬盘上的文件、如何读取硬盘上的文件、如何将创建的文件和文件夹保存到硬盘,通过XX、翻阅书籍查找资料,学习了如何打开文件、关闭文件、查找文件和删除文件的函数。
用文件夹的方式保存用户,一个用户用一个文件夹来表示,这样就能把用户保存在硬盘上,但是如果为文件创建一个索引节点的话又该如何保存节点,而且如何保存保存指向节点的指针。
想通了一个问题又有另一个问题出现,实在没办法,就只能用虚拟的形式来实现了。
这次课程设计,我学习操作系统的文件系统,学会了调试之外,也更好地了解了文件系统和文件系统对文件的操作,如何实现共享,通过翻阅相关书籍和网上查询相关资料,了解了更多有关C的以前没用过的函数,也对VC++6.0有了进一步的了解。
参考文献
1.汤子瀛《计算机操作系统》[M].西安:
西安电子科技大学学出版社.1996年
2.王万森.《计算机操作系统原理》[M].北京:
高等教育出版社.2001年
3.左万历.《计算机操作系统教程》[M].北京:
高等教育出版社.1994年
4.黄廷辉,王宇英.《计算机操作系统实践教程》[M].北京:
清华大学出版社.2007年5月
5.殷兆麟.《计算机操作系统》[M].北京:
清华大学出版社.2007年3月
6.史美林,张高.《计算机操作系统教程》[M].北京:
清华大学出版社.1993年
致谢
操作系统的课程设计马上要结束了,在操作系统课程设计期间,马老师和陈老师给了我极大的帮助,不断给我们指出错误,纠正错误,一遍遍不厌其烦的给我们修改代码,才使得我们能够在规定的时间内保质保量完成题目要求。
同时也要感谢友好,乐于助人的同学帮助,给予我指导和帮助。
通过和同学的共同努力,我深刻的认识到团队的力量就是知识,同时学习到了操作系统课程设计给我的启发和知识点的完善。
通过老师的教导和提示,在本次课设中我学习到了很多东西,并通过查阅资料我学习到了操作系统更深层次的知识。
附录:
源程序
#include
#include
#include
#include
#include
#pragmawinning(disable:
4996)
intchoice;/*操作类型*/
intex,num;
typedefstructufd{
charfilename[10];/*文件名*/
charfilecon[100];/*文件内容*/
charprocode[8];/*属性*/
intlength;/*文件长度*/
structufd*nextfile;/*指向下一个文件*/
/*typedefstructudd{
charfoldername[10];/*文件夹名
structufd*clink;/*指向该文件夹的第一个文件
structudd*cnext;/*指向该文件夹的第一个文件夹
structudd*link;/*指向同级文件夹
typedefstructmfd{
charusername[10];/*用户名*/
structufd*link;/*指向该用户的第一个文件*/
structudd*clink;/*指向该用户的第一个文件夹*
typedefstructprotected_flag{
charcode[4];
typedefstructafd{/*运行文件目录*/
charfilename[10];/*打开文件名*/
charfilecon[100];
charprocode[4];
intrwpointer;/*读写指针*/
PROflag[3]={
"1",/*只读*/
"2",/*读写*/
"3"/*可执行*/
};
UFD*rw_pointer;/*读写指针*/
AFD*afd=NULL;
MFDfilesystem[10];
voiddisplayallfile()
{
inti;
UFD*p;
/*UDD*q;*/
system("cls");/*清屏*/
printf("\t****************\n");
printf("\t\t显示目录\n");
printf("\t****************\n");
for(i=0;i{
printf("用户:
%s目录如下!
\n",filesystem[i].username);
p=filesystem[i].link;
/*q=filesystem[i].clink;*/
while(p)
{
printf("\t文件名:
%s\t||",p->filename);
printf("文件属性:
%s\t||",p->procode);
printf("文件长度:
%d\n",p->length);