存储 频道

JFS布局:日志文件系统如何处理磁盘布局(9)

        1041377 字节的稀疏文件: 考虑经由以下 POSIX 风格的操作而创建的文件:


            fd = create ("newfile", blah blah blah);
            write (fd, "hi", 2);
            lseek (fd, 1041374, 0);
            write (fd, " bye" , 3);
            

        该文件有以逻辑字节偏移量 0 开始的两字节数据("hi"),还有以逻辑字节偏移量 1,041,374 开始的三字节数据 ("bye"),并且在这两者之间全为 0(稀疏的)。文件的长度为 1041377 字节。

        通常,JFS 不分配物理磁盘空间以保存从不写入文件的字节范围。因此,将占用两个 xad 结构来表示该文件:一个为包含 "hi" 数据的盘区,一个为包含 "bye" 数据的盘区:


            xad #0 :
            flag        这里不讨论
            offset      0                   /* the beginning of the file  */
            length      1                   /* 1 1KB aggregate blocks     */
            address     xxxxx               /* aggregate block #          */
            xad #1:
            flag        这里不讨论
            offset      1016                /* the beginning of the file  */
            length      1                   /* 1 1KB aggregate blocks     */
            address     yyyyy               /* aggregate block            */
            

        在该例中,第一个盘区(xad 0)包含字节 "hi",紧接着是 1022 字节 0。最后一个盘区(xad 1)包含 990 字节 0,紧接着是 3 字节 "bye"。1KB 盘区中剩余的 31 字节不是文件的组成部分。(它们与第一个例子中丢失成为内部存储碎片的 31 个字节相同)。

        请注意,该例中, xad_offset 字段是必需的;这是知道 xad 1 表示文件内在无法预料的逻辑偏移量字节序列的唯一方法(也即,xad 1 的偏移量不等于 xad 0 的偏移量加长度)。这是表示稀疏文件的方法。

        inode 的 di_size 字段包含写入的最后一个字节偏移值加 1。

        连续分配的 16GB 的文件: xad 结构中的长度字段仅有 24 位长:因此,它能包含的最大值是 2(24)-1。如果聚集块大小是 1KB(例如),那么一个 xad 能够表示的最大盘区是(2(24)-1)*2(10)=1KB,小于 16G。暗示这也是 xad 结构能够表示的最大盘区。因此,如果文件够大的话,就算它在磁盘上是相连的,也需要多个 xad 结构来表示它。本例中显示了这样一个连续分配的文件:一个 16G 文件,它从聚集块号 12345 开始连续分配,获取 16777216 个 1KB 的聚集块(16G)。


            xad #0 :
            flag        这里不讨论
            offset      0                   /* the beginning of the file  */
            length      16777215            /* 1 1KB aggregate blocks     */
            address     12345               /* aggregate block            */
            xad #1:
            flag        这里不讨论
            offset      16777215            /* the beginning of the file  */
            length      1                   /* 1 1KB aggregate blocks     */
            address     16789560            /* aggregate block #          */
            

        在该例中,不论文件在磁盘上是否相连,要表示它至少需要两个 xad 结构,这是由于单个盘区的长度限制。

0
相关文章