“分配连续物理区间的具体选择可见文件系统空闲区间管理。如果底层只能交付若干分散区间,文件仍可用多条extent表示;连续性关系到元数据数量和I/O形状,不是文件能否具有连续字节地址的前提。”
要给一个文件取得连续7块,知道“设备还剩14块”不够。块分配理路文件块映射与空间分配File block mapping · Direct and indirect blocks · 文件块位图分配由文件字节偏移经过inode直接和间接指针找到设备块,并把数据、大小、指针和空闲位图的共同恢复义务列全。必须找到真正可交付的地址;把连续空闲块合成区间,能直接回答哪里有一整段空间,也能解释为什么总量足够却分配失败。
形式陈述
两个索引看的是同一组空闲块
在块号0到31的教学池中,块0保留给元数据。空闲区间写作半开区间
每个非保留块恰属于空闲集合或某个已分配所有者,不能同时出现。本页先假设单线程串行操作、元数据有预留空间、没有快照共享;请求长度为任意正整数,无幂二取整。释放必须交回一个真实已分配且尚未释放的范围。
为同一个
两种选址合同
请求
若没有合格区间,返回失败,空闲索引与所有权记录完全不变。“先改了一半索引再报告失败”并不满足这个合同。它会让下一请求见到一个从未真实存在过的空闲状态。
直觉
分配找大小,释放找邻居
长度索引可直接寻找不小于
如果索引是普通平衡搜索树,最佳适配和更新可在
最佳适配希望少留下零头;首次适配希望尽早找到合格位置。每次局部选择都可能改变未来的大区间形状。以下两条不同的请求序列说明,两种政策都不能只靠名称获得总体优越性。
例子与边界
请求5、7:保住大段的一方成功
每个实验重新从
| 政策 | 分配5后 | 随后的7块请求 |
|---|---|---|
| 首次适配 | 交付 |
失败:没有7块连续区域 |
| 最佳适配 | 交付 |
从 |
首次适配第二步还有9块空闲,却分散在长度3和6的两段中。请求合同要一段连续7块,不接受把两段拼成逻辑列表。若上层允许多extent,它可以改发多个请求;那是换了请求合同,不是原来7块请求突然成功。
请求5、3、6:小零头也可能更有用
重置同样的初态,这次请求5、3、6。首次适配先用
最佳适配先用
释放中间块时,要同时看两边
另开一个释放实验:连续区间
再释放B。地址前驱在3结束,与B起点相等;地址后继从6开始,与B终点相等。应从两个索引中删除这两条邻居记录,再插入合并后的
在长度索引中,合并前的键是
元数据也需要空间和恢复规则
释放空间可能让索引增加新记录,树节点也可能需要分裂。因此“设备已经满了,但释放总会成功,因为释放不占空间”并不成立。实际系统会为元数据维护保留空间或专门的空闲列表;本页把预留元数据作为前提,避免递归地先分配空间才能记录一次释放。
本页原子操作指并发观察下不暴露半更新状态,不自动意味着掉电原子性。把双索引、所有权与文件映射持久地一起更新,可以复用文件系统重做日志理路文件系统重做日志与提交边界Filesystem redo journal · Journaling filesystem commit把文件数据、位图、inode和目录组成有界块事务,证明payload、commit、home和清日志的稳定顺序及再次崩溃恢复。;若只把其中一个索引刷盘,恢复后仍会出现两份互相矛盾的空间账。
推论与应用
三个数字给出不同信息
总空闲量
Extent映射理路Extent文件区间映射Extent mapping · 文件extent · 文件区段映射用逻辑起点、长度和物理起点描述文件中的连续区域,逐步计算字节寻址、孔洞、覆盖拆分与合并条件,区分表示更新与持久发布。能使用这里交付的区间,但映射连续性与空闲连续性是两个不同状态。文件删去中间一段后,物理空间是否能立即回收,还要检查快照、未完成I/O与恢复根是否仍引用它;本页只能合并已经真正交回的块。
复算终点除了写出分配地址,还应给出两套排序键、每个所有者的区间以及空闲总数。对任何失败或非法重复释放,逐项比较操作前后的状态应完全一致。这样可以区分“策略选择不理想”和“分配器把同一块给了两个人”这两种本质不同的问题。
参考资料
- XFS项目,《XFS Algorithms & Data Structures》,§13.2 “AG Free Space Management”,特别是§13.2.2记录与§13.2.3空闲列表:地址/长度双索引和元数据预留的实现背景。first fit、best fit的确定性规则与两组反例是本页自定,不声称复现XFS完整分配政策。