ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:31.26KB ,
资源ID:5541409      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5541409.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统课程设计文件系统的实现.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、操作系统课程设计文件系统的实现课 程 设 计 报 告( 20 -20 年度第 学期)课程名称: 操作系统实验 课设题目: 文件系统的实现 院 系: 控制与计算机工程学院 班 级: 姓 名: 指导教师: 设计周数: 一周 成 绩: 20 年 月 日设计报告内容1、需求分析用C或C+编写和 调试一个文件系统,功能使用命令行的方式实现。模拟文件管理的工作过程。加深理解文件系统的内部功能和内部实现。用内存模拟磁盘用结构体数组描述个不同的磁盘区域。磁盘的存取单元是磁盘块,一个盘块的大小是64字节。每个目录项16个字节,目录项下只允许建立4个子目录或者文件。i-node位图1块64个字节,共512位,可以

2、描述512个i-node的使用情况。i-node的长度是16字节。文件超过两个盘块会用到一级索引。每个以及索引盘块(64字节)可以包含16个盘块号。文件包含目录文件和文本文件。实现Format,Mkfile,Mkdir,Cd,Delfile,Deldir,Dir,Copy,Open,Viewinodebitmap,Viewblockbitmap等功能。二、整体功能及设计(功能划分及流程图)1、数据结构:struct DirectoryEntry /目录项 char name8; /文件或目录名 int dirid; /目录标志(0为文件,1为目录) int inodenumber; /i-no

3、de编号;struct DirectoryEntryInBlock DirectoryEntry de4; /每个目录项大小为16字节,64字节空间最多可以存储4个目录项 int num; /磁盘块存储的目录项数目;struct indexaddressstruct int indexaddress16; /每个索引块大小为4字节,64字节空间最多可以存储16个索引块号 int num; /索引块存储的索引数目;union Block /单个盘块64个字节大小可以存储文件内容或者存储目录项或者存储索引块号 char space64; /空间大小为64个字节用于存储文件内容 DirectoryE

4、ntryInBlock deib; indexaddressstruct ias; ;struct inodeStruct /i-node结构 int blockamount; /盘块数 int directblockaddress1,directblockaddress2; /直接盘块地址*2 int stairindexaddress; /一级索引地址;struct DiskBlock /磁盘布局 DirectoryEntry rootdirectory4; /根目录,最多4个目录项 char inodebitmap512; /512个i-node状态 char blockbitmap10

5、24; /1024个磁盘块状态 inodeStruct inode512; /512个i-node存储区 Block datablock1024; /数据块存储区;static DiskBlock db; /全局磁盘变量int rootdirectoryamount; /用于记录根目录的使用数目,最大为4int inodeamount; /用于记录i-node的使用数目,最大为512int datablockamount; /用于记录数据块的使用数目,最大为1024int spaceamount; /用于记录数据块中64位字节的使用数目,最大为64DirectoryEntry filelist

6、500; /用于记录文件方便遍历检索DirectoryEntry directorylist500; /用于记录目录方便int fileamount; /用于记录文件数目int directoryamount; /用于记录目录的数目char localposition8; /用于记录当前位置 2、文件系统相关图(1)文件系统简单结构图如图1所示。图1 文件系统简单结构图(2)磁盘构成示意图如图2所示图2 磁盘构成示意图(3)文件构成图如图3所示。文件或目录名目录标志I-node编号图3 文件构成图(4)I-node构成图如图4所示。图4 I-node构成图三、编程实现:(主要功能代码及解释)v

7、oid Format() /初始化 int i,j; for(i=0;i4;i+) memset(db.rootdirectoryi.name,0,8); /给文件或目录名初始化 db.rootdirectoryi.dirid=-1; db.rootdirectoryi.inodenumber=-1; for(i=0;i512;i+) db.inodebitmapi=0; db.inodei.blockamount=0; db.inodei.directblockaddress1=-1; db.inodei.directblockaddress2=-1; db.inodei.stairinde

