如果inode只是单单的用数组建立和date block的映射关系。假设数组的大小是15,维护和data block的映射关系,每一块的大小就是4KB,意味着一个文件内容最多放入60KB,这个文件太小了,可事实上在linux上编一个程序,远远都超过了60KB,所以他的映射关系是怎么样的呢?
inode的是一个类,先在内存里构建这个类对应的对象,把属性一填,接下来把对象写到磁盘上就行了,inode属性包括inode编号、权限、拥有者,大小,还有data block数组,相当于我们拿到inode,就可以根据inode编号在inode Table找到inode,指令ll,只要找到inode就完了,但指令cat file.txt要读取文件内容,他还要找到inode里面的数据块。
在data blocks里面存在了大量data block,每一个都是4KB,每一个都有自己的编号,比如从1开始依次递增。在inode对象里的data block数组里面,假设没有映射关系填的是-1,有就填3,5,7,9,所以0下标的3就找data blocks里面的3,剩下的579依此类推,连续把3579把这几个块load到内存里。357肯定是被写满了,9虽然我们不知道有没有写满,但是inode属性里面的文件大小(size)决定了从开始位置到哪段范围是我的文件内容,所以文件就被读出来了。
现在的问题是只要是数组就有上限,一个数字是一个编号,即使你有150个,你也才有600 KB,可是一个文件大点甚至有几个G不够用怎么办?
所以linux早就考虑到这一点了,他规定比如前十个下标是直接索引,填的是数据内容,你建立些小文件时只使用前面若干个下标会更快。
再挑几个划分为二级索引,它的含义是所指向的数据块里面的内容不是直接的数据,而是其他数据块的编号,相当于在二级索引的范围里找到15,15里面并不匹配文件的原始内容,里面包含住17、19、31、36、77、99…是二级编号,就是通过二级索引的15找到的,把数据块全找齐了,这个文件才算找齐,相当于两层的多叉树,一个数据块是4KB,里面包含的二级编号假设用整数来表示是4字节,4KB ÷4byte=1000,所以用这里的一个数据块能找到1000个块,每个块的大小4KB,乘以1000块大小就是4MB,通过这种二级的方式就能找到第二梯队的大小文件。
再设置若干范围是三级索引,找到101里面并不填原始数据,而是指向其他数据块,里面可以放1000个,1000里面也不直接存数据而是继续存其他数据块,每1000个都有1000个就相当于一百万个,乘上4KB算出来是4GB,在Linux当中通过三级索引就可以找更大的文件了。
所以我们只要规定好数组的区间,不一定是直接索引,可以间接或者三级索引,根据数组下标哪些是直接访问,哪些是间接访问就可以构建出一个多叉树,比如一个文件大小才几KB,直接索引最快,比如你的文件四五十MB搞一个二级索引就行了,如果是GB再用三级,需要的话还可以再多设置几个三级索引,一个文件就变很大。