文件系统笔记六、文件系统布局及数据存储

文件系统笔记六、文件系统布局及数据存储

引言:对于一般用户来说,直接驱动磁盘存取数据位置是极其困难的。操作系统为磁盘外面包裹一层易于使用的抽象,即为文件系统。用户直接与文件系统打交道,无需了解磁盘的技术细节。在本篇及之后的笔记中,我们会介绍文件系统的设计,即如何让完成磁盘物理特性与用户界面的连接


一、文件系统概述

1.1、一段非常有趣的话

  在整理文件系统学习脉络,查阅相关资料的时候,看到这样一篇博客,为我所认识的EXT2(一),作者对于文件系统是什么,解释的非常清楚有趣,易于理解,我摘抄如下:

  人们在认识一件陌生事物时一开始总是从事物的定义、作用和结构入手的。那么首先文件系统的定义是什么呢?简单说文件系统就是文件在磁盘上组织的方法,那为什么需要文件系统呢?
  也许朋友们会这么认为:磁盘是自己的,想怎么放文件就怎么放,还要弄个文件系统来管多麻烦啊!那让我们来打个比方好了,比如你花了100万买了一套100平米的房子,如果没有一个预先规划,今天在厨房放个洗衣机,明天在阳台放个双人床,后天你就会发现新买的冲水马桶只能放在卧室了。当然这种局面是我们不希望看到了,为了避免这种情况的出现,我们在放东西之前就找一个能帮我们放东西的“管家”,一来这个“管家”知道东西怎么放可以在100万的房子里放尽量多的“东西”,二来“管家”可以帮我们快速地找“东西”,不会发生在卧室找到冲水马桶的尴尬。甚至这个有些“管家”还能在我们不小心“丢掉东西”以后还能帮我们找回来。而我们在放东西或取东西的时候只需要委托“管家”,让她帮我们实现放和找。

这里写图片描述
图1、文件系统是我们磁盘空间的“管家”

1.2、文件系统的作用与代价

  将上面的例子推演到文件系统中就可以得到文件系统(“管家”)的主要作用:
1)、优化磁盘空间利用率;
2)、提高磁盘查找数据的效率
3)、提供增值服务,如磁盘恢复、压缩、访问权限控制等,不同文件系统有所差异
4)、我们委托“管家”管理,只要接口统一,“管家”是可以更换的,降低了系统的耦合性

  当然,请到这个超有能力的“管家”是要付出一定代价的。
1)、首先,“管家”要住在“你家里”,因此需要有空间上的代价;
2)、你利用“管家”帮你“放东西”,当然要去了解“管家”,需要有时间上代价。
3)、最后,还要承担“管家”做错事情的风险,因为如果文件系统一旦出错,有可能损失整个磁盘的宝贵数据。

1.3、文件系统的布局

  一个磁盘包括一个个的扇面,编号从0开始递增,整数计数。第0个扇面在整个文件系统中占有重要的意义。该扇面存放的是主引导记录(Master Boot Record, MBR).该记录的内容是一个个小小的程序,用来启动计算机,如果该扇面损坏,则整个磁盘无法使用。

这里写图片描述
图2、文件系统布局

  在MBR后面紧接着是磁盘分区表,磁盘分区表给出的是磁盘的所有分区及其开始和终结地址,其中一个分区是主分区操作系统就装载在这个分区中。主分区最前面是引导记录(Boot Record).

计算机启动过程可以简述如下:
1)、处在主板ROM里面的BIOS程序首先启动,BIOS在进行一些基本的系统配置扫描后,对磁盘的扇面0进行读操作,将MBR里面的程序读到内存并运行。
2)、MBR程序接下来找到主分区,将主分区里面的Boot Record加载并运行。
3)、Boot Record里面的内容是一个小程序,该程序负责找到操作系统的镜像,并加载到内存,从而启动操作系统。

针对计算机启动过程,更详细可参考:计算机是如何启动的。在Boot Record记录块后面的磁盘内容分布因文件系统的不同而存在差异。在之后笔记中,我们会详细解释linux中广泛使用的ext2、ext3、ext4文件系统。


二、文件的数据存放

  文件的实现,归根到底,就是要能够把文件的内容存放在合适的地方,并能够在需要时很容易的读出这些数据,其要解决的是如下几个问题:

1)、给文件分配内存空间:按照用户要求或文件大小分配恰当容量的磁盘空间,
2)、记录文件位置:记录空间位置,便于后续对文件的访问。
3)、将文件内容存放进空间中:通过磁盘的驱动器实现

2.1、数据在磁盘连续存放

  文件内存空间分配、位置记录 、数据读写,都与数据在磁盘上的存放有很大关系。其中空间连续的存放方式,在使用前必须声明文件所需空间大小,文件系统按照声明在磁盘上寻找一片足够大的连续空间分配给该程序,这种寻找自由空间的任务通常由适配算法完成。图3描述的就是连续存放方式下,文件A、B、C、D、E的一种可能的分配方式。

这里写图片描述
图3、连续存放文件的实现

  文件连续存放方式与程序在内存中的连续存放方式非常相似,因此其优缺点也相似。具体来说,文件连续存放的优点是简单,即从文件名到文件地址的映射变成从文件名到文件第一个数据块的地址映射,即只要给出I-NODE地址和文件大小,就可以寻找到所有的文件数据块。另外读写效率高,不需要频繁的进行寻道操作。其缺点浪费,存在外部碎片。另外扩展不变,空间增长有限。我们的解决办法是使用非连续的存储方式。

2.2、数据在磁盘离散存放

  非连续空间存放方式就是一个文件的数据块之间不需要在磁盘上占据连续的一片空间,这样需要一种办法来找到所有的数据块,有如下几种办法,其同样是一个技术不断发展的演变过程。

2.2.1、链表管理离散数据
  设计思想:使用链表的解决办法很简单,在每个数据块里面留出一个指针的空间,用来存放下一个数据块所在的地址。这样一个数据块连着一个数据块,从最前面的数据块开始就可以顺着指针找到所有的数据块。如下图所示:

这里写图片描述
图4、文件的链表存放方式

  优缺点及改进方式:在链表存放方式下,文件的映射就是给出文件第一个磁盘块的位置,这种存储方式的优点是可以利用碎片。缺点是,第一访问速度慢,尤其是随机访问,访问任何一个数据块均需要从头数据块开始一个指针一个指针查找;第二重构困难,如果一个指针损坏,则整个文件损坏;第三是增加存储开销,因为指针占用空间。

这里对占用空间仔细解释:计算机里面的尺寸都与2的指数次方有关系,因为计算机里面2的整数次方比较容易处理(便于读写)。那么一个磁盘块所含字节同样为2的n次方(默认4096,可修改)。如果使用磁盘里面的一部分空间用来存指针,那么一个数据块里面存放的数据就可能不是2的指数次方了,造成数据处理效率下降。

2.2.2、文件分配表
  针对链表管理离散空间存在的问题,文件系统的设计人员,巧妙的提出了文件分配表(File Allocation Table, FAT)的概念。
  设计思路把所有指针从单个数据块抽取出来,全部放在一起,形成一张表,如果想要知道一个数据块的位置,只要查找该表即可。并且该表可以存放在内存里面,解决了数据块里面数据不是2的指数次方的问题,又解决了随机访问速度很慢的问题。文件分配表的每个记录为物理磁盘块编号,每个记录存放的是下一个数据块所存放的物理磁盘块编号。如下图所示:

这里写图片描述
图5、文件分配表

在上图中,文件A的第一个数据块存放在物理磁盘块3上面,那么FAT里面索引为3的记录里面存放的就是A的第2个数据块存放的物理磁盘块,即A的第2个数据块存放在物理磁盘块10里面.FAT索引为10的记录的内容是18,说明A的第三个数据块存放在物理磁盘块18里面;依次类推,至FAT索引为15里面记录为-1,说明该文件没有下一个数据块,即文件已经结束,依据FAT表,得出文件A所占物理磁盘块顺序为:3 -> 10-> 18 -> 13 -> 6 -> 5.

1)优点,随机访问效率提高: FAT环境下要时间随机读写,仍然需要从第一个数据块地址开始,在FAT里面顺着指针找到特定数据块所存放的物理磁盘块后才能读取该数据。但这里的跟踪在内存发生,因此效率大大提高,另外读写任何一个磁盘块均只需要一次磁盘访问。
2)、缺点,可能占用大量内存空间:使用FAT机制的文件系统成为FAT文件系统,其有FAT12、FAT16、FAT32这三种,3种的区别在于用来表示磁盘地址的内存字位数,如果用12位来表示磁盘地址,即为FAT12,但是FAT32较为特殊,其用28位来表示。FAT的记录项与磁盘块数量一样,磁盘越大,磁盘数据块越小,FAT越大。其访问效率越低。故采用索引文件系统改进。

