操作系统课程设计.docx
- 文档编号:5405431
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:20
- 大小:392.17KB
操作系统课程设计.docx
《操作系统课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计.docx(20页珍藏版)》请在冰豆网上搜索。
操作系统课程设计
操作系统
课程设计报告
学院:
计算机科学与工程学院
班级:
网络工程四班
学生姓名:
申茜
学号:
200730491347
指导老师:
贺小箭
提交日期:
2010-2-28
设计一:
设计任务:
模拟Linux文件系统
在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟Linux文件系统。
1.在现有机器硬盘上开辟100M的硬盘空间,作为设定的硬盘空间。
2.编写一管理程序simdisk对此空间进行管理,以模拟Linux文件系统,要求:
(1)盘块大小1k
(2)空闲盘块的管理:
Linux位图法
(3)结构:
超级块,i结点区,根目录区
3.该simdisk管理程序的功能要求如下:
(1)info:
显示整个系统信息(参考Linux文件系统的系统信息),文件可以根据用户进行读写保护。
目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开。
(2)cd…:
改变目录:
改变当前工作目录,目录不存在时给出出错信息。
(3)dir…:
显示目录:
显示指定目录下或当前目录下的信息,包括文件名、物理地址、保护码、文件长度、子目录等(带/s参数的dir命令,显示所有子目录)。
(4)md…:
创建目录:
在指定路径或当前路径下创建指定目录。
重名时给出错信息。
(5)rd…:
删除目录:
删除指定目录下所有文件和子目录。
要删目录不空时,要给出提示是否要删除。
(6)newfile…:
建立文件。
(7)cat…:
打开文件。
(8)copy…:
拷贝文件,除支持模拟Linux文件系统内部的文件拷贝外,还支持host文件系统与模拟Linux文件系统间的文件拷贝,host文件系统的文件命名为
将windows下D:
盘的文件\data\sample\test.txt文件拷贝到模拟Linux文件系统中的/test/data目录,windows下D:
盘的当前目录为D:
\data,则使用命令:
simdiskcopy
\data\sample\test.txt/test/data
或者:
simdiskcopy
sample\test.txt/test/data
(9)del…:
删除文件:
删除指定文件,不存在时给出出错信息。
(10)check:
检测并恢复文件系统:
对文件系统中的数据一致性进行检测,并自动根据文件系统的结构和信息进行数据再整理。
4.程序的总体流程为:
(1)初始化文件目录;
(2)输出提示符,等待接受命令,分析键入的命令;
(3)对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。
设计二:
设计任务:
模拟文件系统的前端操作shell
实现一个简单的shell(命令行解释器)。
将设计一的管理程序simdisk作为后台进程运行,利用本设计任务的shell操作simdisk。
本设计任务在于学会如何实现在前端的shell进程和后端的simdisk进程之间利用共享内存进行进程间通信(IPC)。
设计三:
设计任务:
模拟文件系统的操作管理
实现多个进程同时对模拟文件系统进行操作。
设计管理程序simdisk的用户访问权限管理。
访问模拟文件系统的每个进程都属于某个用户,管理程序simdisk根据其访问权限决定其对模拟文件系统的操作。
对模拟文件系统的操作要求做到:
共享读,互斥写。
本设计任务在于学会如何实现信息的安全管理和进程同步。
课程设计目的
本设计的目的是实现操作系统和相关系统软件的设计,其中涉及进程编程、I/O操作、存储管理、文件系统等操作系统概念。
课程设计要求
(1)对课程设计进行认真分析,列出实验具体步骤,写出符合题目要求的程序清单,准备出调试程序使用的数据。
(2)以完整的作业包的形式提交原始代码、设计文档和可运行程序。
提交的光盘应当包括:
设计题目,程序清单,运行结果分析,所选取的算法及其优缺点,以及通过上机取得了哪些经验。
程序清单要求格式规范,注意加注释(包含关键字、方法、变量等),在每个模块前加注释,注释不得少于20%。
课程设计要求同时上交打印文档,设计报告包括设计题目,算法分析,关键代码及其数据结构说明,运行结果分析以及上机实践的经验总结。
一、实现思想
本文件系统采用分级目录,其中第一级对应于用户账户,第二级对应于用户账号下的文件。
本文件系统默认有5个用户账号,一个root为管理员账户,另外为普通用户的账号,user1—user5。
二、实现方法
当初始化时先malloc一块内存作为存储空间,将该块内存划分为(C,D,E三个卷),每个卷里都有目录区和数据区,所有文件内容和目录信息保存在内存中。
文件属性包括:
文件名,所有者,创建时间,最后访问时间,文件大小,数据区指针或I-node指针等。
文件数据可以用链接方式存储。
当程序运行结束时回收内存,信息不需要保存到磁盘,下次重新运行程序时重头开始。
三、主要数据结构
3.1用户类型
typedefenum
{
admin,//root,管理者账户,可以对各用户的文件夹进行操作
comm//user1,user2,user3,user4,user5,user6,user7,user8
}UserType;
3.2各用户对文件的操作权限
typedefenum
{
pub,//权限开放,各用户都可以全权操作
protect,//保护,对非创建者或管理员,只能查看
pri//非创建者或管理员,不能操作
}FileAccess;
3.3文件元素类型
typedefenum
{
file,//文件标志
dir//文件夹标志
}FileType;
3.4文件状态
typedefenum
{
closed,//关闭
opened,//打开
reading,//读取
writing//写入
}FileStatus;
3.5一个文件索引结构
typedefstruct
{
unsignedIndex;//文件元素索引编号
charFileName[NAME_LEN];//文件元素名
charParentName[NAME_LEN];//父节点名
unsignedFileBlockId;//文件元素所在物理块编号
unsignedFileLevel;//文件元素所在层次,层+文件元素名为一个文件元素的逻辑位置
unsignedeffect;//是否有效,0-无效,1-有效
charCreateTime[18];//创建时间,日期格式:
月/日/年时/分/秒
}FileIndexElement;
3.6文件索引结构或目录表项
typedefstruct
{
FileIndexElement*FIStart;//文件系统中的文件索引起始位置
unsignedFILen;//文件索引的最大长度
unsignedFICount;//文件索引数量
}FileIndex;
3.7文件块的结构
typedefstructfb
{
unsignedFileBlockId;//文件块编号
unsignedBLOCK_SIZE;//文件块的容量
char*FileBlockAddr;//文件块地址
structfb*next;//下一个文件块的地址
}FileBlock;
3.8文件系统的位示图结构
typedefstruct
{
unsignedBITMAP_LEN;//文件位示图长度
char*BMStart;//位示图的起始指针
}BitMap;
3.9文件系统结构
typedefstruct
{
char*FSStart;//文件系统的起始地址
unsignedSuperBlockSize;//文件系统的容量
BitMapbm;//文件系统中的位示图
unsignedBLOCK_COUNT;//文件系统中文件块的数量
FileBlock*head;//文件系统中文件块首地址
FileIndexFI;//文件系统中的文件索引
}SuperBlock;
3.10户信息
typedefstruct
{
char*UserName;//用户名称
UserTypeut;//用户类型
}User;
3.11文件系统中的元素结构
typedefstructfse//文件系统中的元素结构,包括文件和文件夹
{
structfse*parent;//指向自己的父亲节点
unsignedFileLevel;//文件元素所在层次,层+文件元素名为一个文件元素的逻辑位置
charFileName[NAME_LEN];//文件元素名
unsignedFileBlockId;//文件元素所在物理块编号
unsignedFileElemLen;//文件元素的长度
FileTypeType;//文件元素类型
FileAccessAccess;//文件元素可供操作的权限
UserCreator;//文件创建者
charCreateTime[18];//创建时间,日期格式:
月/日/年时/分秒
charLastModTime[18];//最后一次修改时间
char*FileData;//一个文件的数据开始地址,文件夹时该值为NULL
FileStatusfileStu;//如果是一个文件表示文件当前的状态
}FSElement;
3.12系统当前状态
typedefstruct
{
UserCurrentUser;//当前用户
unsignedFileLevel;//用户所在文件系统层
FSElement*CurrParent;//当前层的父节点
char*CurrentPath;//当前路径
}CurrentStatus;
五、总程序流图
用户错误
用户正确
是
否
六、主要函数实现
6.1多级目录
可通过Mkdir()函数来生成目录,并可有多级子目录;
6.2用户登录
函数:
Login();
算法:
用户输入用户名,以及密码,经系统验证正确后,可以成功登陆文件系统;如果用户名或密码错误,则需要重新登陆,且登陆次数不可以超过三次;
6.3系统初始化
函数:
Init();
算法:
首先,为系统malloc一块内存空间,如果分配的空间为空则返回分配失败;如果分配成功,则初始化文件系统的容量、位图长度、位图起始指针,同时初始化系统的文件索引,建立文件区与数据区;并初始化根目录;
6.4文件的创建
函数:
Create();
算法:
如果文件名为空则提示错误并退出函数;否则,创建新文件的文件属性,包括可操作性权限、用户名、文件类型(文件或目录)、内容、父节点等;
6.5文件的打开
函数:
Open();
算法:
首先,读取要打开文件的属性,与选择打开的文件属性相比较,看是否一致,如果一致,则打开文件;否则,文件打开失败,退出函数;
6.6文件的读
函数:
Read();
算法:
先比较当前文件的属性是否一致,如果一致再检查文件是否已经打开,若未打开则需要先打开文件才能读文件;否则,文件无法读取,提示错误,退出函数;
6.7文件的写
函数:
Write();
算法:
先比较当前文件的属性是否一致,并检查文件的状态,看文件是否已经打开,若未打开则提示错误并退出函数;否则,将容不超过数据区的大小的内容写入文件;
6.8拷贝文件内容
函数:
Copy();
算法:
首先检查文件属性是否一致,若一致则将第一个文件的内容读出来,然后把内容写到另一个文件里面去,并且覆盖先前的内容;若不一致,则提示错误并退出函数;
6.9将一个文件内容附加到另一个文件尾部
函数:
Append();
算法:
首先检查文件属性是否一致,若一致,则将第一个文件的内容拷贝出来,找到第二个文件,并将内容写在第二个文件的内容的后面;否则,提示错误并退出函数;
6.10文件关闭
函数:
close();
算法:
选择要关闭的文件,并比较文件属性,若一致,将将文件关闭并退出函数;若不一致,检查当前目录是否为空,若为空则没有文件可以关闭,此时,提示错误并退出函数;
6.11删除文件
函数:
delete();
算法:
选择要删除的文件,比较文件属性,若一致则将文件删除,并修改文件可用性为不可用;否则,提示错误并退出函数;
6.12创建目录(建立子目录)
函数:
mkdir();
算法:
在当前路径下,若要创建的目录名非空,则创建目录,并初始化目录属性;否则,提示错误并退出函数;
6.13改变当前目录
函数:
cd();
算法:
通过用户指定路径,可以进入不同的盘符,或不同的目录;否则,提示错误并退出函数;
6.14列出文件目录
函数:
dir();
算法:
列出当前目录下的文件及目录,以及它们的最后修改时间,文件大小等;否则,提示错误并退出函数;
6.15删除目录
函数:
rmdir();
算法:
比较目录属性,若属性一致则将指定的目录删除,并修改指针;否则,提示错误并退出函数;
6.16退出
函数:
logout();
算法:
退出文件系统并释放内存,删除创建的所有文件及目录信息;
七、运行结果分析
7.1程序首次运行的时候,首先会进入初始化界面,界面上有“WELCOMELSJ”字样,此时系统正在初始化文件系统;
7.2文件系统进入用户登陆界面,如下图所示,用户键入用户名(user1~user5,root),回车,然后输入密码,系统会进行身份验证,当用户名及密码均正确的情况下,用户可以成功登陆系统;
7.3当用户成功登陆系统后,就会出现如下图所示的帮助信息,用户可以在此界面选择不同的命令来对文件系统进行操作,具体命令及操作语法,可参照下图;
7.4用户首先建立一个目录,使用命令mkdira,则系统会生成一个名为a的目录;然后在a目录下,创建文件b,若在没有打开的文件的情况下,不能对文件进行写操作;若文件b已打开,则可以将部分内容(例如:
Howareyou!
)输入文件b内,并将其显示出来,具体如下图所示;
7.6用户在创建多个文件后,用dir命令显示输出,其中包括文件名以及文件创建时间;
7.7测试delete函数,如下图所示
7.8测试创建目录,在新目录中创建文件,并打开写入数据,最后显示数据,并将文件及目录删除,如下图所示
八、总结
这次操作系统的课程设计主要考察的是Linux文件系统,复习所学Linus文件系统的结构,文件的存储,文件的初始化,文件的创建,打开,读写,关闭等基本操作,本次课程设计的完成有一定的难度,我通过学习网上相关的资料,熟悉课本的相关说明,相关例子,初步完成了本次课程设计,但是,在这个程序的某些地方存在着不足,使得功能不够完善。
通过编写这个课程设计我也学习了一些函数的用法,如cout< strlwr(s)只转换s中出现的大写字母,不改变其它字符。 返回指向s的指针。 Gets()从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在str指针所指向的字符数组中。 换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串。 在课程设计过程中,我也体验到了一些人生的感悟,怎么样去制定计划? 怎么样去实现这个计划? 并掌握了在执行过程中怎么样去克服心理上的不良情绪,要收获到成功快乐的果实,必定要先付出辛苦的努力。 虽然程序到上交之时,还是没有完全达到目标,这是个人的水平所限,还需要更多的付出和时间去提高和完善它,尽管如此,这次课程设计已经让我学到很多了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计