用户管理  |   用户注册                                                                                    首 页软件下载教程中心办公指南flash动画文档下载办公公文

www.4oa.com - 中科软件园

投递文章 用户管理 投稿指南 资讯通告 :
站内搜索: 您的位置中科软件园 > 教程中心 > 操作系统 > Linux > 系统管理 > 教程内容

JFS文件系统原理--JFS布局

2005-5-21 17:08:42  来源:本站整理  作者:不详 【 投递文章
内容提要:inode的一些信息。一旦盘区中的inode标记成在使用中,就必须初始化它的文件集号、inode号、inode戳以及inode分配组块地址。因此,链接字段就足以确定inode当前是否正在使用。注意,动...
inode 的一些信息。一旦盘区中的 inode 标记成在使用中,就必须初始化它的文件集号、inode 号、inode 戳以及 inode 分配组块地址。因此,链接字段就足以确定 inode 当前是否正在使用。

注意,动态 inode 分配意味着在 inode 号与 inode 的磁盘地址之间没有直接关系。因此,JFS 必须有查找磁盘上 inode 的方法。inode 分配映射表提供了这一功能。

inode 生成号只是每当重用 inode 时值就增加的计数器。

存储每个 inode 生成计数器这一静态 inode 分配常用方法在动态 inode 分配中不起作用,因为当 inode 空闲时,其磁盘空间可能确实由不是 inode 的数据所重用,(换句话说,空间可能被收回,以存储普通文件数据)。因此,在 JFS 中,只有一个 inode 生成计数器,它在每一个 inode 分配时增加其值,即在重用 inode 时,相应的计数器增加其值,而不是每个 inode 有一个计数器。

B+ 树
这一节描述文件布局使用的 B+ 树数据结构。选择 B+ 树是为了提高读写盘区的性能,这是 JFS 必须进行的最普通操作。B+ 树为读取文件的特定盘区提供快速搜索。它还提供有效方法将盘区添加或插入文件中。较为少见的情形是:当删除文件时,JFS 需要遍历整个 B+ 树。为了保证 JFS 会删除 B+ 树使用的块以及文件数据,对于遍历 B+ 树效率也很高。

盘区分配描述符(xad 结构)描述盘区并且又添加了表示文件所需的两个字段:描述盘区表示的逻辑字节地址的偏移量和标志字段。盘区分配描述符结构在 jfs_xtree.h, struct xad 中定义。

xad 结构为:

struct xad {
unsigned flag:8;
unsigned rsvrd:16;
unsigned off1:8;
uint32 off2;
unsigned len:24;
unsigned addr1:8;
uint32 addr2;
} xad_t;


其中:

flag 是包含各种标志的 8 位字段。这些标志能够表示写入时复制、是否分配了盘区但没有记录它、压缩信息等等。
rsvrd 是保留供将来使用的 16 位字段。它总为零。
off1,off2 是 40 位字段,包含盘区中第一个块的逻辑偏移量。逻辑偏移量是以聚集块尺寸为单位表示;也就是说,要取得一个字节,偏移量必须乘以聚集块尺寸。
len 是 24 位字段,包含盘区的长度。长度以聚集块尺寸为单位表示。
addr1,addr2 是 40 位字段,包含盘区的地址。地址以聚集块尺寸为单位表示。

xad 结构描述了两个抽象范围:

磁盘上磁盘块的物理范围。它以聚集块号 xad_address 开始,并且延伸为 xad_length 聚集块。
文件内字节的逻辑范围。它以字节号 xad_offset * AGBS(聚集块尺寸)开始,并且延伸为 xad_length*AGBS 字节。

当然,物理范围和逻辑范围有相同长度的字节。请注意,xad_offset 以聚集块尺寸为单位存储(例如,在 xad_offset 中值 "3" 意味着 3 个聚集块,而不是 3 个字节)。它遵循文件内盘区总是以聚集块尺寸为边界。

JFS 中的所有索引对象(除目录外),有一个类属 B+ 树索引结构。索引的数据将取决于对象。B+ 树以由树描述的数据的 xad 偏移量为键。项按 xad 结构的偏移量排序。xad 结构是 B+ 树节点中的项。

