文档库 最新最全的文档下载
当前位置:文档库 › 操作系统文件系统的设计与实现_课程设计

操作系统文件系统的设计与实现_课程设计

课程设计

题目:文件系统的设计与实现学院:信息工程学院

系别:计算机系

专业:计算机科学与技术

2011年12月30日

内蒙古工业大学课程设计任务书

学院(系):信息学院计算机系课程名称:操作系统课程设计指导教师(签名):专业班级:计算机09-2 学生姓名:学号: 200920201039

目录

第一章设计内容 (1)

1.1设计目的 (1)

1.2设计要求 (1)

1.3程序设计思想 (1)

第二章数据结构、算法和算法流程图 (2)

2.1数据结构 (2)

2.2程序功能图 (2)

2.3程序流程图 (3)

第三章程序运行结果及分析 (6)

3.1程序运行结果 (6)

3.2程序分析 (7)

第四章心得体会 (8)

参考文献 (9)

附录程序清单 (10)

第一章设计内容

1.1 设计目的

通过设计一个小型文件系统,进一步掌握文件管理的方法和技术,使学生初步具有研究、设计、编制和调试操作系统模块的能力。

1.2 设计要求

(1) 问题描述

在任一OS下,建立一个大文件,把它假想成一张盘,在其中实现一个简单的小型文件系统。

(2) 基本要求

该文件系统没有子目录机制,文件连续分配,不考虑换“盘”和分区。

做一个简单的操作界面,提供五条简单的命令:dir、mkfile、type、copy、delfile,分别用于显示文件目录、建立文件、显示文件内容、复制和删除一个文件。

1.3 程序设计思想

阅读操作系统方面的书籍,了解操作系统的文件系统原理。结合分析课程设计要求,确定实体以及它们之间的关系。实体关系有三张表(磁盘空间分配表、文件表、打开文件表)、一个模拟磁盘的数组、命令服务和用户构成。用户负责输入命令。命令服务实现命令的解释、命令检查、命令帮助以及调用相关模块执行相应的命令功能。

建立一个系统文件(模拟盘),并对此进行盘块的划分,第一个盘块存放文件目录,第二盘块存放盘块位示图,自第三个盘块开始存放各具体文件的内容,文件目录存放文件的名字,文件的扩展名,开始盘块号,所占用的盘块数目,文件的大小;盘块位示图用来标记盘块是否被占用。

构造这些实体的关系图,数据流图、程序流程图来进行具体的设计。

第二章数据结构、算法和算法流程图

2.1 数据结构

数据结构说明:本程序所运用的主要有两个数据结构,分别如下:

文件目录结构:

struct filename { //文件目录项结构体

char name[9]; //文件名

char ext[4]; //扩展名

int i; //文件所占用磁盘块的第一个磁盘块号

int Amount; //文件所占用磁盘块的块数

long int size; //文件大小

};

盘块结构:

struct empty { //盘块结构体

int map[100]; //盘块位示图

int filenum; //文件数量

};

2.2 程序功能图

图2.1

文件系统提供的文件操作有建立文件(mkfile)、复制文件(copy)、显示文件所有内容(type)、删除文件(delfile)。可以通过键盘输入命令来模拟文件的操作。

2.3 程序流程图

(1)主程序流程图:

图2.2

(2)初始化模块流程图:

(3)写入磁盘流程图:

(4)显示目录流程图:

(5)显示文件流程图:

图2.3

图2.5

图2.4

图2.6

(6)删除文件流程图:

(7)复制文件流程图:

(8)创建文件流程图:

图2.7

图2.9 图2.8

第三章程序运行结果及分析

3.1 程序运行结果

(1)程序主界面

图3.1

(2)创建一个文件,输入“3”显示“输入文件内容,按@ 键保存且退出!”

图3.2

(3)往文件里写内容:Hello World!显示文件长度,并要求给文件命名,命名后保存返回主界面

图3.3

(4)读取刚才写入的文件,结果正确

图3.4

(5)删除刚写入的文件,测试成功

图3.5

3.2 程序分析

本程序使用一个Windows下的文件来模拟一个磁盘,向磁盘中装入文件并进行相关操作。采用了以空间换时间的算法,文件的大小在系统中是固定的,虽然会浪费一些空间,但文件的存取速率会加快。

第四章心得体会

操作系统课程设计是本课程重要的实践教学环节。课程设计的目的,一方面使学生更透彻地理解操作系统的基本概念和原理,使之由抽象到具体;另一方面,通过课程设计加强学生的实验手段与实践技能,培养学生独立分析问题、解决问题、应用知识的能力和创新精神。与本课程的实验教学相比,课程设计独立设课,具有更多的学时,给学生更多自行设计、自主实验的机会,充分放手让学生真正培养学生的实践动手能力,全面提高学生的综合素质。

在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,不过设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于游逆而解。同时,在老师的身上我学得到很多实用的知识,再次我表示感谢!同时,对给过我们帮助的所有同学和各位指导老师再次表示忠心的感谢!

