Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 理解Inodes的概念_Unix_Filesystems_Inode - Fatal编程技术网

Unix 理解Inodes的概念

Unix 理解Inodes的概念,unix,filesystems,inode,Unix,Filesystems,Inode,我指的是关于inode的概念 我对以下部分感到困惑: 12个直接块指针 1个单间接块指针 1双间接块指针 1个三重间接块指针 现在图表显示每个指针是32/64位 [查询]:为什么以及如何推断这些值?我的意思是为什么只有32位或64位指针 图表显示,每个指针{4字节/8字节}有一个数据块{8 KB} [询问]:这到底是怎么回事?i、 e.8*1024字节/8字节=1024字节?为8KB块设置8字节指针背后的逻辑是什么 在给出答案之前,您应该了解文件系统的工作原理: 每当用户或程序按名称引用某

我指的是关于inode的概念

我对以下部分感到困惑:

  • 12个直接块指针
  • 1个单间接块指针
  • 1双间接块指针
  • 1个三重间接块指针
  • 现在图表显示每个指针是32/64位

    • [查询]:为什么以及如何推断这些值?我的意思是为什么只有32位或64位指针
    图表显示,每个指针{4字节/8字节}有一个数据块{8 KB}

    • [询问]:这到底是怎么回事?i、 e.8*1024字节/8字节=1024字节?为8KB块设置8字节指针背后的逻辑是什么

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

    每当用户或程序按名称引用某个文件时,操作系统都会使用该名称查找相应的inode,从而使系统能够获取有关该文件的信息,以执行进一步的操作。也就是说,类Unix操作系统中的文件名仅是具有索引节点编号的表中的一个条目,而不是与文件直接关联(与Microsoft Windows系统等其他操作系统不同)。inode编号及其对应的inode保存在inode表中,这些表存储在文件系统中的战略位置,包括在其开头附近

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

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

    我提议你翻阅这本书,对理解这本书非常有用


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

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

    回答问题2:

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

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

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

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

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

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


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

    最大文件大小的示例计算

    * 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 
    

    非常感谢您的详细回复。你能给我解释一下计算方法吗:32位地址磁盘最多可寻址512*4*10243=2个TiB以上完成???@darkie15:假设每个磁盘地址都是一个块号。使用32位数字,您可以处理大约40亿个不同的块;这些块中的每一块都是1/2kib,因此您可以寻址大约2万亿字节,也就是2tib。