nam*_*ked 5 unix filesystems inode
我对部分感到困惑:
现在图表说每个指针都是32/64位.
该图表示,每个指针的一个数据块{8 KB} {4字节/ 8字节}
小智 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
Run Code Online (Sandbox Code Playgroud)
Jon*_*ler 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位磁盘地址的变化.