操作系统课程设计计算机10级Word下载.docx
《操作系统课程设计计算机10级Word下载.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计计算机10级Word下载.docx(35页珍藏版)》请在冰豆网上搜索。
a、挂载文件系统FILE*OPENSYS(char*filename);
b、卸载文件系统intCLOSESYS(FILE*stream);
c、显示目录voidLISTDIR(void);
d、建立文件intFCREATE(char*filename);
e、删除文件intFDELETE(char*filename);
f、打开文件intFOPEN(char*filename);
g、关闭文件intFCLOSE(intfileid);
h、文件块读intFREAD(void*ptr,intn,intfileid);
i、文件块写intFWRITE(void*ptr,intn,intfileid);
j、判断文件结束intFEOF(intfileid);
k、获取文件指针longFGETPOS(intfileid);
l、设置文件指针intFSETPOS(intfileid,longoffset);
m、取得文件长度longFGETLEN(char*filename);
2、提供文件系统创建程序
3、有功能检测模块
4、为简化程序设计,假定目录区域大小固定。
文件系统空间划分:
保留扇区
FAT表区
(或字节映像图区)
根目录区
文件分区
可以使用的C语言文件操纵函数:
FILE*fopen(constchar*filename,constchar*mode);
intfclose(FILE*stream);
intfseek(FILE*stream,longoffset,intwhence);
longftell(FILE*stream);
size_tfread(void*ptr,size_tsize,size_tn,FILE*stream);
size_tfwrite(constvoid*ptr,size_tsize,size_tn,FILE*stream);
课题二:
模拟实现单级目录、单级索引的索引文件系统
使用链接域将同一文件的各索引块按顺序连接起来;
其余各项同课题一。
三、课程设计报告要求
1、设计报告要求A4纸打印成册;
2、使用学院统一的封面;
3、课程设计报告每人一份,必须包含如下几个方面的内容:
1)基本设计思想;
2)主要数据结构;
3)主要实施流程;
4)所有源代码;
5)课程设计总结与体会。
四、分组及选题办法
1、按学号顺序一人一组,学号为奇数者为课题一,偶数者为课题二。
2、成绩考核按个人课题完成情况、设计报告质量及对课程设计的态度等综合评定。
五、设计进度安排
1、讲课及上机调试时间安排:
上课时间:
上机时间:
2、其余时间:
查阅资料,确定方案,设计课题相关程序。
3、个人答辩,交课程设计报告。
主要数据结构提示:
1、单级目录FAT文件系统:
1)常量
#defineBlockSize512
#defineDirSize32
2)保留扇区结构
structReserveBlock{
intsysblocknum;
/*文件系统总扇区数*/
intresblocknum;
/*保留扇区扇区数*/
intfatblocknum;
/*FAT表扇区数*/
introotblocknum;
/*根目录区扇区数*/
charfillchar[BlockSize-4*sizeof(int)];
/*填充字节*/
};
3)目录结构
structDirBlock{
charfilename[11];
/*文件名限长11个字符*/
charfillchar[DirSize-4*sizeof(int)-sizeof(longint)-11];
/*填充字节*/
longfilelen;
/*文件长度*/
intyear,month,day;
/*日期*/
intfirstblockaddr;
/*文件首块扇区号*/
4)FCB(文件控制块)结构
structFCBBlock{
intfileid;
/*文件标识*/
structDirBlockfileinfo;
/*目录信息*/
longfilepos;
/*文件读写指针*/
intfdtblockaddr;
/*目录项所在块号*/
intfdtblockindex;
/*目录项所在块内序号*/
structFCBBlock*next;
/*指向下一个文件控制块的指针*/
2、单级目录单级索引文件系统:
intresblocknum;
intmapblocknum;
/*字节映像图扇区数*/
/*填充字节*/
intfirstindexaddr;
/*文件首索引块扇区号*/
4)索引块结构
structIndexBlock{
intdataaddr[BlockSize/sizeof(int)-1];
/*数据块块号数组*/
intnextindexaddr;
/*本文件下一索引块块号*/
5)索引节点结构
structIndexNode{
structIndexBlockblock;
/*索引块数据*/
intblockaddr;
/*本节点索引块块号*/
structIndexNode*nextnode;
/*指向下一索引节点的指针*/
6)FCB(文件控制块)结构
structFCBBlock*next;
/*指向下一个文件控制块的指针*/
structIndexNode*firstindexnode;
/*指向第一个索引节点的指针*/
一.实验目的:
二.程序功能:
模拟实现单级目录、单级索引的索引文件系统,包含的功能有:
文件的创建,文件删除,读,写,打开,关闭以及能显示目录。
在创建文件时,系统首先为新文件分配所需的外存空间,并且在文件系统的相应目录中,建立一个目录项,该目录项纪录了新文件的文件名以及在外存中的地址等属性。
它是目录文件中的一个记录,它与文件时一一对应。
当不需要某个文件时,便可以把它从文件系统中删除。
这时执行的是与创建文件相反的操作。
系统先从目录中找到要删除的文件项,使之成为空项,紧接着回收该文件的存储空间,用于下次分配。
通过读指针,将位于外部存储介质上的数据读入到内存缓冲区这样就实现了文件的读取,通过写指针,将内存缓冲区中的数据写入到位于外部存储介质上的文件中。
在开始使用文件时,首先必须打开文件。
这可以将文件属性信息装入内存,以便以后快速查用。
在完成文件使用后,应该关闭文件。
这不但是为了释放内存空间,而且也因为许多系统常常限制可以同时打开的文件数。
当创建文件时,先在目录表中查找是否存在此文件表,若存在则表示文件同名不能创建,否则在目录表中为此文件先建立一个目录项,保存文件的一些基本属性,如创建日期、大小、文件名等,并保存文件的首索引块扇区号,对文件读写也是先在目录项里查找文件是否存在,再根据文件的首索引块扇区号,查找对应块号中的内容对其进行读写操作,删除一个文件后回收为其分配的空间,并更新目录表、修改文件控制块。
显示目录项可以显示文件名、长度以及创建日期。
三.程序的基本设计思路:
单级目录,单级索引的索引文件系统:
单级目录,它是整个目录组织是一个线性结构,系统中的所有文件都建立在一张目录表中。
它主要用于单用户操作系统,具有结构简单、文件多时目录检索时间长和有命名冲突等特点;
文件的索引结构实际上就是把链接结构中的指针取出来集中存放在一起,这样它既能够完全利用每一个存储块的最大存储量,又保持物理块为2的幂。
索引文件系统它是指为每一文件建立一张索引表,将文件中每个记录的记录号、长度和指向该记录的指针记入索引表中的一种文件组织形式。
由于索引表本身是一个定长记录文件,因此可以十分方便地检索到相应记录的索引表项,从而可方便地对主文件中的记录实现直接存取。
模拟实现单机目录,单级索引的索引文件系统基本思路:
用使用链接域将同一文件的各索引块按顺序连接起来。
在一个文件系统中对文件进行操作,实现文件的创建、读写等等操作。
在创建文件时先在目录项中进行查找,若创建的文件已存在,文件的创建首先检验目录是否为空,为空则把文件夹或文件连接到该目录下,不为空则把检查目录下是否有同名文件夹或文件,有则提示创建不成功,而文件夹打开是则把文件夹名称及其地址压入打开文件夹栈,文件关闭则把文件夹名称及其地址从打开文件夹中抛出。
文件夹和文件的删除,文件夹下没有打开的文件或文件没有打开才能删除,否则删除失败,每次操作成功都要更改目录和索引信息。
该过程都保存在文件中,是对文件的操作。
本系统建于Windows平台,开发环境为microsoftvisualC++。
四.程序流程图
1.系统功能图
2.创建文件
在创建文件成功后,要把新用的磁盘块连接到正确的位置,以确保文件索引结构的正确。
另外,若外存磁盘块已用完,则不能再建立文件,表明文件建立的失败。
3.删除文件
删除文件的流程与创建文件基本相同,也是先选择文件类型,然后再进行相应的操作。
在删除文件中,要把该文件中所有属于该文件范围内的所占有的磁盘块都要进行“清零”处理,即释放磁盘块。
4.写文件
在向文件写入数据的过程中,若外存磁盘已满,则会停止向文件写入数据。
5.读文件
读取文件内的数据较为简单。
可直接从目录索引表中查找到该文件,并得到该文件所在的磁盘块号,然后读取该磁盘块里的内容,获取该文件的索引表,通过索引表来读取数据。
6.打开文件
打开文件可直接通过目录索引表来打开相应的文件。
打开文件分为打开文件夹和打开文件两种方式。
打开文件,则显示该文件的指针(文件所在的磁盘块)、文件创建日期及文件大小;
打开文件夹,除了显示所述信息外,还要显示该文件夹里所有的文件的信息。
五.调试运行:
1.进入功能菜单,选择要执行的功能,如下图一所示:
2.创建文件,如下图二所示:
3.写文件,如下图三所示:
4.显示文件目录,如下图四所示:
5.删除文件。
如下图五所示:
6.退出文件系统,如图六所示:
六.心得体会:
这次的课设给了我很大的收获,不仅仅对计算机的知识有了进一步的了解,并且对我的实践能力提高的帮助也是相当大。
刚看到课程任务书时觉得比较有难度的课程设计,但是它与以往的不同的是,功能的编码实现部分是已经提供的了,我们需要做的只是将它连接起来,首先要弄明白的是功能模块的作用,之间改怎样联系。
其次还要了解变量之间的联系。
总的来说就是要弄懂总个程序。
但脑袋里面没有一个总体的概念是很难完成的,阅览代码就要充分了解设计者的思想。
一直不停的阅览分析,调试,修修改改才完成了这次课设的代码部分。
这也让我明白了一个道理,读懂他人的思想并不比自己编程来的简单。
在完成代码的过程中,出现了很多错误,一个一个慢慢修改。
这让我体会到养成一种良好的编程习惯是非常重要的,不仅仅是变量的编写错误这些小毛病。
还有不能一条一条语句编写,首先就是要够好思路才能达到事半功倍的效果。
而且代码的编写格式也非常重要,这不仅仅是美观的问题而且便于对代码理解。
编程也是交流精神也是非常重要的,由于自己的惯性思维对自己的错误很难发现,所以需要别人的帮助更快更容易发现错误。
代码编写过程中,同学的热心帮助,老师的细心指导是很重要的。
其次,代码编写能力也是很重要的,一个文件的创建更或是输入输出都有问题的话,需要借助资料,这是很麻烦的,最基本的功夫不到家有想法也是很难实现的。
通过这次课设我学到了设计简单磁盘管理的思想,单级目录,单级索引的文件索引系统。
重要的是培养了多多交流的精神,这简直太重要了。
在课设过程中,在遇到问题的时候,同学们愿意放下自己手中的是来帮我解决,让我感到很温暖,从同学那里也学到了不少知识。
总之,很感谢老师和同学的帮助。
这次的课程设计已经结束了,但学习还没有结束,这次的领悟就是丰富的知识,和动手能力的培养是多么的重要。
我将不断丰富自己的知识,在动手中培养自己的实际操作能力。
七.附录:
1.源程序
#defineRootSize2
/*文件系统总扇区数*/
/*保留扇区扇区数*/
/*字节映像图扇区数*/
/*根目录区扇区数*/
structDirBlock{
charfillchar[DirSize-4*sizeof(int)-sizeof(longint)-11];
structIndexNode*nextnode;
/*指向下一索引节点的指针*/
structIndexNode*firstindexnode;
/*指向第一个索引节点的指针*/
#include"
index.h"
#include<
stdio.h>
string.h>
stdlib.h>
intmain()
{structReserveBlocksys;
charfilename[]="
indexsys.dat"
;
charfillchar[BlockSize];
char*map;
inti,j;
FILE*fp;
memset(&
sys,255,BlockSize);
printf("
PleaseInputFileSystem'
sBlockNum(5~32767):
"
);
scanf("
%d"
&
(sys.sysblocknum));
sys.resblocknum=1;
sys.mapblocknum=sys.sysblocknum/(BlockSize/sizeof(char))+//求出FAT表区所需的磁盘块数,即存储磁盘块的使用情况所需的磁盘块数
((sys.sysblocknum%(BlockSize/sizeof(char)))?
1:
0);
map=(char*)malloc(BlockSize*sys.mapblocknum);
memset(map,255,BlockSize*sys.mapblocknum);
memset(map,0,sizeof(char)*sys.sysblocknum);
sys.rootblocknum=RootSize;
//根目录区分配的块数,这里固定为2块
j=sys.resblocknum+sys.mapblocknum+sys.rootblocknum;
for(i=0;
i<
j;
i++)
map[i]=1;
//标注这些非文件存储使用区的块部分已经使用
fillchar,0,BlockSize);
//用0填充一块,512字节
fp=fopen(filename,"
w+b"
fwrite(&
sys,1,BlockSize,fp);
//文件中写入第一块进去,即为保留扇区块,其中存储磁盘的块数分配信息,即ReserveBlock块的信息
sys.mapblocknum;
fwrite(map+i*BlockSize/sizeof(char),1,BlockSize,fp);
//map可能有多块,每次只将一块(512B)写入文件中去;
这是第二次写入,可能写入多块
j=sys.resblocknum+sys.mapblocknum;
for(i=0;
(sys.sysblocknum-j);
fillchar,1,BlockSize,fp);
//在文件中存入用于存放文件的块数,每次存一块,这些存入的块都将用来存放文件
fclose(fp);
//关闭打开的文件
free(map);
//释放为map分配的内存空间
return0;
}
FILE*filesystem;
structReserveBlocksys;
char*map;
structFCBBlock*fcblist;
/*a、打开文件系统*/
FILE*OPENSYS(char*filename)
{inti;
r+b"
fread(&
//将第一块保留扇区的内容读入内存,其中存放模拟文件系统的扇区分配信息
map=(char*)malloc(BlockSize*sys.mapblocknum);
fread(map+i*BlockSize/sizeof(char),1,BlockSize,fp);
//读取扇区块使用情况的扇区块的信息,这里面标记了模拟文件系统磁盘块的每块的使用状态
fcblist=NULL;
//置已打开文件的列表为空
returnfp;
/*b、关闭文件系统*/
intCLOSESYS(FILE*stream)
fseek(stream,sys.resblocknum*BlockSize,SEEK_SET);
fwrite(map+i*BlockSize/sizeof(char),1,BlockSize,stream);
//将模拟文件系统的文件块使用信息重新写入磁盘
fclose(stream);
return1;
/*c、显示目录*/
voidLISTDIR(void)
{inti,j;
structDirBlock*fdt,*fdt1;
fdt1=(structDirBlock*)malloc(BlockSize);
//一个目录块占32B,这里分配512B,即16个目录的存放空间
fseek(filesystem,(sys.resblocknum+sys.mapblocknum)*BlockSize,SEEK_SET);
//将文件指针置于目录块的块首
--filename---filelength-----date---\n"
for(i