操作系统课程设计文件系统的实现.docx
- 文档编号:5541409
- 上传时间:2022-12-19
- 格式:DOCX
- 页数:22
- 大小:31.26KB
操作系统课程设计文件系统的实现.docx
《操作系统课程设计文件系统的实现.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计文件系统的实现.docx(22页珍藏版)》请在冰豆网上搜索。
操作系统课程设计文件系统的实现
课程设计报告
(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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 文件系统 实现