理解Inodes的概念

时间:2010-05-02 21:11:26

标签: unix filesystems inode

我指的是the link关于Inodes的概念

我对部分感到困惑:

  1. 12个直接块指针
  2. 1个单独的间接块指针
  3. 1个双重间接块指针
  4. 1个三重间接块指针
  5. 现在图表显示每个指针都是32/64位。

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

    该图表示,每个指针{4字节/ 8字节}

    的一个数据块{8 KB}
    • [查询]:这实际上是如何解决的?即8 * 1024字节/ 8字节= 1024字节?为8KB块提供8字节指针的逻辑是什么?

3 个答案:

答案 0 :(得分:12)

最大文件大小的样本计算

* 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 

答案 1 :(得分:10)

引用的指针是磁盘块地址 - 每个指针包含识别磁盘上块的必要信息。由于每个磁盘块至少有512个字节(有时是4096或8192个字节),因此使用32位地址时,磁盘最多可以寻址512 * 4 * 1024 3 = 2 TiB(Tebibytes - 更常见的称为太字节)假设1/2 KiB块;随着块大小的增加,相应地变大(因此,在8 KiB块大小时为32 TiB)。对于较大磁盘的寻址方案,您必须转移到更大的块大小或更大的磁盘地址 - 因此48位或64位地址可能是合理的。

因此,为了回答Q1,32位是很多东西的常见尺寸。通常,当32位不再足够大时,下一个合理的大小是64位。

回答Q2:

  • 对于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位地址到8 KiB块,因此最大值为32 TiB)。

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

我会把它作为练习让读者看看64位磁盘地址的变化情况。

答案 2 :(得分:3)

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

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

第一个问题的答案是位空间覆盖了总共32位或64位。它只需要2 ^ 32,并且它足够大,可以定义所有这些变量。另外,为了进一步使用,它必须知道操作的位大小。在你的例子中,它们只是以这种方式定义。

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

我建议您阅读本书,了解Unix file system非常有用。

alt text http://ecx.images-amazon.com/images/I/511L2NK6ZNL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg