闽 南 师 范 大 学 操作系统课程设计 模拟一个简单二级文件管理系统.docx
《闽 南 师 范 大 学 操作系统课程设计 模拟一个简单二级文件管理系统.docx》由会员分享,可在线阅读,更多相关《闽 南 师 范 大 学 操作系统课程设计 模拟一个简单二级文件管理系统.docx(16页珍藏版)》请在冰豆网上搜索。
闽南师范大学操作系统课程设计模拟一个简单二级文件管理系统
闽南师范大学
操作系统课程设计
模拟一个简单二级文件管理系统
姓名:
学号:
系别:
计算机学院
专业:
网络工程
年级:
指导教师:
全秀祥、闫格
年月日
一、课程设计项目介绍
项目介绍:
通过研究Linux的文件系统结构,模拟设计一个简单二级文件管理系统,第一级为主目录文件,第二级为用户文件。
磁盘空间分配表,采用链表结构,每个节点保存成模拟磁盘的一个逻辑块的信息,包括块的最大长度,文件占用长度,占用标志。
如果占用标志为0,即该空间可分配给文件。
初始化磁盘空间分配表链表,首先把整个模拟磁盘作为一块,并置占用位为0。
当有进程申请磁盘空间时,从头开始遍历,检查占用位,如果该块可分配,则检查块大小,若块长度大于或等于申请空间大小,则把块的前一部分(等于申请大小)分配给文件,并置标志位为占用。
剩下的大小作为一个新块,作为一个新节点插入到节点的后边,标志位为可用。
这样就实现了模拟磁盘的线性分配。
设计目的:
通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。
进行操作系统课程设计主要是在学习操作系统课程的基础上,在完成操作系统各部分实验的基础上,对操作系统的整体进行一个人模拟,通过实践加深对各个部分的管理功能的认识,还能进一步分析各个部分之间的联系,最后达到对完整系统的理解。
同时,可以提高运用操作系统知识解决实际问题的能力,锻炼实际的编程能力,创新能力及团队组织、协作开发软件的能力,还能提高调查研究,查阅技术文献,资料以及编写软件设计文档的能力。
通过编程实现这些算法,更好地掌握了操作系统的原理及实现方法,提高综合运用各专业课知识的能力,掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统地设计和实现思路,并了解操作系统的发展动向和趋势。
最重要的是,能提高自己实际动手操作能力和独立思考能力,让我们受益匪浅。
2、总体设计
此二级文件管理系统包含的功能包括:
登录到文件管理系统,创建文件,打开文件,关闭文件,删除文件,写文件,读文件,创建目录,删除目录,修改目录表,显示目录信息。
总体结构:
#defineMEM_D_SIZE1024*1024//总磁盘空间为1M
#defineDISKSIZE1024//磁盘块的大小1K
#defineDISK_NUM1024//磁盘块数目1K
#defineFATSIZEDISK_NUM*sizeof(structfatitem)//FAT表大小
#defineROOT_DISK_NOFATSIZE/DISKSIZE+1//根目录起始盘块号
#defineROOT_DISK_SIZEsizeof(structdirect)//根目录大小
#defineDIR_MAXSIZE1024//路径最大长度为1KB
#defineMSD5//最大子目录数5
#defineMOFN5//最大文件深度为5
#defineMAX_WRITE1024*128//最大写入文字长度128KB
structfatitem//size8,定义磁盘
{};
structdirect//定义文件/目录信息
{};
structopentable//定义打开表
{};
structfatitem*fat;//FAT表
structdirect*root;//根目录
structdirect*cur_dir;//当前目录
structopentableu_opentable;//文件打开表
intfd=-1;//文件打开表的序号
char*bufferdir;//记录当前路径的名称
char*fdisk;//虚拟磁盘起始地址
voidinitfile();//申请磁盘空间
voidformat();//初始化
voidenter();//进入操作
voidhalt();//结束操作
intcreate(char*name);//创建文件
intopen(char*name);//打开文件
intclose(char*name);//关闭文件
intwrite(intfd,char*buf,intlen);//写文件
intread(intfd,char*buf);//读文件
intdel(char*name);//删除文件
intmkdir(char*name);//创建目录
intrmdir(char*name);//删除目录
voiddir();//显示目录
intcd(char*name);//修改目录
voidprint();
voidshow();
Intmain();//主函数
原理框图:
3、详细设计
该系统采用菜单方式与用户交互,实现文件操作,各菜单具体功能如下:
1、创建文件:
在某用户下建立一个或多个指定名字的文件,即在目录中增加一项,不考虑文件的内容,文件中也可以保存一条或多条记录,文件名不能大于8字节,不能允许重名,对于重名文件给出错误信息。
2、打开文件:
打开已经建立的文件,任何文件必须先打开后使用,包括读、写和查看显示,若要打开没有建立的文件,返回错误提示。
不允许同时打开太多文件。
3、删除文件:
删除已经建立的文件,若文件已经被打开,则先关闭再删除。
4、关闭文件:
关闭已经打开的文件,若文件内容被修改,则需要保存新的内容。
5、读文件:
读某个被打开的文件的记录内容,读出记录后,可以选择对文件记录进行修改或删除操作,也可不做任何改动,直接返回主菜单。
6、写文件:
对打开的文件写入记录数据。
7、显示目录:
显示用户文件表。
8、创建目录:
在有空闲磁盘块的情况下创建新的目录,目录名不能大于8字节,不允许重名,
9、删除目录:
删除已经存在的目录,删除指定目录及其下的全部文件和子目录。
如果指定目录为空,可直接删除,否则给出用户提示是否删除。
10、退出操作:
退出当前操作,直接退出程序。
详细结构设计:
voidinitfile()//申请磁盘空间
{
fdisk=(char*)malloc(MEM_D_SIZE*sizeof(char));//申请1M空间
format();
}
voidformat()//初始化
{
inti;
FILE*fp;
fat=(structfatitem*)(fdisk+DISKSIZE);//计算FAT表地址,引导区向后偏移1k
/*-----初始化FAT表------------*/
fat[0].item=-1;//引导块
fat[0].em_disk='1';
for(i=1;i{
fat[i].item=i+1;
fat[i].em_disk='1';
}
fat[ROOT_DISK_NO].item=-1;//存放根目录的磁盘块号
fat[ROOT_DISK_NO].em_disk='1';
for(i=ROOT_DISK_NO+1;i{
fat[i].item=-1;
fat[i].em_disk='0';
}
root=(structdirect*)(fdisk+DISKSIZE+FATSIZE);//根目录的地址
/*初始化目录*/
/*---------指向当前目录的目录项---------*/
root->directitem[0].sign=1;
root->directitem[0].firstdisk=ROOT_DISK_NO;
strcpy(root->directitem[0].name,".");
root->directitem[0].next=root->directitem[0].firstdisk;
root->directitem[0].property='1';
root->directitem[0].size=ROOT_DISK_SIZE;
/*-------指向上一级目录的目录项---------*/
root->directitem[1].sign=1;
root->directitem[1].firstdisk=ROOT_DISK_NO;
strcpy(root->directitem[1].name,"..");
root->directitem[1].next=root->directitem[0].firstdisk;
root->directitem[1].property='1';
root->directitem[1].size=ROOT_DISK_SIZE;
if((fp=fopen("disk.dat","wb"))==NULL)
{
printf("Error:
\n不能打开文件!
\n");
return;
}
for(i=2;i{
root->directitem[i].sign=0;
root->directitem[i].firstdisk=-1;
strcpy(root->directitem[i].name,"");
root->directitem[i].next=-1;
root->directitem[i].property='0';
root->directitem[i].size=0;
}
if((fp=fopen("disk.dat","wb"))==NULL)
{
printf("Error:
\n不能打开文件!
\n");
return;
}
if(fwrite(fdisk,MEM_D_SIZE,1,fp)!
=1)//把虚拟磁盘空间保存到磁盘文件中
{
printf("Error:
\n文件写入错误!
\n");
}
fclose(fp);
}
voidenter()//进入操作
{
FILE*fp;
inti;
fdisk=(char*)malloc(MEM_D_SIZE*sizeof(char));//申请1M空间
if((fp=fopen("disk.dat","rb"))==NULL)
{
printf("Error:
\n不能打开文件\n");
return;
}
if(!
fread(fdisk,MEM_D_SIZE,1,fp))//把磁盘文件disk.dat读入虚拟磁盘空间
{
printf("Error:
\n不能读文件\n");
exit(0);
}
fat=(structfatitem*)(fdisk+DISKSIZE);//找到FAT表地址
root=(structdirect*)(fdisk+DISKSIZE+FATSIZE);//找到根目录地址
fclose(fp);
/*--------------初始化用户打开表------------------*/
for(i=0;i{
strcpy(u_opentable.openitem[i].name,"");
u_opentable.openitem[i].firstdisk=-1;
u_opentable.openitem[i].size=0;
}
u_opentable.cur_size=0;
cur_dir=root;//当前目录为根目录
bufferdir=(char*)malloc(DIR_MAXSIZE*sizeof(char));
strcpy(bufferdir,"Root:
");
}
voidhalt()//停止操作
{
FILE*fp;
inti;
if((fp=fopen("disk.dat","wb"))==NULL)
{
printf("Error:
\n不能打开文件\n");
return;
}
if(!
fwrite(fdisk,MEM_D_SIZE,1,fp))//把虚拟磁盘空间内容写入磁盘文件disk.dat
{
printf("Error:
\n写入文件错误!
\n");
}
fclose(fp);
free(fdisk);
free(bufferdir);
return;
}
各功能程序图:
关闭文件:
读文件:
写文件:
删除文件:
创建文件:
创建目录:
打开文件:
删除目录:
四、运行结果(含运行及测试结果和用户使用说明书)
用户使用说明书:
本程序使用的函数均为标准C++函数,可以由任何支持标准C++语言的编译器编译运行,已经通过测试的编译环境如下:
Windows平台:
VisualC++6.0
使用方法:
用VC6打开lty.cpp文件,执行Build,根据对话框提示创建工程文件。
工程文件创建完在空白页面处输入所需运行的代码,调试完没有任何错误提示,即可用于程序运行。
Linux平台:
G++
使用方法:
如果存在lty.cpp文件,执行命令g++lty.cpp生成可执行文件lty,执行./a.out运行程序。
测试结果:
5、课程设计小结与心得体会
文件管理系统是操作系统中数据信息抽象模块,它不仅提供给用户使用,也提供给操作系统其他部分使用。
内存中的文件系统数据形成了文件系统的内存映像,在Linux系统中把它称为虚拟文件系统。
在模拟的虚拟文件系统中,简化了数据结构,虽然目录和文件这些文件系统的关键数据结构在这个实例中都有具体实现,但是很简单,只是没失去其基本特征而已。
操作系统课程设计,自己通过查找资料、复习课本上的内容、编程调试,写实验报告等环节,进一步掌握了以前学过但是已经慢慢遗忘的知识,并且还对操作系统应用知识有了更深入的认识与掌握。
比如对二级文件系统也有了很好的了解,更懂得了如何解决实现里面功能的各种问题。
本课程设计是对操作系统课程的一次具体实践。
在课程设计过程中,既练习了动手能力又加强了对课本知识的理解,同时培养了自己独立思考的能力,由于实践是以小组的形式进行的,虽然每个人都分配到不同题目,但是小组成员之间都是互帮互助共同找资料,所以更是锻炼了我们的团队协作能力,效果很好。
通过实践学习,我认识到学好计算机要重视实践操作,不管是学习c++语言,或者其它的语言,以及其它的计算机方面的知识都重在实践,所以在以后的学习过程中,我会更加注重实践操作,以便自己更好地学习计算机。
在这次的实践过程中也遇到不少问题,一开始对二级文件的概念不是特别清楚,根本无从下手,所以就上网找了很多资料,终于是有所了解了。
这次实践让我掌握了很多专业知识的同时,更让我懂得了很多人生态度。
即遇到问题不能轻易放弃,要努力克服,要学会思考问题,要懂得借助已有的资料来充实自己的大脑,实在是受益匪浅。
六、成绩评定
指导老师评语:
成绩评定
指导老师签名:
年月日
优秀
良好
中等
及格
不及格