Replay-回放机制
系统重启时,第一个运行的用户进程之前,内核 (init.c → fsinit) 会调用 initlog()。
逻辑
- 读取 Log Header Block。
- 检查
n。 - 如果
n > 0: 说明上次系统在 Commit 之后、Clean 之前崩溃了。- 动作: 执行
install_trans()。把日志里的块重新写一遍到目标地址。 - 清理: 执行
write_head()清零n。
- 动作: 执行
- 如果
n == 0: 说明上次系统干净退出了,或者在 Commit 之前就挂了。啥也不用做。
幂等性 (Idempotence)
Replay 操作必须是幂等的。也就是:重做一次和重做十次,效果是一样的。
因此,无论我们在 Replay 的过程中崩溃多少次,只要最后一次 Replay 成功,文件系统就是一致的。