5

我指的是关于 Inodes 概念的链接

我对部分感到困惑:

  1. 12个直接块指针
  2. 1 个单间接块指针
  3. 1个双间接块指针
  4. 1个三重间接块指针

现在该图显示每个指针都是 32/64 位。

  • [查询]:为什么以及如何推断这些值?我的意思是为什么专门只有 32 位或 64 位指针?

该图显示,每个指针 {4 bytes/8 bytes} 一个数据块 {8 KB}

  • [查询]:这实际上是如何解决的?即 8*1024 字节 / 8 字节 = 1024 字节?8KB 块的 8 字节指针背后的逻辑是什么?
4

3 回答 3

14

最大文件大小的示例计算

* Assume that there are 10 direct pointers to data blocks, 1 indirect pointer, 1 double indirect pointer, and 1 triple indirect pointer
* Assume that the size of the data blocks is 1024 bytes = 1Kb, i.e., BlockSize = 1Kb
* Assume that the block numbers are represented as 4 byte unsigned integers, i.e., BlockNumberSize = 4b
* Some data blocks are used as index blocks. They store 1024 bytes / 4 bytes/entry = 256 entries
* Maximum number of bytes addressed by 10 direct pointers is

    = Number of direct pointers * Blocksize 
    = 10 * 1Kb
    = 10Kb


* Maximum number of bytes addressed by single indirect pointer is

    = NumberOfEntries * BlockSize
    = (Blocksize / BlockNumberSize) * BlockSize
    = (1Kb / 4b) * 1Kb
    = 256 * 1Kb
    = 256Kb


* Maximum number of bytes addressed by double indirect pointer is

    = NumberOfEntries^2 * BlockSize
    = (Blocksize / BlockNumberSize)^2 * BlockSize
    = (1Kb / 4b)^2 * 1Kb
    = (2^10 / 2^2)^2 * (2^10b)
    = (2^8)^2 * (2^10)b
    = (2^16) * (2^10)b
    = 2^6 * 2^20 b
    = 64 Mb


* Maximum number of bytes addressed by triple indirect pointer is

    = NumberOfEntries^3 * BlockSize
    = (Blocksize / BlockNumberSize)^3 * BlockSize
    = (1Kb / 4b)^3 * 1Kb
    = (2^10 / 2^2)^3 * (2^10b)
    = (2^8)^3 * (2^10)b
    = (2^24) * (2^10)b
    = 2^4 * 2^30 b
    = 16 Gb


* Maximum file size is 16Gb + 64Mb + 266Kb 
于 2012-01-21T13:31:52.170 回答
10

所指的指针是磁盘块地址——每个指针都包含识别磁盘上的块所需的信息。由于每个磁盘块至少为 512 字节(有时为 4096 或 8192 字节),因此使用 32 位地址,磁盘最多可以寻址 512 * 4 * 1024 3 = 2 TiB(Tebibytes - 更通常称为 Terabytes),假设为 1/2 KiB块;随着块大小的增长,相应的大小也会变大(因此 32 TiB,块大小为 8 KiB)。对于更大磁盘的寻址方案,您将不得不转向更大的块大小或更大的磁盘地址 - 因此 48 位或 64 位地址可能是合理的。

所以,回答 Q1,32 位是很多东西的常见大小。很多时候,当 32 位不再足够大时,下一个合理的大小是 64 位。

回答问题 2:

  • 对于 8 KiB 数据块,如果文件是 96 KiB 或更小,那么它在磁盘上使用 12 个或更少的块,并且所有这些块地址都直接存储在 inode 本身中。

  • 当文件变大时,磁盘驱动程序分配一个间接块,并将其记录在 inode 中。当驱动程序需要获取一个块时,它将间接块读入内存,然后从间接块中找到它需要的块的地址。因此,它需要(名义上)两次读取才能获取数据,尽管当然间接倾向于缓存在内存中。

  • 使用 8 KiB 块大小和 4 字节磁盘地址,您可以在单个间接块中容纳 2048 个磁盘地址。因此,对于从 96 KiB + 1 字节到 16 MiB 左右的文件,只有一个间接块。

  • 如果文件变得更大,则驱动程序分配一个双重间接块。双间接块中的每个指针都指向一个间接块。因此,您可以再拥有 2048 个间接块,每个块都可以有效地指向 16 MiB,从而可以存储高达 32 GiB(大约)的文件。

  • 如果文件变得更大,则驱动程序分配一个三重间接块。三重间接块中的 2048 个指针中的每一个都指向一个双块。因此,在具有 32 位地址的 32 位寻址方案下,最多可以寻址大约 64 TiB 的文件。除非您在此之前用完了磁盘地址(最大 32 TiB,因为 32 位地址对应 8 KiB 块)。

因此,inode 结构可以处理大于 32 位磁盘地址可以处理的文件。

我将把它作为练习留给读者,看看 64 位磁盘地址是如何变化的。

于 2010-05-02T22:08:49.317 回答
3

在给出答案之前,您应该了解文件系统的工作原理:

每当用户或程序通过名称引用文件时,操作系统都会使用该名称来查找相应的 inode,然后使系统能够获取有关文件所需的信息以执行进一步的操作。也就是说,在类 Unix 操作系统中的文件名只是具有 inode 编号的表中的条目,而不是直接与文件相关联(与其他操作系统如 Microsoft Windows 系统相反)。inode 编号及其对应的 inode 保存在 inode 表中,这些表存储在文件系统的战略位置,包括靠近其开头的位置。

第一个问题的答案是位空间涵盖了总共 32 位或 64 位。简单地说,它是 2^32,它足够大,可以定义所有这些变量。此外,为了进一步使用,它必须知道操作位的大小。在您的示例中,它们只是以这种方式定义的。

其次,每个指针(大小取决于您的磁盘容量)引用一个数据块(磁盘上 8KB,磁盘有块),但请记住,unix 文件系统具有分层结构。一个指向许多其他表的表,最后最后一个表指向数据块。

我建议您阅读这本书,这对了解Unix 文件系统非常有用。

替代文字

于 2010-05-02T22:08:32.043 回答