通过讨论 inode 的设计,
理解 “ 数组 与 链表“ 在磁盘 “格式化文件系统技术“ 上的应用。
(记得看最后的总结)
【一句话概括】
ext4 与 ext3 相比最大的 进步 是:
提高了叶子节点的存储量,由 4K 升级到了 128MB.
(你可能会认为是 引入 ext4_extent_header, 但我觉得这不是本质提升)
虽然磁盘大多是 以物理块block 4KB 提供存储的,但是 文件系统格式化后是以 inode 的形式来表示数据存储单位的【文件】(而 不是 block)。
优势呢?
文件可以理解为是一个 “block链表”,他更适合经常“增删查改”的 家庭用户读写数据的习惯。
而磁盘提供的 block 则更像是一个连续的数组,对于 家庭用户来说,这显得很原始。
说一说 block,
对于 block 使用,我们需要找到空位的 block, 找空位的办法?
日常生活中就两个步骤,(稍微冷静就能想到):
1.找到所有已使用的block, 并做好标记到小本本上,
2.遍历所有block, 利用小本本检测遍历到的 block 是否被使用过,如果空闲,取而用之。
格式化后的文件系统也存在一个这样的小本本,叫 Block 位图。
但是,刚刚我们有讲过,格式化后的文件系统是以 inode 的形式给到用户读写,
那么自然而然,我们的小本本是 Inode 位图 (创建文件 的时候会用到)。
(当 "读写文件" 内容的数据时才会涉及 “block 位图” )
为什么磁盘要这样设计呢?
我个人理解是简化实现,磁盘本身就是一个大数组,而不是对象池,数组管理inode 对象,比采用链表实现的池来管理对象显然简单很多,
毕竟简单才是美。