面试题1
- 基础知识
系统中最小的单位是Bit(位元、位)
1 Byte(字节)= 8 Bits
1 Kilobyte(KB)= 1024 Bytes
Ext2中inode和block(实际记录文件内容的区域,1kb、2kb、4kb):inode大小是:128 Bytes,inode记录一个block需要花费4 Bytes。 为了记录更多的block,操作系统将inode记录block的区域划分为12个直接,1个间接,1个双间接,一个三间接记录区。(eg:将block设为 1kb,能容纳最大的文件是:12*1+256(1 Kb/4Bytes)*1+256*256*1+256*256*256*1(Kb)=16843020 Kb=16448 Mb=16 Gb)。
2. 问题
1.block大小为4 Kb的Ext3文件系统最大分区和最大文件分别是多少?
答:http://zhumeng8337797.blog.163.com/blog/static/100768914201112805015563/
其中point本来也是数据块,现在拿来做数据块的索引用,其中ext3的头文件定义为: __u32 i_block[EXT3_N_BLOCKS];/* Pointers to blocks */,所以可以计算ext3文件系统的极限: 最大分区: 因为定义的是无符号32位数,所以可能定位的block范围为2^32,也就是4G,如果一个block大小为4KB,所以为4G * 4KB = 16TB 最大文件: 前面直接指向12个数据块,一级间接块最大为block size / 4,block size就是数据块的大小,因为一个索引是4个字节,所以除以4,这样计算下来,最大的文件可以使用的总块数为:12 + (block size/4) + (block size/4)^2 + (block size/4)^3,如果block size大小为4K,则为(12 + 2^10 + 2^20 + 2^30) * 2^12 约等于4T。 为了突破ext3这个大小限制,ext4使用了48位的数据块索引空间,同时使用了如下结构代替inode索引的方式: struct ext3_extent { __u32 ee_block; /* first logical block extent covers */ __u16 ee_len; /* number of blocks covered by extent */ __u16 ee_start_hi; /* high 16 bits of physical block */ __u32 ee_start; /* low 32 bigs of physical block */ }; 这样查找数据块的时候就不是每个块建立一个索引,而且使用连续的数据块,也就是分别指示起始位置,以及连续的块数,这样在大文件的时候,磁盘io效率以及查找数据块效率上都有很大的提高,所以ext4的文件系统也比ext3出色。因为使用了48位的索引空间,所以在4KB块大小的情况下,文件系统的极限是2^48 * 4KB = 1EB,不过,目前由于工具的限制,只能使用16TB的分区。