2.2.3、索引管理
  FAT系统问题就是文件太大,分析可得,FAT虽然很大,但是里面存放有用信息的记录不一定很多。如果系统里面文件数量较少,或者个体文件的尺寸很小,那么FAT里面的很多记录都是空的,这样将整个FAT存放在内存就显得有点没必要了(FAT记录项 = 磁盘大小 / 单个磁盘块)。
  索引管理设计思路:将每个文件所有数据块的磁盘地址收集起来,集中存放在一个索引数据块里,而在文件打开时将该数据块加载到内存,以后访问任何一个数据块都可以从该索引数据块里面获得 物理磁盘地址。这样,内存里面存放的只是我们需要使用的文件的数据块的所有地址,这种索引数据块称为I-NODE。我们在linux下可以查看I-NODE信息详解

这里写图片描述
图6、I-NODE举例

  使用索引组织方式时,用户先宣称文件大概有多大,文件系统按照用户的声明分配一个含有相应数量指针空间的I-NODE,但是不先分配真正的存储空间。在真正需要分配数据磁盘空间时,每次分配一个磁盘数据块,更新I-NODE里面的相应指针。如果要访问文件,则首先将对应的I-NODE打开,根据里面的内容,查找任何要访问的数据块。

  以图6为例,若要访问第3个数据块,则从I-NODE里面找到第3个数据块对应的物理磁盘编号679,再发出读679磁盘块的命令即可。I-NODE非常类似于内存管理的页表,页表存放的是虚拟地址至物理地址的映射,而I-NODE存放的是逻辑数据块到物理数据块的映射。

优点:
1)、属于非连续组织方式,继承了链表和FAT方式优点。
2)、I-NODE按照个体文件加载、打开、关闭,避免将所有文件地址同时加载,造成内存紧张。
3)、随机访问方便,只要从I-NODE获得所需数据块的物理磁盘地址,只需一次磁盘访问。
4)、增长灵活:只要文件的尺寸不超过索引里面预留指针数 * 磁盘数据块大小,文件可以自由增长,在磁盘上新分配给文件自由空间后,更新I-NODE反应这个新映射即可。

缺点:
1)、因为每个数据块都需要选点,相当于一系列随机访问,顺序访问效率低。(离散存储引起,不断的物理寻道)
2)、增长存在预期:如果文件需要的数据块数,超过索引头预留的指针,则无法增长。
改进:采用多级索引

2.2.4、多级索引
  针对文件增长需要更多数据块的问题,采用多级索引的组织方式。其设计思路,与分页系统中,多级页表类似。即在文件太大时,采用多级索引头,即使用间接I-NODE。在这种模式下,一个文件的I-NODE数不止一个,而是多个。这多个又被分成多级:顶级I-NODE、 次级I - NODE等。其中顶级I - NODE存放的不是数据块对应的磁盘块地址,而是次级I-NODE的磁盘地址,次级I-NODE里面存放的才是数据块对应的物理磁盘地址。

这里写图片描述
图7、多级索引组织

  多级索引组织结构的优缺点及改进:多级索引组织结构,其优点是增加了文件可以使用的数据块数量,缺点是访问磁盘次数增多了,因为访问次级I-NODE需要一次磁盘访问,另外对于小文件来说,可能使用的磁盘数据块不会超过一个I-NODE里面的指针数,浪费了I-NODE空间。其改进思路是非对称多级索引

2.2.5、非对称多级索引
  单级索引不适用于大文件,而多级索引又不适用于小文件,那么能想到的办法自然是多级和单机的有机组合:非对称多级索引其设计思路是,索引既可以是单级,也可以是多级。到底是单级还是多级取决于文件的大小。所有的文件都有一个顶级索引节点I-NODE,不过这里该NODE被分成两个部分:一部分被用来存放所在的磁盘地址;另外一部分用来存放I-NODE的地址。

这里写图片描述
图8、非对称多级索引

  如果文件尺寸较小,其所占的数据块没有超过I-NODE里面分配的数据块指针数,则其数据块磁盘地址全部存放在顶级I-NODE里面。这样的文件没有次级索引,如果文件较大,则除了顶级数据块磁盘地址外,还将有次级I-NODE。

我们先读出前面数据块呈现给用户,再将后面的数据块读入缓存,可以提高访问效率,提升用户体验。

  如果一级间接不能容纳系统里面的大文件,那么可以使用二级间接、三级间接…,当然随着层数的增加,文件访问速度将随之下降。一旦间接层数设定,一个文件里面最大尺寸也就限定了。


小结:本文介绍了文件系统的作用、布局、及数据存储方式演进过程。

参考资料:
1、《操作系统的哲学》 邹恒明 著
2、 我所认识的EXT2
3、计算机是如何启动的
4、【Linux】inode信息详解

纠错与建议
邮箱:[email protected]


猜你喜欢

转载自blog.csdn.net/xd_hebuters/article/details/79538641