在设计过程中,查询了不少相关资料,不断的发现问题、提出问题、解决问题。在对自己所编写的源程序段的纠错的过程中,使我更好的理解了操作系统中文件系统的理论知识,同时在编程时用到了模块化的设计思想,这种编程方法可以使我们的编程变的更简单,可以使我们的查错与纠错变的更方便。总的来说通过这次的设计的学习使我学到了很多在平时的学习中学不到的很多东西,通过这次课程设计,使我对操作系统和编程产生兴趣,我想我会在这条路上继续前进下去。我相信,只要不断的严格要求自己,注意培养自己的思维能力,就一定会有更大更辉煌的发展和提高。

参考文献

1. 教材

[1] 张尧学主编.计算机操作系统教程(第三版).北京:清华大学出版社,2006

2. 主要参考书

[1] 张尧学编.计算机操作系统教程(第三版)习题解答与实验指导.北京:

清华大学出版社,2006

[2] 汤子瀛主编.计算机操作系统(第三版).西安:西安电子科技大学出版社,

2001

[3] 张坤等编.操作系统实验教程.北京:清华大学出版社,2008

[4] 张丽芬等编.操作系统实验教程.北京:清华大学出版社,2006

[5] Andrew S.Tanenbaum. Modern Operating Systems, Second Edition.Englewood

Cliffs,N.J,Prentice Hall, 2001

[6] 屠祁等编.操作系统基础(第三版).北京:清华大学出版社,2000

[7] 冯耀霖等编.操作系统.西安:西安电子科技大学出版社,2001

[8] 左万历.计算机操作系统教程(第二版).北京:高等教育出版社,2004

附录程序清单

#include "iostream.h"

#include "string"

#include "stdio.h"

extern "C" void exit(int);

struct filename //文件目录项结构体

{

char name[12]; //文件名

char ext[8]; //扩展名//扩展名较小设为10

int i; //文件所占用磁盘块的第一个磁盘块号

int Amount; //文件所占用磁盘块的块数

long int size; //文件大小

}file[20];

int num;

struct empty //盘块结构体

{ int map[20]; //盘块位示图

int filenum; //文件数量

}emptytable;

//模块说明:

void SystemInit() //模拟磁盘文件初始化函数

{

for(int i=2;i<19;i++) { //初始化存放位示图的盘块

emptytable.map[i]=0;

}

emptytable.map[0]=1;

emptytable.map[1]=1;

emptytable.filenum=0;

FILE *fp;

if((fp=fopen("filesys","wb+"))==NULL) //wb+:为读写建立一个"新"文件;打开系统文件将文件目录盘块和用“w”打开的文件只能向该文件写入。若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。+: 读和写

{ //位示图盘块写入系统文件

printf("can not open file \n");

exit(0);

}

fseek(fp,512L,0); // int fseek(FILE *stream, long offset, int fromwhere); 函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere(偏移起始位置:文件头0,当前位置1,文件尾2)为基准,偏移offset(指针偏移量)个字节的位置。如果执行失败(offset超过文件自身大小),则不改变stream指向的位置。成功,返回0,否则返回其他值。

fwrite(&emptytable,sizeof(struct empty),1,fp); //把结构体emptyable中的内容写入到fp中,数据项的大小为struct empty,数据项的个数为1

fclose(fp);

printf(" !!!初始化系统成功!!!");

}

void WriteFile() //将目录以及空闲盘块表写入磁盘

{

FILE *fp;

if((fp=fopen("filesys","rb+"))==NULL)

{

printf("can not open file \n");

exit(0);

}

rewind(fp); //将文件内部的位置指针重新指向一个流(数据流/文件)的开头for(int i=0;i

{

fwrite(&file[i],sizeof(struct filename),1,fp); //文件目录

}

fseek(fp,512L,0);

fwrite(&emptytable,sizeof(struct empty),1,fp); //位示图

fclose(fp);

}

void dir() //显示文件目录

{ int i,j;

FILE *fp;

if((fp=fopen("filesys","rb"))==NULL)

{ printf("can not open file \n");

exit(0);

}

fseek(fp,512L,0); //空闲盘块表的定位

fread(&emptytable,sizeof(struct empty),1,fp);

rewind(fp); //文件目录表的定位

num=emptytable.filenum;

for(i=0;i

fread(&file[i],sizeof(struct filename),1,fp);

if (num!=0)

{ printf("系统所有文件:\n");

for(i=0,j=1;i

{

printf("%s.%s ",file[i].name,file[i].ext);

if(j==5)

{ printf("\n");

j=1;

}

}

}

printf("\n文件数量为%d ",num);

fclose(fp);

}

void type() //显示文件内容{

FILE *fp;

int i,j;

if((fp=fopen("filesys","rb"))==NULL)

{ printf("can not open file \n");

exit(0);

}

fseek(fp,512L,0);

fread(&emptytable,sizeof(struct empty),1,fp);

rewind(fp);

num=emptytable.filenum;

for(i=0,j=0;i

{ fread(&file[i],sizeof(struct filename),1,fp);

printf("%s.%s ",file[i].name,file[i].ext);

if(j==5) printf("\n");

}

printf("\n");

char name[12],ext1[8];

printf("请输入所要查询的文件名:\n");

gets(name); //scanf("%s",name);//getchar();

printf("请输入扩展名:");

gets(ext1); //scanf("%s",ext1);getchar();

if(*(name+0)=='\0')

{

printf("文件名不能为空! \n");

return;

}

相关文档
相关文档 最新文档