8、xaddress=-1; for(i=0;i1024;i+) db.blockbitmapi=0; memset(db.datablocki.space,0,64); /给单个盘块的64字节空间初始化 db.datablocki.deib.num=0; db.datablocki.ias.num=0; for(j=0;j4;j+) db.datablocki.deib.dej.inodenumber=-1; for(j=0;j4;j+) db.datablocki.ias.indexaddressj=-1; for(i=0;i500;i+) memset(filelisti.name,0,8)

9、; filelisti.dirid=-1; filelisti.inodenumber=-1; memset(directorylisti.name,0,8); directorylisti.dirid=-1; directorylisti.inodenumber=-1; rootdirectoryamount=0; inodeamount=0; datablockamount=0; spaceamount=0; fileamount=0; directoryamount=0; strcpy(localposition,Root);void Mkfile() /创建文件 char filena

10、me8,path10; printf(文件名称:); scanf(%s,filename); printf(文件路径:); scanf(%s,path); if(strcmp(path,Root)=0) if(rootdirectoryamount4) strcpy(db.rootdirectoryrootdirectoryamount.name,filename); db.rootdirectoryrootdirectoryamount.dirid=0; db.rootdirectoryrootdirectoryamount.inodenumber=inodeamount; db.inode

11、inodeamount.blockamount=1; db.inodeinodeamount.directblockaddress1=datablockamount; db.inodebitmapinodeamount=1; db.blockbitmapdatablockamount=1; filelistfileamount=db.rootdirectoryrootdirectoryamount; rootdirectoryamount+; inodeamount+; datablockamount+; fileamount+; printf(文件创建成功n); else printf(创建

12、失败,根目录已满n); else for(int i=0;i4) printf(创建失败,该目录已满n); break; else strcpy(db.datablockdb.inodedirectorylisti.inodenumber.directblockaddress1.deib.detnum.name,filename); db.datablockdb.inodedirectorylisti.inodenumber.directblockaddress1.deib.detnum.dirid=0; db.datablockdb.inodedirectorylisti.inodenumb

13、er.directblockaddress1.deib.detnum.inodenumber=inodeamount; db.inodeinodeamount.blockamount=1; db.inodeinodeamount.directblockaddress1=datablockamount; db.inodebitmapinodeamount=1; db.blockbitmapdatablockamount=1; filelistfileamount=db.datablockdb.inodedirectorylisti.inodenumber.directblockaddress1.

14、deib.detnum; inodeamount+; datablockamount+; fileamount+; db.datablockdb.inodedirectorylisti.inodenumber.directblockaddress1.deib.num+; printf(文件创建成功n); break; if(i=directoryamount) printf(创建失败,路径有误n); void Mkdir() /创建目录 char directoryname8,path10; printf(目录名称:); scanf(%s,directoryname); printf(目录路径

15、:); scanf(%s,path); if(strcmp(path,Root)=0) if(rootdirectoryamount4) strcpy(db.rootdirectoryrootdirectoryamount.name,directoryname); db.rootdirectoryrootdirectoryamount.dirid=1; db.rootdirectoryrootdirectoryamount.inodenumber=inodeamount; db.inodeinodeamount.blockamount=1; db.inodeinodeamount.direct

16、blockaddress1=datablockamount; db.inodebitmapinodeamount=1; db.blockbitmapdatablockamount=1; directorylistdirectoryamount=db.rootdirectoryrootdirectoryamount; rootdirectoryamount+; inodeamount+; datablockamount+; directoryamount+; printf(目录创建成功n); else printf(创建失败,根目录已满n); else for(int i=0;i4) print

17、f(创建失败,该目录已满n); break; else strcpy(db.datablockdb.inodedirectorylisti.inodenumber.directblockaddress1.deib.detnum.name,directoryname); db.datablockdb.inodedirectorylisti.inodenumber.directblockaddress1.deib.detnum.dirid=1; db.datablockdb.inodedirectorylisti.inodenumber.directblockaddress1.deib.detnu

