“文件系统日志把一次关联的块与分配元数据更新放进恢复域。本文构造OS 16的单事务重做日志:事务修改至多4个不同home块,记录每块完整after image及目标块号;一次只有一个事务,日志…”
形式陈述
文件把连续字节偏移映到设备块。inode理路文件对象、目录与路径名Inode directory and pathname · Hard link and symbolic link · 硬链接与符号链接把名称到文件对象的映射与对象本身分开,执行逐分量路径解析、硬链接计数、符号链接与删除后的存活。保存映射入口,空闲空间记录描述哪些块可分配。OS-16设备块大小B=256B,与内存页同大只是本模型选择;现实中两者并不必须相等。
OS-16每个普通文件inode有两个直接块指针d[0],d[1]和一个单级间接块指针ind。设备块号为16位,0保留为“未分配”哨兵;一间接块可保存256/2=128个块号。inode的文件长度限制哪些字节存在,指针为0的范围在本模型中是洞,读取返回零。
读取先检查0≤q<size;在文件末尾不再寻找数据块。对有效文件偏移q,算j=floor(q/256)与o=q mod 256。若j<2,读d[j];若2≤j<130且ind=0,该整个间接范围都是洞,直接返回零而不读块0;ind非零时才读其第j−2项。无论直接还是间接所得块号为0,都返回洞的零字节;取得非零数据块号b后才访问该块内o。j≥130超出本模型能力。最大可表示文件长度为130×256=33280B,不含inode与间接块自身占用。
空闲位图A[b]=0表示可分配,A[b]=1表示保留或已分配。分配在内核保护下选择一个0、改为1、初始化内容并安装文件指针;释放则撤销所有文件引用并安全改回0。崩溃模型下这些内存步骤还要组成可恢复的稳定更新。
直觉
文件offset不是物理块地址。应用看到一个连续文件,数据可以散在设备不同位置;inode指针把这种布局隐藏起来。小文件只用直接指针,大文件才支付间接块的读取和空间成本。
位图与文件指针是同一个事实的两种视角:一边说“这块不能再分给别人”,另一边说“这个文件使用它”。若只保存其中一边,轻则漏掉空间,重则把同一块分给两个文件。
例子与边界
算到间接指针的字节位置
inode42大小为800B,d=[20,21],ind=22,间接块22的前两项为[30,31]。读q=600,得j=2、o=88;应读间接块22的第0项,取得数据块30,再取块内88。若设备块区按字节连续编号,则该字节设备偏移为30×256+88=7768,不是22×256+88。
读q=799时j=3、o=31,取间接项1,即间接块内字节偏移2处的16位块号31,再取数据块31内31。读q=800已到文件长度边界,即使块31还剩224B也不属于此文件的当前字节流。
本文件占4个数据块加1个间接块,共1280B,另计inode所在元数据块。最后一个数据块只用32B,有224B尾部空间;不能把文件逻辑800B当成全部设备成本。没有缓存时一次间接块数据读取至少涉及映射块和数据块两个块访问,inode读取若尚未缓存还要另算。
从两块长到第三块
原文件长度512B、直接块20和21、ind=0。向q=512写一个字节,需要分配间接块22与数据块30,令位图两位为1,在22的第0项写30,inode.ind写22并把size改513,最后有正确的数据块30内容。这不是只改“文件末尾”一个位置。
若指针和size先稳定而位图仍为0,重启后的分配器可把块30交给另一文件,产生双重占用。若位图先稳定而指针丢失,则块30泄漏。若新块未初始化就经指针发布,还可能泄漏旧文件残留。文件系统日志理路文件系统重做日志与提交边界Filesystem redo journal · Journaling filesystem commit把文件数据、位图、inode和目录组成有界块事务,证明payload、commit、home和清日志的稳定顺序及再次崩溃恢复。要保护的是这组关联对象,而不只是一段应用数据。
推论与应用
在OS-16不支持跨文件共享数据块的条件下,不变量为:每个已引用数据/间接块的位图为1,两个普通文件不引用同一可变块,洞指针不引用任何块,文件大小不超过映射能力。文件系统若支持reflink或去重共享,则需要额外引用计数与COW,不能继续套用“不共享”的第二条。
线性扫描N位的位图最坏为O(N),查找到候选后改位为O(1);可以记录搜索位置或增加层级摘要改善搜索,具体成本另证。块映射的常数层数不意味着分配永远常数时间,也不包含等待设备的时间。
extent以连续区间压缩映射,树状索引能支持更大文件;这些是结构替代,仍要回答“给定offset找到哪块”和“分配元数据如何崩溃恢复”。本页选择直接/单间接指针,是为了让整条算路与首次越过直接区的新增义务可见。
参考资料
- Remzi与Andrea Arpaci-Dusseau,OSTEP: File System Implementation,第40章,inode、块指针、位图与访问成本。
- Cox、Kaashoek、Morris,xv6教材 rev5,§10.7–10.10。OS-16的两个直接指针、16位块号及256B块为本文选择,不是xv6磁盘格式。