第7章学习笔记:文件系统:名字、块与崩溃一致性
课程笔记从路径名走到inode、缓存、分配和日志恢复。
关联:章节 第7章 文件系统:名字、块与崩溃一致性
第7章笔记:文件系统:名字、块与崩溃一致性
本章问题
从路径名走到inode、缓存、分配和日志恢复。 本章不是七个术语的并列清单,而是一条从可观察现象到内部状态、从内部状态到工程证据的因果链。学习时始终标出对象身份、队列或表项、触发事件、权限边界和不可破坏的不变量。
七节机制连接
- 文件抽象与打开文件表:文件描述符索引进程表项,系统打开文件项保存偏移与状态,并引用内存inode/vnode;实验入口为同一文件先open两次再dup一次,推演三描述符是否共享偏移和引用计数;反查边界是路径名不是打开后的唯一身份;unlink后已有打开引用仍可继续访问。
- 目录、路径解析与链接:路径逐分量查目录项到inode;硬链接共享inode,符号链接保存另一条路径;实验入口为创建a、a的硬链接b和符号链接c,执行rename与unlink后逐项判断可访问性;反查边界是硬链接计数不等于打开引用数;符号链接可跨文件系统也可能形成环。
- 文件分配与索引结构:连续、链式和索引分配在随机访问、扩展、碎片与元数据开销之间权衡;实验入口为用直接、一级间接和二级间接指针计算给定块大小下最大文件和访问次数;反查边界是索引块容量要扣除指针宽度与格式开销;稀疏文件的逻辑大小不等于占用块数。
- 空闲空间与块布局:位图适合批量找连续块,空闲链简单却不利于连续分配;局部性影响后续I/O;实验入口为对32块位图执行分配释放并输出最长连续空闲区,比较只看空闲总数的错误;反查边界是元数据本身也要持久化与校验;位图更新和数据写入顺序影响崩溃状态。
- 页缓存、写回与一致性:读写通常先命中页缓存,脏页异步写回;fsync只在具体对象和设备语义下提供持久化边界;实验入口为模拟写临时文件、fsync文件、rename、fsync目录的原子替换序列,逐崩溃点判断可能结果;反查边界是write成功通常只表示数据进入内核缓存,不等于已经稳定落盘。
- 实验:inode索引容量:按块大小、指针宽度和直接/间接层数计算可寻址数据块与最大文件字节数;实验入口为输入块大小、指针字节、直接指针数和间接级数,输出最大数据块数;反查边界是每级间接是扇出乘法,索引块自身不计入文件数据块但占存储空间。
- 实验:崩溃写序列判定:用有限状态机枚举数据块、inode、目录项和日志提交的持久化顺序;实验入口为输入若干写入事件与崩溃位置,输出文件OLD、NEW、MISSING或INCONSISTENT;反查边界是模型必须声明缓存与写屏障假设;真实设备可能重排,不能靠源码顺序推断落盘顺序。
请给七节画依赖箭头:前一节留下的状态或接口怎样成为下一节输入?每条箭头补单位、事件或保护条件。若任何一节可以随意搬走且不影响上下文,说明你还没有建立章内联系。
章内实验
选择本章至少一个代码实验,从空环境运行全部内联测试,再新增一个资源耗尽、非法迁移、同刻事件或崩溃输入。保存输入、输出、参考模型、首个偏差和修复后的回归证据。不可复现的睡眠竞态或人工截图不算实验结果。
错题闭环
把错误编码为对象混淆、状态跳步、单位错误、队列顺序、竞态遗漏、权限越界或恢复假设。不要只写粗心。一周后更换数字和事件顺序重做阶段卷;能在新输入下重建机制而非记住答案,才算迁移成功。