操作系统课程设计文件系统的实现.docx

上传人:b****5 文档编号:5541409 上传时间:2022-12-19 格式:DOCX 页数:22 大小:31.26KB
下载 相关 举报
操作系统课程设计文件系统的实现.docx_第1页
第1页 / 共22页
操作系统课程设计文件系统的实现.docx_第2页
第2页 / 共22页
操作系统课程设计文件系统的实现.docx_第3页
第3页 / 共22页
操作系统课程设计文件系统的实现.docx_第4页
第4页 / 共22页
操作系统课程设计文件系统的实现.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

操作系统课程设计文件系统的实现.docx

《操作系统课程设计文件系统的实现.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计文件系统的实现.docx(22页珍藏版)》请在冰豆网上搜索。

操作系统课程设计文件系统的实现.docx

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

课程设计报告

(20--20年度第学期)

课程名称:

操作系统实验

课设题目:

文件系统的实现

院系:

控制与计算机工程学院

班级:

姓名:

指导教师:

设计周数:

一周

成绩:

20年月日

设计报告内容

1、需求分析

用C或C++编写和调试一个文件系统,功能使用命令行的方式实现。

模拟文件管理的工作过程。

加深理解文件系统的内部功能和内部实现。

用内存模拟磁盘用结构体数组描述个不同的磁盘区域。

磁盘的存取单元是磁盘块,一个盘块的大小是64字节。

每个目录项16个字节,目录项下只允许建立4个子目录或者文件。

i-node位图1块64个字节,共512位,可以描述512个i-node的使用情况。

i-node的长度是16字节。

文件超过两个盘块会用到一级索引。

每个以及索引盘块(64字节)可以包含16个盘块号。

文件包含目录文件和文本文件。

实现Format,Mkfile,Mkdir,Cd,Delfile,Deldir,Dir,Copy,Open,Viewinodebitmap,Viewblockbitmap等功能。

二、整体功能及设计(功能划分及流程图)

1、数据结构:

structDirectoryEntry{//目录项

charname[8];//文件或目录名

intdirid;//目录标志(0为文件,1为目录)

intinodenumber;//i-node编号

};

structDirectoryEntryInBlock{

DirectoryEntryde[4];//每个目录项大小为16字节,64字节空间最多可以存储4个目录项

intnum;//磁盘块存储的目录项数目

};

structindexaddressstruct{

intindexaddress[16];//每个索引块大小为4字节,64字节空间最多可以存储16个索引块号

intnum;//索引块存储的索引数目

};

unionBlock{//单个盘块64个字节大小可以存储文件内容或者存储目录项或者存储索引块号

charspace[64];//空间大小为64个字节用于存储文件内容

DirectoryEntryInBlockdeib;

indexaddressstructias;

};

structinodeStruct{//i-node结构

intblockamount;//盘块数

intdirectblockaddress1,directblockaddress2;//直接盘块地址*2

intstairindexaddress;//一级索引地址

};

structDiskBlock{//磁盘布局

DirectoryEntryrootdirectory[4];//根目录,最多4个目录项

charinodebitmap[512];//512个i-node状态

charblockbitmap[1024];//1024个磁盘块状态

inodeStructinode[512];//512个i-node存储区

Blockdatablock[1024];//数据块存储区

};

staticDiskBlockdb;//全局磁盘变量

introotdirectoryamount;//用于记录根目录的使用数目,最大为4

intinodeamount;//用于记录i-node的使用数目,最大为512

intdatablockamount;//用于记录数据块的使用数目,最大为1024

intspaceamount;//用于记录数据块中64位字节的使用数目,最大为64

DirectoryEntryfilelist[500];//用于记录文件方便遍历检索

DirectoryEntrydirectorylist[500];//用于记录目录方便

intfileamount;//用于记录文件数目

intdirectoryamount;//用于记录目录的数目

charlocalposition[8];//用于记录当前位置

2、文件系统相关图

(1)文件系统简单结构图如图1所示。

图1文件系统简单结构图

(2)磁盘构成示意图如图2所示

图2磁盘构成示意图

(3)文件构成图如图3所示。

文件或目录名

目录标志

I-node编号

图3文件构成图

(4)I-node构成图如图4所示。

图4I-node构成图

