文件--非连续空间存放方式

非连续空间存放方式就是一个文件的数据块之间不需要在磁盘上占据连续的一片空间。这样,我们需要一种办法来寻找到文件的所有数据块。那么有什么办法可以做到这一点呢?答案是链表。

使用链表的解决办法很简单。在每个数据块里面留出一个指针的空间,用来存放下一个数据块所在的地址。这样一个数据块连着一个数据块,从最前面的数据块开始就可以顺着指针找到所有的数据块,如图17-5所示。

在这里插入图片描述
在链表存放方式下,文件的映射就是给出文件第一个磁盘快的位置。这种存放方式比起连续存放方式的优点是可以利用碎片。但缺点呢?访问速度慢。尤其是随机访问,访问任何一个数据块均需要从头数据块开始一个指针一个指针地找下去。如果有任何一个指针损坏,则将无法重构整个文件(但如果是连续存放则不存在这个问题,或者说重构要容易得多)

这种方式的另一个问题是增加了存储开销,因为指针要占空间。那除此之外还有什么缺点?这个缺点你可能需要深入了解后才能知道。大家都知道,计算机里面的尺寸都与2的指数次方有关系,因为计算机里2的整数次方比较容易处理(方便读写)。那么一个磁盘块是多少个字节呢?当然应该是2的整数次方个。如果使用磁盘块里面的一部分空间来存放指针,那一个数据块里面存放的数据就很有可能不是2的指数次方了。这将造成数据处理的效率下降。

那么我们有什么办法克服上述问题呢?

答案是肯定的。假定我们是文件系统设计人员,我们有什么办法可想呢?把所有指针从单个数据块抽取出来,全部放在一起,形成一张表不就解决问题了吗?这样,要想知道一个数据块的位置,只需要查找该表即可。而且,该表可以存放在内存里面。这样既解决了数据块里面数据不是2的指数次方的问题,又解决了随机访问速度很慢的问题

这张存放文件数据块指针的表称为文件分配表(File Allocation Table,FAT),如图17-6所示。

文件分配表的每个记录为物理磁盘块编号,每个记录存放的是下一个数据块所存放的物理磁盘块编号

例如,如果文件A的第一个数据块存放在物理磁盘块3上面,那么FAT里面索引为3的记录里面存放的则是A的第2个数据块存放的物理磁盘块,在图17-6里面是10,即文件A的第2个数据块存放在物理磁盘块10里。FAT里索引为10的记录的内容是18,说明文件A的第3个数据块存放在物理磁盘块18中。FAT里索引为18的记录内容是13,说明文件A的下一个数据块在物理磁盘块13里。FAT里索引为13的内容为6,说明下一个数据块在第6个物理磁盘块里。FAT里索引为6的内容为15,说明下一个数据块在第15个物理磁盘块里。FAT里索引为15的记录内容为-1,说明该文件没有下一个数据块,即文件已经结束。这样,根据FAT,我们得出文件A所占的物理磁盘块顺为:
在这里插入图片描述
在这里插入图片描述

这样,我们只需要记住文件A的起始物理磁盘块为3即可。剩下的数据块均可以根据FAT获得。那么我们怎么知道文件A的起始物理磁盘块为3呢?还记得文件夹吗?这个起始地址存放在文件夹里面

我们下面看一下FAT环境下的随机访问。如果我们要随机读写文件,则仍然需要从第1个数据块地址开始,在FAT里面顺着指针找到特定数据块所存放的物理磁盘块后才能读取该块数据。但这里的指针跟踪与使用链表时有着巨大的不同:这里的跟踪在内存发生,不是在磁盘上,因此效率大大提高。读写任何一个磁盘块均只需要一次磁盘访问

这里要强调的一点是,无论是文件分配表还是链表组织,只是形式不同而已,所有链接指针都集中存放,这和我们下面要介绍的索引文件组织是有本质不同的。

总结

  • 文件记录表存储当前数据所在磁盘块以及下一个数据所在磁盘块
  • 第一个数据所在磁盘块记在文件夹上

PS
为什么可以把所有指针从单个数据块抽取出来,全部放在一起,形成一张表?

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值