10-数据块寻址

1. 数据块寻址

  如果一个文件有多个数据块,这些数据块很可能不是连续存放的。这些数据块通过inode中的索引项(Block)来找到。

这里写图片描述
图1-数据块寻址

  在inode中这样的索引项一共有15个,即Block[0]–Block[14],每个索引项(Block)占4字节,inode每记录一个Block索引项需要用掉4字节,而一个inode大小为128字节。前12个索引项都表示块的编号,如Block[0]保存27,表示第27个块是该文件的数据块。

  如果块(Block)的大小是1KB(1024字节),这种方法可以表示最大存0-12KB的文件。如果剩下的三个索引项也这么用,那就只能表示最大存15KB的文件了。这是远远不够的。

  剩下的3个索引项Block[12]、Block[13]、Block[14]都是间接索引。间接寻址就是通过一个索引块找到一个新的索引块。

2. 一级间接寻址

  比如Block[12]是一级间接寻址,那么Block[12]可以存放b/4个索引项,这样来算的话,每个索引项当做一个指向一个数据块的数据块指针(block_point)总共指向b/4个Block[12]数据块。

这里写图片描述
图2-一级间接寻址

  也就是说如果b = 1k的话,那么block[12]就可以存放1024/4个数据块指针,每个数据块指针指向一个block块,那么总共指向1024/4个数据块,由此block[12]最大可以表示256k的数据了,这样的话block[0]到block[12],最大能表示256 + 12 = 268大小的文件,但是这样还是不够用的,于是有了二级间接寻址。

3. 二级间接寻址

  以此类推,block[13]是二级间接寻址的话,那么block[13]总共有b/4个一级索引项(block_points_1),一个一级索引项指向一个地址,占用了4字节,这个地址又指向了1KB大小的空间,这个空间又能存放b / 4 个索引项了,这样一来,block[13]的每一个一级索引项又可以指向b/4个二级索引项(block_points_2),这样下来block[13]总共就有(b/4) * (b/4)个索引项了。

这里写图片描述
图3-二级间接寻址

   那么block[13]最大能表示的数据是( b / 4) * ( b / 4) = 65536k大小的文件了,也就是64MB,感觉还是不够用。

  举个生活中的栗子,相信大家都用电脑下过电影,游戏什么的吧,平时我们下载的一个超清电影文件,大型单机游戏文件动不动就十几个G,几十个G,那么二级间接寻址还是不够用啊,把block[0]到block[13]全部加起来,撑死最大也就能表示65536 + 256 + 12 = 65804k(额,好像还是64MB)的文件,于是就有了三级间接寻址。

4. 三级间接寻址

  还是按照二级间接寻址的方式类推:block[14]指向了b / 4 个 一级索引项,每个一级索引项指向了1KB的内存空间,这样每个一级索引项又能指向b / 4个二级索引项,同时每个二级索引项也只能了一个1KB的内存空间,二级索引项又能指向b / 4个三级索引项(block_points_3)。

这里写图片描述
图4-三级间接寻址

  三级寻址太麻烦,允许我偷个懒,只画了一部分,其他的可以照着推出来,到这里,大家赶紧掏出计算器来算一下…

  block[14]最大能表示的数据是: (b / 4) * (b / 4) * (b / 4) = 16777216k = 16GB

  把block[0]到block[14]全部加起来最大能表示: 16777216 k + 65536 k + 12 k = 16.06GB的文件。

  也就是说如果在格式化磁盘时指定block为1K大小的话,那么最大能表示16.06GB的文件,不能再超过了,相当于一个inode指向的一个文件最多就16.06GB了,再多就表示不了。

   但是我们在前面也说过格式化磁盘时是可以指定block的大小,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种,回到数据块(block)目录查看。

  可见,这种寻址方式对于访问不超过12个数据块的小文件是非常快的,访问文件中的任意数据只需要两次读盘操作,一次读inode(也就是读索引项)一次读数据块。而访问大文件中的数据则需要最多五次读盘操作:inode、一级间接寻址块、二级间接寻址块、三级间接寻址块、数据块。实际上,磁盘中的inode和数据块往往已经被内核缓存了,读大文件的效率也不会太低。

猜你喜欢

转载自blog.csdn.net/qq_35733751/article/details/80849242