18、m.inodenumber=inodeamount; db.inodeinodeamount.blockamount=1; db.inodeinodeamount.directblockaddress1=datablockamount; db.inodebitmapinodeamount=1; db.blockbitmapdatablockamount=1; directorylistdirectoryamount=db.datablockdb.inodedirectorylisti.inodenumber.directblockaddress1.deib.detnum; inodeamoun

19、t+; datablockamount+; directoryamount+; db.datablockdb.inodedirectorylisti.inodenumber.directblockaddress1.deib.num+; printf(目录创建成功n); break; if(i=directoryamount) printf(创建失败,路径有误n); void Cd() /更改当前目录项 printf(请输入当前目录为:); scanf(%s,localposition); printf(当前目录位置修改成功n);void Delfile() /删除文件 char filenam

20、e8; int i,j,k,flag; printf(请输入要删除的文件的名称:); scanf(%s,filename); for(k=0;krootdirectoryamount;k+) if(strcmp(db.rootdirectoryk.name,filename)=0) memset(db.rootdirectoryk.name,0,8); db.rootdirectoryk.dirid=-1; db.rootdirectoryk.inodenumber=-1; break; for(k=0;kdirectoryamount;k+) for(j=0;jdb.datablockdb.

21、inodedirectorylistk.inodenumber.directblockaddress1.deib.num;j+) if(strcmp(db.datablockdb.inodedirectorylistk.inodenumber.directblockaddress1.deib.dej.name,filename)=0) memset(db.datablockdb.inodedirectorylistk.inodenumber.directblockaddress1.deib.dej.name,0,8); db.datablockdb.inodedirectorylistk.in

22、odenumber.directblockaddress1.deib.dej.dirid=-1; db.datablockdb.inodedirectorylistk.inodenumber.directblockaddress1.deib.dej.inodenumber=-1; break; for(i=0;ifileamount;i+) if(strcmp(filename,filelisti.name)=0) flag=i; if(db.inodefilelisti.inodenumber.blockamount=1) memset(db.datablockdb.inodefilelis

23、ti.inodenumber.directblockaddress1.space,0,64); db.inodefilelisti.inodenumber.blockamount=0; db.inodebitmapfilelisti.inodenumber=0; db.blockbitmapdb.inodefilelisti.inodenumber.directblockaddress1=0; db.inodefilelisti.inodenumber.directblockaddress1=-1; printf(文件删除成功n); break; else if(db.inodefilelis

24、ti.inodenumber.blockamount=2) memset(db.datablockdb.inodefilelisti.inodenumber.directblockaddress1.space,0,64); memset(db.datablockdb.inodefilelisti.inodenumber.directblockaddress2.space,0,64); db.inodefilelisti.inodenumber.blockamount=0; db.inodebitmapfilelisti.inodenumber=0; db.blockbitmapdb.inode

25、filelisti.inodenumber.directblockaddress1=0; db.blockbitmapdb.inodefilelisti.inodenumber.directblockaddress2=0; db.inodefilelisti.inodenumber.directblockaddress1=-1; db.inodefilelisti.inodenumber.directblockaddress2=-1; printf(文件删除成功n); break; else int temp=db.inodefilelisti.inodenumber.blockamount-

26、2; memset(db.datablockdb.inodefilelisti.inodenumber.directblockaddress1.space,0,64); memset(db.datablockdb.inodefilelisti.inodenumber.directblockaddress2.space,0,64); db.inodefilelisti.inodenumber.blockamount=0; db.inodebitmapfilelisti.inodenumber=0; db.blockbitmapdb.inodefilelisti.inodenumber.directblockaddress1=0; db.blockbitmapdb.inodefilelisti.inodenumber.directblockaddress2=0; db.blockbitmapdb.inodefilelisti.inodenumber.stairindexaddress=0; db.inodefilelisti.inodenumber.directblockaddress1=-1; db.inodefilelisti.inodenumber.directblockaddress2=-1; for(int j=0;jtemp;j+) int temp1=db.data

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

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