三、编程实现:

(主要功能代码及解释)

voidFormat(){//初始化

inti,j;

for(i=0;i<4;i++){

memset(db.rootdirectory[i].name,0,8);//给文件或目录名初始化

db.rootdirectory[i].dirid=-1;

db.rootdirectory[i].inodenumber=-1;

}

for(i=0;i<512;i++){

db.inodebitmap[i]=0;

db.inode[i].blockamount=0;

db.inode[i].directblockaddress1=-1;

db.inode[i].directblockaddress2=-1;

db.inode[i].stairindexaddress=-1;

}

for(i=0;i<1024;i++)

{

db.blockbitmap[i]=0;

memset(db.datablock[i].space,0,64);//给单个盘块的64字节空间初始化

db.datablock[i].deib.num=0;

db.datablock[i].ias.num=0;

for(j=0;j<4;j++)

db.datablock[i].deib.de[j].inodenumber=-1;

for(j=0;j<4;j++)

db.datablock[i].ias.indexaddress[j]=-1;

}

for(i=0;i<500;i++){

memset(filelist[i].name,0,8);

filelist[i].dirid=-1;

filelist[i].inodenumber=-1;

memset(directorylist[i].name,0,8);

directorylist[i].dirid=-1;

directorylist[i].inodenumber=-1;

}

rootdirectoryamount=0;

inodeamount=0;

datablockamount=0;

spaceamount=0;

fileamount=0;

directoryamount=0;

strcpy(localposition,"Root");

}

