文件系统实验

一、实验内容

1.设计一个测试方法并编写测试程序,测试XV6中一个文件所能占用的最大磁盘块数。

(1)测试方法

1)创建一个新的空文件,并打开该文件。

2)不断地往文件中写入数据,直到文件无法再分配更多的磁盘块为止。

3)统计文件占用的磁盘块数量,并记录下来。

4)检查文件系统的相关参数,确认最大磁盘块数是否达到了预期的限制

(2)测试程序

(3)运行结果

文件所能占用的最大磁盘块数为140块

2.分析XV6文件系统的相关代码,分析上一步的测试结果。

(1)fs.c源文件的bmap函数中,当块号小于NDIRECT时,直接从ip->addrs数组中获取磁盘块号。如果该位置的磁盘块号为0,则调用balloc分配一个新块,并将其赋值给相应位置的磁盘块号。最后返回该磁盘块号。当块号大于等于NDIRECT且小于NDIRECT + NINDIRECT时,需要使用间接块来映射。首先检查NDIRECT位置上的磁盘块号是否为0,如果是,则通过balloc分配一个新的块,并将其赋值给相应位置的磁盘块号。然后读取相应的间接块,并将其存储在缓冲区中。接着通过指针访问缓冲区中的数据,获取相应的磁盘块号。如果该磁盘块号为0,则分配一个新块,并将其赋值给相应位置的磁盘块号。最后通过log_write记录日志,并释放缓冲区。函数返回所分配的磁盘块号。

(2)在struct inode结构中,addrs数组用于存储直接块和间接块的磁盘块号。根据给定的定义uint addrs[NDIRECT+1+1],其中NDIRECT表示直接块的数量,1表示间接块的数量,1表示二级间接块的数量。

(3)#define MAXFILE (NDIRECT + NINDIRECT)在fs.h文件中定义了一个宏,表示一个文件所能占用的最大磁盘块数。根据提供的代码,NINDIRECT表示间接块的数量。因此,一个文件最多可以占用的磁盘块数为NDIRECT + NINDIRECT,即140块。

3.修改XV6文件系统的相关代码,使得文件所能占用的最大磁盘块数有所增加,给出并分析你的代码。

(1)修改fs.h头文件

将文件的最大长度MAXFILE修改,原文件MAXFILE定义为:#define MAXFILE (NDIRECT + NINDIRECT),修改成:#define MAXFILE (NDIRECT + NINDIRECT*2)。

修改原因:NDIRECT表示直接块的数量,NINDIRECT表示间接块的数量。在修改后的定义中,一个文件最多可以使用的磁盘块数为NDIRECT + NINDIRECT*2,即增加了一个二级间接块的数量。每个二级间接块可以映射BSIZE/4个间接块,每个间接块可以映射BSIZE/4个直接块,因此一个文件最多可以使用的磁盘块数变为了NDIRECT + NINDIRECT + NINDIRECT * BSIZE/4 + NINDIRECT * BSIZE/4 * BSIZE/4,即增加了二级间接块所能映射的间接块和直接块的数量。

(2)修改file.h头文件

修改i节点中的addrs,原文为uint addrs[NDIRECT+1],在这个基础上加1,为addrs数组增加一个二级间接块的位置,即修改成uint addrs[NDIRECT+1+1];

(3)修改fs.c

1)修改bmap()函数,在原函数的基础上增加对二级间接块的支持,可以映射更多的磁盘块。

2)修改后的bmap函数会先判断要映射的块是否在直接块范围内。如果是,则尝试从ip->addrs数组中获取该块所对应的磁盘块号。如果不存在,则调用balloc函数分配一个新的物理块,并将其存储到ip->addrs数组中,并返回该块所对应的磁盘块号。

 3)如果要映射的块不在直接块范围内,就需要使用一级或二级间接块来映射。在这里,我们先将要映射的块的索引bn减去NDIRECT,以便处理一级和二级间接块。然后,如果bn小于NINDIRECT,说明要映射的块在一级间接块中。此时,我们需要先加载一级间接块,如果它不存在,则需要分配一个新的物理块,并将其存储到ip->addrs数组的NDIRECT位置中。然后,根据bn计算出一级间接块中对应的索引,从而获取它所对应的磁盘块号。如果该块不存在,则需要分配一个新的物理块,并将其存储到一级间接块中,并调用log_write函数记录日志。最后,释放一级间接块所占用的缓存,并返回要映射的块所对应的磁盘块号。

 4)如果要映射的块在二级间接块的范围内,那么需要先计算出二级间接块和一级间接块所对应的索引。具体来说,我们将bn减去NINDIRECT,然后将它除以NINDIRECT,得到二级间接块所在的索引。然后,将bn对NINDIRECT取模,得到它在一级间接块中的索引。接下来,我们需要加载二级间接块。如果该块不存在,则需要分配一个新的物理块,并将其存储到ip->addrs数组中。然后,根据二级间接块所在的索引,获取一级间接块的磁盘块号,并加载它。如果该块不存在,则需要分配一个新的物理块,并将其存储到一级间接块中,并调用log_write函数记录日志。最后,释放一级和二级间接块所占用的缓存,并返回要映射的块所对应的磁盘块号。

4.重新第一步中的测试程序,再次观察文件所能占用的最大磁盘块数,并分析所得结论

(1)测试结果

最大磁盘块数从140块增加到了268块。

(2)结论

在原来的代码中,文件系统使用了直接块和一级间接块来存储数据。直接块可以存储12个磁盘块的数据,一级间接块可以存储128个磁盘块的数据。因此,最大磁盘块数是140块(直接块 + 一级间接块)。而经过修改后,添加了对二级间接块的支持。二级间接块可以存储128个一级间接块的地址。所以,通过二级间接块可以扩展文件系统的容量。每个一级间接块可以存储128个磁盘块的数据,因此,通过二级间接块,可以额外存储128 * 128 = 16384 个磁盘块的数据。因此,通过修改后的代码,最大磁盘块数变为了140块(直接块)+ 128块(一级间接块)+ 16384块(二级间接块)= 268块。这样的修改使得文件系统能够支持更大的文件大小,提高了文件存储的容量和性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值