我指的是关于 Inodes 概念的链接
我对部分感到困惑:
- 12个直接块指针
- 1 个单间接块指针
- 1个双间接块指针
- 1个三重间接块指针
现在该图显示每个指针都是 32/64 位。
- [查询]:为什么以及如何推断这些值?我的意思是为什么专门只有 32 位或 64 位指针?
该图显示,每个指针 {4 bytes/8 bytes} 一个数据块 {8 KB}
- [查询]:这实际上是如何解决的?即 8*1024 字节 / 8 字节 = 1024 字节?8KB 块的 8 字节指针背后的逻辑是什么?
我指的是关于 Inodes 概念的链接
我对部分感到困惑:
现在该图显示每个指针都是 32/64 位。
该图显示,每个指针 {4 bytes/8 bytes} 一个数据块 {8 KB}
最大文件大小的示例计算
* 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
所指的指针是磁盘块地址——每个指针都包含识别磁盘上的块所需的信息。由于每个磁盘块至少为 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 位磁盘地址是如何变化的。
在给出答案之前,您应该了解文件系统的工作原理:
每当用户或程序通过名称引用文件时,操作系统都会使用该名称来查找相应的 inode,然后使系统能够获取有关文件所需的信息以执行进一步的操作。也就是说,在类 Unix 操作系统中的文件名只是具有 inode 编号的表中的条目,而不是直接与文件相关联(与其他操作系统如 Microsoft Windows 系统相反)。inode 编号及其对应的 inode 保存在 inode 表中,这些表存储在文件系统的战略位置,包括靠近其开头的位置。
第一个问题的答案是位空间涵盖了总共 32 位或 64 位。简单地说,它是 2^32,它足够大,可以定义所有这些变量。此外,为了进一步使用,它必须知道操作位的大小。在您的示例中,它们只是以这种方式定义的。
其次,每个指针(大小取决于您的磁盘容量)引用一个数据块(磁盘上 8KB,磁盘有块),但请记住,unix 文件系统具有分层结构。一个指向许多其他表的表,最后最后一个表指向数据块。
我建议您阅读这本书,这对了解Unix 文件系统非常有用。