图 3 显示了一个 xad 结构以及它是如何描述文件内逻辑字节范围和磁盘上字节范围本身(也就是说,对于聚集)的物理位置。

磁盘 inode 第二扇区底部包含数据描述符,它描述在 inode 的后半部分内存储的内容。对于足够小的文件,后半部分可能包含内嵌数据。如果文件数据不适合 inode 的内嵌数据空间,它将包含在盘区中,inode 将包含 B+ 树的根节点。头部指出在使用的 xad 个数,可用的 xad 个数。通常,inode 将包含 8 个 xad 结构 B+ 树的根。如果文件有 8 个或更少盘区,那么这 8 个 xad 结构也是 B+ 树的叶节点。它们将描述盘区。(参见图 4,例 1。)否则,inode 中的 8 个 xad 结构将指向 B+ 树的叶节点或内部节点。

一旦 inode 中的 8 个 xad 结构均已填充,为了有更多的 xad 结构,就会尝试使用 inode 的最后四分之一。如果 INLINEEA 位在 inode 的 di_mode 字段中设置,那么 inode 的最后四分之一可用。

一旦 inode 中所有可用的 xad 结构都被使用,就必须拆分 B+ 树。JFS 将把 4K 的磁盘空间分配给 B+ 树的叶节点。叶节点逻辑上是带头的 xad 项的数组。头部指向节点中第一个空闲的 xad 项,没有分配紧跟其后的所有 xad 项。8 个 xad 项从 inode 复制到叶节点,初始化头部以指向第 9 个项作为第一个空闲项。然后 JFS 将把 B+ 树的根更新为 inode 的第一个 xad 结构;该 xad 结构将指向最新分配的叶节点。这个新的 xad 结构的偏移量是叶节点中第一个项的偏移量。将更新 inode 中的头部以表示当前 B+ 树只使用 1 个 xad。还需要更新 inode 头部以表示当前 inode 包含 B+ 树的纯根。(参见图 4,例 2。)

当把新盘区添加到文件时,将以必需的次序,继续把它们添加到相同的叶节点。这将持续直到节点填满为止。一旦节点填满了,将为 B+ 树的另一个叶节点分配新的 4K 磁盘空间。将把该 inode 的第二个 xad 结构设置成指向新分配的节点。(参见 图 4,例 3。)

这将持续直到填满 inode 的所有 8 个 xad 结构为止,这时,将再次拆分 B+ 树。这种拆分将创建 B+ 树的内部 inode ,它们是纯粹用来记录树的搜索路径。JFS 将为 B+ 树的内部 inode 分配 4K 磁盘空间。内部节点看起来如同叶节点。从 inode 复制 8 个 xad 项到内部节点,初始化头部以指向第 9 个项作为第一个空闲项。然后,通过使 inode 的第一个 xad 结构指向新分配的内部节点,JFS 更新 B+ 树的根。将更新 inode 中的头部以表示当前 B+ 树只使用 1 个 xad。(参见图 4,例 4。)

文件 jfs_xtree.h 在 struct xtpage_t 中描述 B+ 树根的头部。文件 jfs_btree.h 是在 struct btpage_t 中的内部节点或叶节点的头部。

例子
下列例子进一步分析了盘区描述符和 xad 结构的用法:

连续分配的 1041377 字节文件。
相同的 1041377 字节文件,但在磁盘上拆分成三段。
1041377 字节的文件,但里面有一个"洞"(稀疏文件)。
连续分配的 16GB 文件。

在所有这些例子中,聚集块尺寸都是 1KB。

连续分配的 1041377 字节尺寸文件: 该文件需要 1017 个 1KB 聚集块,(在最后一个聚集块中,有 31 个字节丢失成为内部

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9]  下一页

(评论内容只代表网友观点,与本站立场无关!)[ 全部评论 ]

网友评论:

    用户名:

    评   分:100分 85分 70分 55分 40分 25分 10分 0分

    内 容:

                 (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码

关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 -有事点这里