9.1  基本概念

在上一章中,我们把Ext2MinixExt等实际可使用的文件系统称为具体文件系统。具体文件系统管理的是一个逻辑空间,这个逻辑空间就一个大的数组,数组的每个元素就是文件系统操作的基本单位——逻辑块,逻辑块是从0开始编号的,而且,逻辑块是连续的。与逻辑块相对的是物理块,物理块是数据在磁盘上的存取单位,也就是每进行一次I/O操作,最小传输的数据大小。我们知道数据是存储在磁盘的扇区中的,那么扇区是不是物理块呢?或者物理块是多大呢?这涉及到文件系统效率的问题。

如果物理块定的比较大,比如一个柱面大小,这时,即使是1个字节的文件都要占用整个一个柱面,假设Linux环境下文件的平均大小为1K,那么分配32K的柱面将浪费97%的磁盘空间,也就是说,大的存取单位将带来严重的磁盘空间浪费。另一方面,如果物理块过小,则意味着对一个文件的操作将进行更多次的寻道延迟和旋转延迟,因而读取由小的物理块组成的文件将非常缓慢!可见,时间效率和空间效率在本质上是相互冲突的。

因此,最优的方法是计算出Linux环境下文件的平均大小,然后将物理块大小定为最接近扇区的整数大小。在Ext2中,物理块的大小是可变化的,这取决于你在创建文件系统时的选择,之所以不限制大小,也正体现了Ext2的灵活性和可扩充性,一是因为要适应近年来文件的平均长度缓慢增长的趋势,二是为了适应不同的需要。比如,如果一个文件系统主要用于BBS服务,考虑到BBS上的文章通常短小,所以,物理块选的小一点是恰当的。通常,Ext2物理块占一个或几个连续的扇区,显然,物理块的数目是由磁盘容量等硬件因素决定的。逻辑块与物理块的关系类似于虚拟内存中的页与物理内存中的页面的关系。

具体文件系统所操作的基本单位是逻辑块,只在需要进行I/O操作时才进行逻辑块到物理块的映射,这显然避免了大量的I/O操作,因而文件系统能够变得高效。逻辑块作为一个抽象的概念,它必然要映射到具体的物理块上去,因此,逻辑块的大小必须是物理块大小的整数,一般说来,两者是一样大的。

通常,一个文件占用的多个物理块在磁盘上是不连续存储的,因为如果连续存储,则经过频繁的删除、建立、移动文件等操作,最后磁盘上将形成大量的空洞,很快磁盘上将无空间可供使用。因此,必须提供一种方法将一个文件占用的多个逻辑块映射到对应的非连续存储的物理块上去,Ext2等类文件系统是用索引节点解决这个问题的,具体实现方法后面再予以介绍。

为了更好的说明逻辑块和物理块的关系,我们来看一个例子。

假设用户要对一个已有文件进行写操作,用户进程必须先打开这个文件,file结构记录了该文件的当前位置。然后用户把一个指向用户内存区的指针和请求写的字节数传送给系统,请求写操作,这时系统要进行两次映射。

1)一组字节到逻辑块的映射。

这个映射过程就是找到起始字节到结束字节所占用的所有逻辑块号。这是因为在逻辑空间,文件传输的基本单位是逻辑块而不是字节。

2)逻辑块到物理块的映射。

这个过程必须要用到索引节点结构,该结构中有一个物理块指针数组,以逻辑块号为索引,通过这些指针找到磁盘上的物理块,具体实现将在介绍Ext2索引节点时再进行介绍。

9.1是由一组请求的字节到物理块的映射过程示意图。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

      9.1 一组字节映射到物理块的示意图


 有了逻辑块和物理块的概念,我们也就知道通常所说的数据块是指逻辑块,以下没有特别说明,块或数据块指的是逻辑块。

Ext2中,还有一个重要的概念:片(fragment,它的作用是什么?

每个文件必然占用整数逻辑块,除非每个文件大小都恰好是逻辑块的整数,否则最后一个逻辑块必然有空间未被使用,实际上,每个文件的最后一个逻辑块平均要浪费一半的空间,显然最终浪费的还是物理块。在一个有很多文件的系统中,这种浪费是很大的。Ext2使用片来解决这个问题。

片也是一个逻辑空间中的概念,其大小在1K4K之间,但片的大小总是不大于逻辑块。假设逻辑块大小为4K,片大小为1K,物理块大小也是1K,当你要创建一个3K大小的文件时,实际上分配给你了3个片,而不会给你一个逻辑块,当文件大小增加到4K时,文件系统则分配一个逻辑块给你,而原来的四个片被清空。如果文件又增加到5K时,则占用1个逻辑块和1个片。上述三种情况下,所占用的物理块分别3个、4个、5个,如果不采用片,则要用到4个、4个、8个物理块,可见,使用片,减少了磁盘空间的浪费。当然,在物理块和逻辑块大小一样时,片就没有意义了。

由上面分析也可看出:

物理块大小<=片大小<=逻辑块大小