voidMkfile(){//创建文件

charfilename[8],path[10];

printf("文件名称:

");

scanf("%s",filename);

printf("文件路径:

");

scanf("%s",path);

if(strcmp(path,"Root")==0){

if(rootdirectoryamount<4){

strcpy(db.rootdirectory[rootdirectoryamount].name,filename);

db.rootdirectory[rootdirectoryamount].dirid=0;

db.rootdirectory[rootdirectoryamount].inodenumber=inodeamount;

db.inode[inodeamount].blockamount=1;

db.inode[inodeamount].directblockaddress1=datablockamount;

db.inodebitmap[inodeamount]=1;

db.blockbitmap[datablockamount]=1;

filelist[fileamount]=db.rootdirectory[rootdirectoryamount];

rootdirectoryamount++;

inodeamount++;

datablockamount++;

fileamount++;

printf("文件创建成功\n");

}

else

printf("创建失败,根目录已满\n");

}

else{

for(inti=0;i

if(strcmp(path,directorylist[i].name)==0){

inttnum=db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.num;

if(tnum>4){

printf("创建失败,该目录已满\n");

break;

}

else{strcpy(db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.de[tnum].name,filename);db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.de[tnum].dirid=0;

db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.de[tnum].inodenumber=inodeamount;

db.inode[inodeamount].blockamount=1;

db.inode[inodeamount].directblockaddress1=datablockamount;

db.inodebitmap[inodeamount]=1;

db.blockbitmap[datablockamount]=1;

filelist[fileamount]=db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.de[tnum];

inodeamount++;

datablockamount++;

fileamount++;

db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.num++;

printf("文件创建成功\n");

break;

}

}

}

if(i>=directoryamount)

printf("创建失败,路径有误\n");

}

}

voidMkdir(){//创建目录

chardirectoryname[8],path[10];

printf("目录名称:

");

scanf("%s",directoryname);

printf("目录路径:

");

scanf("%s",path);

if(strcmp(path,"Root")==0){

if(rootdirectoryamount<4){

strcpy(db.rootdirectory[rootdirectoryamount].name,directoryname);

db.rootdirectory[rootdirectoryamount].dirid=1;

db.rootdirectory[rootdirectoryamount].inodenumber=inodeamount;

db.inode[inodeamount].blockamount=1;

db.inode[inodeamount].directblockaddress1=datablockamount;

db.inodebitmap[inodeamount]=1;

db.blockbitmap[datablockamount]=1;

directorylist[directoryamount]=db.rootdirectory[rootdirectoryamount];

rootdirectoryamount++;

inodeamount++;

datablockamount++;

directoryamount++;

printf("目录创建成功\n");

}

else

printf("创建失败,根目录已满\n");

}

else{

for(inti=0;i

if(strcmp(path,directorylist[i].name)==0){

inttnum=db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.num;

if(tnum>4){

printf("创建失败,该目录已满\n");

break;

}

else{

strcpy(db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.de[tnum].name,directoryname);

db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.de[tnum].dirid=1;

db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.de[tnum].inodenumber=inodeamount;

db.inode[inodeamount].blockamount=1;

db.inode[inodeamount].directblockaddress1=datablockamount;

db.inodebitmap[inodeamount]=1;

db.blockbitmap[datablockamount]=1;

directorylist[directoryamount]=db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.de[tnum];

inodeamount++;

datablockamount++;

directoryamount++;

db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.num++;

printf("目录创建成功\n");

break;

}

}

}

if(i>=directoryamount)

printf("创建失败,路径有误\n");

}

}

voidCd(){//更改当前目录项

printf("请输入当前目录为:

");

scanf("%s",localposition);

printf("当前目录位置修改成功\n");

}

voidDelfile(){//删除文件

charfilename[8];

inti,j,k,flag;

printf("请输入要删除的文件的名称:

");

scanf("%s",filename);

for(k=0;k

if(strcmp(db.rootdirectory[k].name,filename)==0){

memset(db.rootdirectory[k].name,0,8);

db.rootdirectory[k].dirid=-1;

db.rootdirectory[k].inodenumber=-1;

break;

}

}

for(k=0;k

for(j=0;j

if(strcmp(db.datablock[db.inode[directorylist[k].inodenumber].directblockaddress1].deib.de[j].name,filename)==0){

memset(db.datablock[db.inode[directorylist[k].inodenumber].directblockaddress1].deib.de[j].name,0,8);

db.datablock[db.inode[directorylist[k].inodenumber].directblockaddress1].deib.de[j].dirid=-1;

db.datablock[db.inode[directorylist[k].inodenumber].directblockaddress1].deib.de[j].inodenumber=-1;

break;

}

}

}

for(i=0;i

if(strcmp(filename,filelist[i].name)==0){

flag=i;

if(db.inode[filelist[i].inodenumber].blockamount==1){

memset(db.datablock[db.inode[filelist[i].inodenumber].directblockaddress1].space,0,64);

db.inode[filelist[i].inodenumber].blockamount=0;

db.inodebitmap[filelist[i].inodenumber]=0;

db.blockbitmap[db.inode[filelist[i].inodenumber].directblockaddress1]=0;

db.inode[filelist[i].inodenumber].directblockaddress1=-1;

printf("文件删除成功\n");

break;

}

elseif(db.inode[filelist[i].inodenumber].blockamount==2){

memset(db.datablock[db.inode[filelist[i].inodenumber].directblockaddress1].space,0,64);

memset(db.datablock[db.inode[filelist[i].inodenumber].directblockaddress2].space,0,64);

db.inode[filelist[i].inodenumber].blockamount=0;

db.inodebitmap[filelist[i].inodenumber]=0;

db.blockbitmap[db.inode[filelist[i].inodenumber].directblockaddress1]=0;

db.blockbitmap[db.inode[filelist[i].inodenumber].directblockaddress2]=0;

db.inode[filelist[i].inodenumber].directblockaddress1=-1;

db.inode[filelist[i].inodenumber].directblockaddress2=-1;

printf("文件删除成功\n");

break;

}

else{

inttemp=db.inode[filelist[i].inodenumber].blockamount-2;

memset(db.datablock[db.inode[filelist[i].inodenumber].directblockaddress1].space,0,64);

memset(db.datablock[db.inode[filelist[i].inodenumber].directblockaddress2].space,0,64);

db.inode[filelist[i].inodenumber].blockamount=0;

db.inodebitmap[filelist[i].inodenumber]=0;

db.blockbitmap[db.inode[filelist[i].inodenumber].directblockaddress1]=0;

db.blockbitmap[db.inode[filelist[i].inodenumber].directblockaddress2]=0;

db.blockbitmap[db.inode[filelist[i].inodenumber].stairindexaddress]=0;

db.inode[filelist[i].inodenumber].directblockaddress1=-1;

db.inode[filelist[i].inodenumber].directblockaddress2=-1;

for(intj=0;j

inttemp1=db.data

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1