文件系统内部结构(3)

当创建新文件时,最初所有10个条目都是空的。当向这些条目写某些内容并因此需要使用块时,如前所述,内核检查空闲的数据块链表,选择分配一个空闲数据块,并从空闲数据块列表中删除这个块的编号,在索引节点中插入这个块号。这个过程持续到文件中的前10个块分配完为止。分配块的时候,内核还要更新索引节点中的"文件大小"这个字段。通过执行一个简单的文件大小/块大小的算术操作,内核可以通过这个字段查找索引节点中的新条目,并在这个条目中插入新分配的块号。例如,如果文件大小是2048个字节,内核可以轻松地计算出,这也就是2048/1024=2个块,也就是10个块中只有两个块被填满。因此,下来就是第三个条目。

 
图13-18  针对文件的典型环境

如果文件大小超过10个块,会出现什么问题呢?如果发生这种情况,内核会从可用的空闲块中分配数据块,并将该块当作索引块。索引节点的第11个条目提供了该索引块的块号。如图13-17所示,索引块包含地址或者指针。这个索引块也有1024个字节,因此,它可以保存多于256个数据块号的256个条目(1024/4=256)。现在内核遍历空闲块链表,并将其中一个分配给该文件。现在内核将这个实际数据块的块号作为索引块中的第一个条目。随着文件的扩大,它重复这个获取新空闲数据块的过程,分配该数据块,并将该数据块的块号写到索引块中第2个条目,等等。内核通过前面介绍的使用文件大小的简单算术,计算出索引块中接下来要使用的条目。这个索引块被称作单级间接索引块。这是因为索引块直接指向数据块。如果已经分配10+256=266个块,也就是说,如果文件超过266×1024个字节,也就是266KB或0.266MB,那么内核就要使用双级间接索引块,如图13-17所示。

在两级索引中,索引节点中的第12个条目指向两个间接索引块。这个索引块也有256个条目,但不是直接指向256个数据块(像在单级间接索引中),而是指向间接寻址第二级的256个其他索引块。这里知道,每个索引块可以有256个块号。这就给UNIX提供了寻址10 + 256 + (256×256) = 65 802块或65.8 MB的能力。由此可以看到:内核可以通过三级间接地址,通过多极扩展可以寻址的全部块数是10 + 2561 + 2562 + 2563,这超过16GB的寻址空间。然而,如果索引节点中文件大小只有32位,那么由于这个原因,文件大小就局限在232 或4GB。

文件大小在地址转换中起着重要的作用。根据文件大小,内核知道是否要对索引节点自身中的块号(直接的)或是间接的特定级别的索引进行定位。

4. 地址转换

UNIX将文件当作字节流。假定应用程序提交一个写600字节新记录的系统调用。为了执行该系统调用,内核要经历以下步骤:

① 访问该文件的索引节点,并由文件大小确定内核要写入的逻辑字节数。假定提交写系统调用时,文件大小是20 001字节。因此,逻辑字节0到20000已经被写到这个文件。此时,内核确定要在逻辑字节20001到20600处写入600个字节。

② 通过块大小(本例中块大小是1024字节)的分割,将逻辑字节数转换成逻辑块号和偏移量。因此,可以确定逻辑字节20001在逻辑块19中的偏移量是545,而逻辑字节20600在逻辑块20中的偏移量是120。想象一下,文件按照一系列块逐个摆放,就像是从0开始连续分配。然后,文件大小除以块大小得到的商数就是逻辑块号(Logical Block Number,LBN),而余数就是LBN在该块中从字节0开始的偏移量。例如,相对字节数。(Relative Byte Number,RBN)0就说明是LBN等于0的第0个字节。类似地,RBN等于1024对应于LBN等于1的第0个字节。LBN等于0,就是占用RBN的0到1023,LBN等于1,就是占用RBN的1024到2047,等等。

③ 将逻辑块号转换成物理块号。例如,逻辑块号19会在单级间接索引中找到。逻辑块0到9就在索引节点自身。逻辑块10就是单级间接索引中的条目0。因此,逻辑块19就是单级间接级别索引中的条目9。同样的,逻辑块20就是同一个索引中的条目10。图13-19 图形化地给出了例子中的LBN。

④ 在计算之后,访问索引节点中单级间接条目,并通过跟踪该指针从单级间接级别访问索引块。

⑤ 访问该索引中条目编号9。它向内核提供磁盘上的物理块号。假定这个块号是501(这个块已经分配给该文件,因为由文件大小可知,已经写入字节0到544)。

⑥ 将物理块号501转换成物理地址:柱面、磁道和扇区。

⑦ 通过设备驱动程序将块从磁盘读入内存。可以知道字节号0~544构成有效数据,而字节545~1023(479个字节)在物理块501中是空的。因此,内核决定将600个字节长的记录中的前479个字节写到块的545~1023这479个字节中,并回写该块。

⑧ 现在,要将剩下的121个字节(600-479=121)写到编号为20 的逻辑块的0~120字节中。这里还没有将这个块号分配给该文件。现在内核检查空闲块链表,并为该文件分配空闲块。此时,更新单级间接级别索引中的条目编号10,指明这个新分配块的块号。假定该物理块号是701。

⑨ 内核再次查找新分配块的物理地址(柱面、磁道、扇区)。

⑩ 内核现在向设备驱动程序提交指令,从而从内存中得到记录剩下的121个字节(通过指明内存地址),并将它们写到磁盘由编号为701的物理块指定的位置。在该物理块中,还空闲903个字节(1024-121)可用于后面的写操作。

内核现在更新文件大小。

 
(点击查看大图)图13-19  地址转换中的逻辑块号(LBN)

如果文件大小超过65 802字节,内核就要通过双级间接索引块进行访问,但采用这种方式读取记录与单级索引索引的方式很相似。

posted @ 2012-03-17 22:43  CobbLiu  阅读(437)  评论(0编辑  收藏  举报