操作系统课程设计报告-类Unix文件系统的设计与实现.doc_第1页
操作系统课程设计报告-类Unix文件系统的设计与实现.doc_第2页
操作系统课程设计报告-类Unix文件系统的设计与实现.doc_第3页
操作系统课程设计报告-类Unix文件系统的设计与实现.doc_第4页
操作系统课程设计报告-类Unix文件系统的设计与实现.doc_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课 程 设 计 报 告设计题目:类Unix文件系统的设计与实现班 级:计算机1105 组长学号:20113245组长姓名:葛欣指导教师:李晓华设计时间:2013年7月设计分工组长学号及姓名: 20113245葛欣 分工:用户登录管理、创建文件、删除文件、创建目录、删除目录、列出当前目录下的文件和文件夹、改变当前工作目录、磁盘i节点的管理,创建Link型的文件组员1学号及姓名:20113259汤新奇 分工:打开文件、关闭文件、读文件、写文件、复制文件、文件权限检查、文件操作授权组员2学号及姓名:20113268刘烨分工:系统打开文件表和用户打开文件表的维护,位示图法组员3学号及姓名:20113255吕桐 分工:数据区成组链接法的实现,文件重命名摘 要此次课程设计基于操作系统课程上所讲述的基本原理,结合Unix系统源代码分析相关资料,实现了一个类Unix操作系统的文件系统实现,具有多用户访问,权限控制,创建快捷方式(Link文件)的功能。关键词:类Unix文件系统,多用户访问,权限控制,Link文件实现 目 录摘要1. 概述 .62. 课程设计任务及要求.6 2.1 设计任务.6 2.2 设计要求.63. 算法及数据结构.63.1算法的总体思想(流程)6 3.2 用户管理模块实现.7 3.2.1 功能.73.2.2 数据结构.7 3.3 文件存储模块实现.73.4 创建文件模块实现.10 3.4.1功能.10 3.4.2算法.103.5 创建目录模块实现.10 3.5.1功能.10 3.5.2算法.103.6 删除单个文件模块实现.10 3.6.1功能.10 3.6.2算法.103.7 删除空文件夹模块实现.11 3.7.1功能.11 3.7.2算法.113.8 删除平凡文件夹模块实现.11 3.8.1功能.11 3.8.2算法.113.9 目录切换模块实现.12 3.9.1功能.12 3.9.2数据结构.123.10 空闲i 节点管理模块实现.12 3.10.1功能.12 3.10.2数据结构.12 3.10.3算法123.11 创建link 类型文件模块实现.13 3.11.1功能.13 3.11.2算法.133.12 显示当前目录的文件和文件夹模块实现 .13 3.12.1功能.13 3.12.2数据结构.133.13系统打开文件表和用户打开文件表的维护模块实现143.13.1数据结构 .143.13.2算法153.14位示图法管理数据磁盘块模块实现.183.14.1数据结构.183.14.2算法.18 3.15读写块数据模块实现.19 3.15.1功能.19 3.15.2数据结构 .19 3.15.3算法.21 3.16复制模块实现 .21 3.16.1功能.21 3.16.2算法.21 3.17授权模块实现 .21 3.17.1功能.21 3.17.2算法.21 3.18权限检查模块实现.21 3.18.1功能.21 3.18.2算法.21 3.19读文件模块实现 .21 3.19.1功能.21 3.19.2算法.22 3.20写文件模块实现 .22 3.20.1功能.22 3.20.2算法.22 3.21重命名模块实现 .22 3.21.1功能.22 3.21.2算法.22 3.22成组链表法管理空闲块模块实现 .22 3.22.1功能.22 3.22.2数据结构 .22 3.22.3算法.23 3.23格式化模块实现.23 3.23.1功能.23 3.23.2数据结构 .23 3.23.3算法.244. 程序设计与实现.24 4.1 程序流程图.24 4.2 程序说明及实验结果.325. 结论.426. 参考文献.427. 收获和体会.421 概述 文件系统是结构化管理设备上的数据的机制。文件是为了管理块的集合而定义的概念,目录通过文件名管理文件,它在本质上与文件概念相同。但是会有多个用户试用系统,所以我们设定文件和目录访问权限。块设备区域分为四种,超级块用来管理块设备的控制信息,inode用来管理文件的定义信息,存储区域的块用来保存数据本身。文件的实体由一个inode和多个存储区域块组成,文件使用的存储区域的块可以通过inode的映射获取。2 课程设计的任务及要求2.1设计任务 多用户、多级目录结构文件系统的设计与实现。2.2设计要求 1、在深入理解操作系统基本原理的基础上,对于选定的题目,以小组为单位,先确定设计方案;2、设计系统的数据结构和程序结构,设计每个模块的处理流程。要求设计合理; 3、编程序实现系统,要求实现可视化的运行界面,界面应清楚地反映出系统的运行结果; 4、确定测试方案,选择测试用例,对系统进行测试; 5、运行系统并要通过验收,讲解运行结果,说明系统的特色和创新之处,并回答指导教师的提问; 6、提交课程设计报告。 3 算法及数据结构3.1 算法的总体思想 由于是要模拟磁盘的文件系统,需要一块虚拟的磁盘作为操作对象,所以利用malloc函数在内存中开辟连续的512K字节的内存单元作为虚拟的磁盘进行操作。按512B为一个数据块,共分出1024块。其中,0号块为引导块,1号块为超级块,i节点区为32块,剩下的为数据区。其中,对于数据区,一个i节点需要64B,每块中包括32个i节点;每个目录项占用16字节的空间,因此一个目录下最多有32个子目录。目录作为数据存储在数据区中。 对于文件系统状态的保存,采用以二进制形式保存的txt文件保存,当系统退出时,将作为虚拟磁盘的连续内存的内容全部以二进制的形式写入txt文件中,当系统启动时,再将txt文件的内容写回内存中,一次做到状态的保存。3.2 用户管理模块实现3.2.1功能此次课程设计是针对多用户文件系统的实现,此模块提供用户登录和注销功能,并且可以维护一张已经登录用户表,实现已经登录用户之间的切换。3.2.2数据结构功能实现涉及两张表,用户表和已经登录用户表。用户表的功能是:从用户配置文件中读入每个合法用户的用户名和密码,在使用用户登录功能时,将会顺序查找这张表。如果是在表中的用户就是合法用户,如果信息匹配就会允许这个用户登入,并把这个用户加入到已经登录用户表。已经登录用户表的功能是:如果有用户登录,就会将这个用户的信息加入表中。如果有用户注销,将会将这个用户的信息从表中移出。此外还有一个需要维护的信息:当前已经登录的用户信息。维护当前用户的目的是:用户创建文件和打开文件的过程中,系统需要根据当前已经登录的用户信息,在创建文件的过程中写入用户的所有者(用户的所有者拥有文件的所有权限),在打开文件或者进行其它操作的过程中,会对当前用户进行权限判断。3.3 文件存储模块实现想要了解类Unix的文件系统如何实现,我们还需要了解一个文件或者一个文件夹是如果存储在磁盘块内的。一个文件是由文件描述的信息组成的,但是为了提高文件系统的性能,我们一般的实现是把文件的信息分成两个部分,符号目录项SFD和基本目录项BFD。符号目录项是存储在数据区的一个块中。如图所示图 符号目录项SFD与此同时,含有较多信息的基本目录项BFD存储在磁盘的i节点区中,如图所示:图 基本目录项BFD下面说明文件目录和文件的组织,为了简化模型,这里BFD只展示文件外存地址的数组。以根目录为例,假设根目录有neu.txt和china文件夹。那么对应根目录的SFD的表会如下所示文件名i节点号neu0china1图 示例SFD表中的内容容易发现,虽然一个是文件,一个是文件夹,但是他们并在SFD的表格中却并不能看出什么差别。值得一提的是,这里面的i节点号并不绝对,这与文件系统是否是初始化之后再创建文件有关。当查看这两个项时,先按名查找,得到i节点号之后,再在i节点区按号查找,得到相应的信息。比如neu.txt文件的0号i节点会有如下的信息:文件类型间接索引TxtFalse容易看见,间接索引为false,说明是直接索引。如果这个文件是直接索引,那么外存分配数组中的每一项都是文件系统的物理块号。例如:这个i节点的外存分配数组为:4355565758那么这个文件对应的外存块按顺序就是43,55,56,57,58.如果这个文件是间接索引,那么外存分配数组的每一项都对应一个i节点号。如果对应的这个i节点是直接索引,那么处理方式与直接索引一样,对应的i节点的外存分配数组中的每一项都是文件系统对应的物理块号。如果一直采用间址方式,则策略与之前一样,递归地查找下去。可以看出如果没有磁盘盘块的限制,尽管一个BFD项目(i节点)中的数组大小是有限度的,但是通过间址标志来间接寻址,这种间址管理大文件的方式可以管理无限大的文件。当然在实际情况下,这种方式还是受磁盘本身大小的限制的。例如:如果neu.txt对应的0号i节点存有如下信息文件类型间接索引TxtTURE地址数组中的内容如下:23那么接下来会访问2号i节点,3号i节点。为了简单地说明问题,设2号3号i节点是直接索引,那么两个i节点的地址数组里面的数据都是对应真实的物理块号。如果2号i节点地址数组的内容是70717273743号i节点地址数组的内容是9091那么我们通过上述所有信息可以得到:1、 这个文件是采用间接寻址方式的。2、 这个文件一共有7个数据块,对应的磁盘物理块号是70、71、72、73、74、90、91。接下来说明文件夹china的i节点的信息文件类型间接索引SFDFALSESFD表示文件夹类型,这种情况下,间接索引一定为FALSE,地址数据中只有一项,内容是存储有SFD表格的数据块的块号,SFD表格中的内容是这个文件夹下面的文件和文件夹。例如地址数组第一项(也是唯一的一项)的内容是36。那么如果这个时候我们查看36号物理块的内容,我们可以找到文件名i节点号Tsinghua7MIT8那么通过上述信息我们可以得出如下结论:在china这个文件夹下面,有两个文件或文件夹,名字分别是Tsinghua和MIT,但是想要查看这两个项是文件还是文件夹,需要查看它们指明的i节点中的信息。3.4 创建文件模块实现3.4.1功能在当前的工作目录下,创建一个文件。3.4.2算法实际上,由上面的模块实现可以看出,想要创建一个文件,要做三件事情:1、在当前工作目录的SFD表中新增一项2、新申请一个i节点,把新申请到的i节点的i节点号添入SFD表中新增的那一项上。3、在新申请的i节点中填写文件的类型,文件所有者等信息。3.5 创建目录模块实现3.5.1功能在当前的工作目录下,创建一个新的空白目录。3.5.2算法类似地想要创建一个文件夹,要做三件事情:1、在当前工作目录的SFD表中新增一项2、新申请一个i节点,把新申请到的i节点的i节点号添入SFD表中新增的那一项上。3、在新申请的i节点中填写文件的类型为SFD,并添加文件所有者等信息。3.6 删除单个文件模块实现3.6.1功能在当前目录下,删除一个文件3.6.2算法删除一个文件,要经历五步:1、在当前工作目录的SFD表中按名查找,把这个项读出,并删除这一项SFD2、根据被删除的SFD中指出的i节点号,访问这个i节点3、如果这个i节点中说明这个文件是直接寻址的,那么把这个i节点中的地址数据对应的块号一律通过相应程序回收,并把这些块号标记为空闲可用的状态。4、如果这个i节点是间接寻址的,那么访问间址指向的i节点,如果是直接寻址的i节点,执行3步骤,如果是间址寻址的i节点,那么不断地找出间址指向的i节点,直到找到直接寻址的i节点,执行步骤3。5、把所有访问过的i节点全部通过i节点回收机制,将这些i节点标记为不可用的状态。3.7 删除空文件夹模块实现3.7.1功能在当前工作目录下,删除一个空文件夹3.7.2算法1、在当前工作目录的SFD表中按名查找,把这个项读出,并删除这一项SFD2、根据被删除的SFD中指出的i节点号,访问这个i节点3、根据这个i节点提供的地址信息,找到这个文件夹的SFD表(这张SFD表记录了要删除的这个文件夹下面所有的文件和文件夹)。4、如果这个文件夹为空,删除文件夹的i节点,回收文件夹的SFD表。5、如果这个文件夹不为空,报错,不做任何操作。3.8 删除平凡文件夹模块实现3.8.1功能定义:我们把一个文件系统中任何的一个文件夹称为“平凡的”文件夹。这种平凡文件夹可以是空的,也可以是非空的(也就是说,这个文件夹下面可以有多个文件和文件夹,其中文件夹也是一个平凡的文件夹)删除平凡文件夹模块要实现的功能是:如果这个文件夹为空,则直接把这个文件夹删除;如果这个文件夹不空,则提示文件夹不空,询问用户是否继续。如果用户选择继续则这个文件夹下面的所有文件和文件夹连同要删除的文件夹一并删除。3.8.2算法很明显,这个模块是一个递归的过程,需要将删除空文件夹模块和删除单个文件这两个模块配合使用。1、在当前工作目录的SFD表中按名查找,把这个项读出,并删除这一项SFD2、根据被删除的SFD中指出的i节点号,访问这个i节点3、根据这个i节点提供的地址信息,找到这个文件夹的SFD表(这张SFD表记录了要删除的这个文件夹下面所有的文件和文件夹)。4、如果这个文件夹为空,调用删除空文件夹模块5、如果这个文件夹不为空,询问用户是否继续。6、如果用户选择继续,遍历文件夹下面的文件或文件夹7、如果当前遍历到的是一个文件夹,递归调用删除平凡文件夹的模块。通过递归地调用之前写好的删除空白文件夹和删除单个文件的模块,我们可以删除任何的一个文件夹。3.9 目录切换模块实现3.9.1功能在用户使用文件系统的过程中,常常需要更换当前的工作目录,以实现在不同的目录下进行文件的操作3.9.2数据结构用户每当进入一个文件夹时,系统会更新一个数组,这个数组存放着当前的工作路径,并且更新当前目录对应的SFD表格的位置。工作路径存放数组的结构如下:设当前的工作路径是rootMIT,那当前路径数组里存放的信息是:rootMIT而当前SFD表格位置为MIT文件夹对应的SFD表格。3.10 空闲i节点管理模块实现3.10.1功能i节点管理功能。当创建一个文件的时候,先写在符号目录表中写符号目录项SFD,在写SFD的过程中,需要先在i节点区中申请一个空闲的节点,并把这个节点标记为已用,并把申请到的i节点号在SFD中记录。这样在打开文件时,先在当前目录的SFD表中通过文件名找到对应文件的SFD,在SFD中得到i节点号的信息,这样我们可以获得这个文件的更多信息(例如文件的外存分配情况,通过查看外存分配情况我们可以查看这个文件)在删除一个文件时候,我们会删除SFD和BFD,BFD的删除不会在对应的BFD表中真正地删除这里面存储的数据,而是把这个i节点在相应的数据库中标记为空闲,因为文件系统不会访问被标记为空闲的i节点,并且在某一次分配新的i节点的时候这个i节点因为被标记为空闲会被再次使用,所以虽然没有把这个i节点里面的信息清除,但是通过相应的数据结构,这个节点实际上已经被删除了。3.10.2数据结构为了实现i节点的管理,我们采用位示图法。位示图中的第n项里面存放着第n个i节点的信息,如果记录为false,说明这个i节点目前被占用。如果记录为true,说明这个i节点目前处于空闲状态。3.10.3算法申请一个空闲的i节点: 遍历位示图,如果找到true,则将这一项改为false并返回这一项的项数,也就是从空闲i节点中新分配的一个可用的i节点。释放一个i节点:得到想要释放的i节点号,把位示图对应位置置为true,即空闲状态即可。3.11 创建link类型文件模块实现3.11.1功能在视窗操作系统中,我们常常用到快捷方式这个功能,而在Unix中,这个功能叫link。虽然名字不同,但是功能是一致的。在此次课程设计中,我们实现了这个功能。3.11.2数据结构下面我们来看看link型文件是怎样存储在磁盘中的。首先我们假定root下有一个link型文件gexin.link:文件名i节点号gexin0china1查看0号i节点(gexin这个文件所指向的i节点)文件类型地址数组link1Link型地址数组只有一项,记录着被link文件的i节点号。这里面我们看到被link的源文件i节点号为1,那么根据以上信息我们可以得出结论:gexin.link文件是一个link型的文件,而且它是china.txt这个文件的快捷方式。如果源文件china.txt被删除,即使gexin.link存放着相应信息,但是会因为源文件信息的删除而无法访问到源文件。可以看出,link型文件与我们通常认识的视窗操作系统的快捷方式是一样的。3.12 显示当前目录的文件和文件夹模块实现3.12.1功能无论是在什么样的操作系统中,都有这样的一个功能:列出当前目录的文件和文件夹,此次课程设计我们也实现了这样的功能。3.12.2数据结构因为在变更目录的时候,我们更改了当前工作目录的数组,也更新了当前工作目录对应SFD表的位置,首先我们根据当前目录SFD表的位置,我们可以得到当前目录下的所有SFD的信息。例如文件名i节点号gexin0Tsinghua1在得到所有的目录项的i节点号之后,我们访问SFD表中所有的i节点在此例中,访问0号i节点:所有者大小文件类型gexin32txt这里面需要说明的是,i节点本身没有文件名的信息,文件名的信息在SFD中。所以结合SFD和i节点(BFD),我们可以输出如下信息:文件名文件类型所有者大小gexintxtgexin32在这个例子中,我们还有一个i节点1号i节点没有访问。访问1号i节点:所有者大小文件类型gexin0sfd故我们可以输出的信息是:文件名文件类型所有者大小Tsinghua文件夹gexin0综上所述,这个模块输出的结果是:文件名文件类型所有者大小gexintxtgexin32Tsinghua文件夹gexin03.13系统打开文件表和用户打开文件表的维护模块实现3.13.1数据结构:struct SysFileTable int fw;/写文件int fr;/读文件int fid;/文件id;/用户struct ProFileTableint wr; /读0写1int fid; /文件id;/单进程struct userint pid;/进程idint wr;/读0写1int fid;/文件id;vector SysT;/系统打开文件表vectorProT;/单进程打开文件表struct TProFileTablevectorProT;int pid;/进程id;vectorTProT;/进程总表3.13.2算法文件共享打开算法void OpenFile(SysFileTable(系统表), user(用户),TProFileTable(文件表))int flag = 0;int ret;for (int i = 0; i 系统表大小; i+)if (文件已经被打开过) if (进程读) if (文件表中写) 输出不能读;ret = 0;else if (同时读) 读计数加一;ret = 1;else if (进程写)if (文件表中写) 输出不能写;ret = 0;else if (文件表中读) 输出不能写;ret = 0;else 输出错误;flag = 1; break;if (文件没有打开过)if (进程读) 在文件表中加入新文件信息;ret = 1;else if (进程写) 在文件表中加入新文件信息;ret = 1;else 输出错误;if (ret = 1) for (i = 0; i TProT.size(); i+)if (进程表中有此进程记录)添加进程信息; Flag=1;if (flag = 0)创新进程记录;共享关闭文件算法:void CloseFile(user)for (int i = 0; i 总进程表大小; i+) /对进程文件表进行操作if (用户)for (int j = 0; j ProT.size(); j+)if (进程文件=删除文件)在进程总表中修改文件记录;if (此进程只打开一个文件)删除此进程;break;else 输出错误;for (int k = 0; k SysT.size(); k+) /对系统文件表进行操作if (U.fid = SysT.at(k).fid)if (多进程读) 读计数减一;else if (单进程写|读) 在文件表中删除;3.14位示图法管理数据磁盘块模块实现3.14.1 数据结构#define i_node_num 256/i节点数量vectorWSPicture(pansize, 1);/一位数组的位视图3.14.2 算法连续分配算法vector 连续分配(WSPicture(位视图),Filesize(需要分配的大小))/连续分配vectorcon; /存储分配的块号int flag = 0;for (i = 0; i 位视图; i+)if (WSPicturei = 1)for (j = i; jFilesize+i; j+) if (判断是否可以连续分配Filesize的磁盘) break;if (可以连续分配)将空闲磁盘大小减去文件大小;for (l; l j; l+) /文件占用至为0分配的位视图至0;Con储存分配的磁盘块号;超级块空闲磁盘大小-分配文件大小;flag = 1;return con; if(分配失败了) 输出 分配失败了! 不连续分配算法vector disconWeishi(WSPicture,Filesize)/不连续分配vectorlable;/分配的块儿号for (i = 0; i位视图大小; i+)if (位视图为1)lable.push_back(i);位视图至0;超级块空闲块-分配文件大小;if (lable.size() = Filesize)return lable;关闭文件释放磁盘:int DeleteWeishi(vector&WSPicture, int Filestart, int Filesize)for (i = Filestart; iFilestart + Filesize; i+) /释放磁盘位视图至1; 超级块中空闲块+释放的块号;return OK;3.15读写块数据模块实现3.15.1功能 对块进行读写操作,给定块号及所要操作的数据,将数据从块中读出或写入,对物理层操作的封装,实现上层功能与物理层操作的隔离。上层用户只需提供要操作的块号及数据(i节点,数据块),对于如何存取到磁盘中对上层用户是透明的。3.15.2 数据结构使用向量容器vector存取块内的i节点,目录项等信息,I节点结构体typedef struct i_node/磁盘I节点 bool i_mode75 ;/存取权限数组Read,Write,copy,delect,change,八个用户的分别权限unsigned short i_addrmax_sy;/直接索引,物理块存放处,间接索引时存放节点 bool i_flag;/i节点标志是否为直接索引或简介索引,1表直接索引unsigned short i_userid;/用户IDunsigned short i_kind;/文件类型 unsigned int i_size;/文件大小i_node; 超级块结构体typedef struct super_node/超级块unsigned short s_isize;/i节点块的块数unsigned long s_fsize;/数据块的块数(磁盘块)unsigned int s_nfree;/所有空闲块的块数unsigned short s_pfree;/栈顶指针(栈中的空闲块)unsigned int s_freeNICFREE;/空闲块栈unsigned int s_ninode;/系统中总的空闲i节点的数量bool s_fmod;/超级块在内存是否被修改的标志1表修改,0表未修改bool i_node_statei_node_num;/i节点空闲状态super_node;目录项结构体typedef struct free_node/组长块 int free_num;/组块数 50int free50;/空闲块数组 free_node;成组连接组长块结构体typedef struct directory/目录项 16字节char dri_name14;/文件名unsigned short i_num;/i节点号directory;3.15.3算法根据上层传递的参数,区分操作的数据块所在区;根据所在区定义临时结构体变量;使用memcpy函数存取数据到变量中,在存取到vector中;函数结束,返回vector;3.16 复制模块实现3.16.1功能将当前目录下已存在的txt文档复制到指定的存在目录下3.16.2算法根据文件名找到文件对应的i节点和数据块调用i节点分配函数和空闲块分配函数分配出所需要的i节点数和空闲块数;将文件对应的空闲块复制到新开辟出来的空闲块中,并将对应的空闲块号存入开辟出来的i节点中;根据指定的目录找到其位置,并在该目录下新建一个目录项,文件名为索要复制的txt文件名,并将其后对应的索引号区存放新开辟的i节点号;3.17授权模块实现3.17.1功能修改用户对文件操作的权限。3.172算法根据指定文件找到文件对应的i节点;根据指令指定的修改的权限并且根据要授权的用户id号来修改i节点中成员变量mode75;3.18权限检查模块实现3.18.1功能当用户对文件进行操作时,需要对用户进行文件权限检查。3.18.2算法根据指定文件找到文件对应的i节点;查看i节点成员变量mode75,根据用户id查看mode75得到操作文件的权限;3.19读文件模块实现3.19.1功能打开txt文件3.19.2算法根据当前目录以及txt文件名称找到文件的i节点根据i节点找到数据块,将数据块号按文件的逻辑顺序存放到vector中;在内存中开辟一定连续空间,一次读取数据块中的数据到连续空间中,再将这块连续空间里的内容强制类型转换成char类型后显示出来;3.20写文件模块实现3.20.1功能写字符串到txt文件中3.20.2算法根据当前目录以及txt文件名称找到文件的i节点定义一个临时char变量,将屏幕输入的内容存放在该变量中;根据输入内容的大小,申请空闲块号存放到vector中,并将变量内的内容划分成若干分存到空闲块中,将空闲块号组织存放在i节点中; 3.21重命名模块实现3.21.1功能修改当前目录下给定文件的文件名。3.21.2算法修改文件名函数,需要在进入目录后执行,可以修改当前目录中的文件名,文件名是存在块中的,一个块可以存32个文件名,而程序有一个全局变量记录当前盘块,读取盘块后就可以获得盘块内记录的文件信息,所以,当输入文件名字时,遍历盘块中的文件名,如果有,则修改,如果没有,则报错。修改之后,把信息写回盘块。3.22成组链表法管理空闲块模块实现3.22.1功能成组链接法实现数据块的分配与回收,当上层需要数据块时,可以分配给上层空闲数据块,当上层要释放数据块时,可以释放不占用的数据块。3.22.2数据结构 typedef struct super_node/超级块 unsigned short s_isize;/i节点块的块数unsigned long s_fsize;/数据块的块数(磁盘块)unsigned int s_nfree;/所有空闲块的块数unsigned short s_pfree;/栈顶指针(栈中的空闲块)unsigned int s_freeNICFREE;/空闲块栈unsigned int s_ninode;/系统中总的空闲i节点的数量bool s_fmod;/超级块在内存是否被修改的标志1表修改,0表未修改bool i_node_statei_node_num;/i节点空闲状态super_node; typedef struct free_node/组长块 int free_num;/组块数 50int free50;/空闲块数组 free_node;3.22.3算法 首先学习成组链接法,把理论看明白后开始编写代码。 block_alloc()是用来分配块设备存储区域中未使用的块的函数。在超级块中,有空闲队列s_free,空闲指针s_pfree,剩余空闲块数s_nfree。在初始化的时候,把卷四的块从后往前每50块分成一组。而卷四总共990个块,第一块的块号是34,但是要被占用,所以第一个空闲块是35号。 (990-1)%50=39最后一组有39块。所以把35号开始的39块存入空闲队列,s_pfree等于39,表示此时空闲队列中有39个空闲块。s_nfree等于899,表示此时有889个未使用的块。当s_pfree等于1时,空闲队列只剩下组长块,在返回块号之前,要先把组长块中的信息,既下一组的块号复制到空闲队列中。否则直接返回空闲块的块号并指针减1。block_free()是用来回收释放的块的函数。它接收的参数是释放块的块号。当空闲队列满了的时候,即s_pfree等于50,此时要释放的块是组长块,而且空闲队列已经满了,需要把空闲队列中信息写入组长块中。把s_pfree置1,把空闲队列释放,把组长块的块号存入空闲队列中。如果s_pfree不等于1,可以直接把要释放的块号复制到空闲队列中,然后把s_pfree加1。写完两个基本函数之后,用这两个函数实现组长给的函数原型。组长要求每次申请和释放的块数不为一,所以加入计数后可以直接调用block_alloc()和block_free()。在分配和回收的过程中,都需要读取块和写块,调用的汤新奇同学写好的函数。3.23格式化模块实现3.23.1功能初始化超级块中与数据块分配释放有关的部分3.23.2数据结构 typedef struct super_node/超级块 unsigned short s_isize;/i节点块的块数unsigned long s_fsize;/数据块的块数(磁盘块)unsigned int s_nfree;/所有空闲块的块数unsigned short s_pfree;/栈顶指针(栈中的空闲块)unsigned int s_freeNICFREE;/空闲块栈unsigned int s_ninode;/系统中总的空闲i节点的数量bool s_fmod;/超级块在内存是否被修改的标志1表修改,0表未修改bool i_node_statei_node_num;/i节点空闲状态super_node;3.23.3算法因为成组链接法分配和释放块时要用到超级块中的空闲队列,所以超级块的初始化要给空闲队列和空闲队列的指针赋初值,最后一组空闲块是从35到73,所以空闲队列中的第一到39分别是35到73。s_pfree为39,s_nfree为889。4 程序设计与实现4.1 程序流程图用户登录流程图图 用户登录流程图用户注销流程图图 用户注销流程图创建文件流程图图 创建文件流程图删除单个文件流程图图 删除单个文件流程图删除空白文件夹流程图图 删除空白文件夹流程图删除平凡文件夹流程图共享打开文件流程图(openfile): 共享关闭文件流程图(CloseFile):位示图法管理磁盘数据区盘块算法连续分配位示图法管理磁盘数据区盘块算法不连续分配 读写块操作流程图4.2 程序说明这个部分主要说明程序是如何操作的。进入系统之前应该进行登录,输入login a aa (a是用户名,aa是密码)再登录一个用户,输入 login b bb此时当前用户是b,输入switch a,将当前用户切换成a注销a 输入logout a,因为当前用户被注销,需要重新指定当前用户输入1是指定当前已经登录的用户作为当前用户输入2是登录新用户这里面我们选择2,登录新用户作为当前用户以上是用户管理功能的操作下面讲解如何在文件系统中操作文件。首先进入主界面,如图:想要查看当前的目录,输入dir,如图程序提示“Current Directory is empty.”说明当前工作目录为空。此时输入 create 1.txt,再查看当前路径,如图创建文件夹,输入mkdir gexin,再输入dir查看当前路径 如图输入del 1.txt,删除一个文件,再查看当前目录删除一个空文件夹gexin,再显示当前目录下面删除一个一般的非空的文件夹建立一个文件夹 mkdir gexin进入gexin文件夹 cd gexin,创建文件夹1.txt,显示当前工作目录返回根目录,使用指令ret删除非空的gexin文件夹:delete gexin系统提示:非空文件夹,仍然要删除? 输入Y,之后查看当前目录接下来验证link指令,以及write,open指令先创建gexin目录,在gexin目录下创建1.txt,并写入内容。可可以看见1.txt的内容是Tsinghua University现在使用ret指令,回到根目录下,我们要创建一个快捷方式使用指令link root

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论