理解影子分页和它与日志文件系统的区别

3
我正在努力掌握类Unix文件系统中的影子分页技术,这是你可能在ZFSWAFL中看到的。似乎在影子分页中,当一个页面需要做出更改时,会写入不同的页面或“影子页面”。在完成操作(即提交所有更改)后,影子页面被写出,替换旧页面。这是对影子分页的正确理解吗?
那么,影子分页与日志文件系统有什么不同呢?它们看起来非常相似。
感谢您的时间!
1个回答

3
两个系统都可以通过不同的机制提供原子性/一致性:
1. 影子分页总是在修改时分配新块,并且当块被覆盖时,由于没有来自任何其他活动文件系统块的引用,其旧副本变为自由。崩溃一致性通过向上递归地更新元数据来实现——您更新叶块所在的位置(在修改期间复制到其他位置),必须更新其父项(在修改期间复制到其他位置),等等。当整个链路到树的根已更新时,具有所有修改的文件系统的新版本变得可见。
2. 日志记录允许您就地修改块,但您仍然必须将它们写两次:一次写入日志标记您的意图(如果需要提供多次更新原子性,例如用于实现从一个目录移到另一个目录),然后再次写入日志本身。由于正在就地修改,对于相同块的覆盖,通常除了您覆盖的特定块之外,您不必更新许多其他文件系统树块,因为这些块在写入它们的新版本时未更改位置。
最大的区别在于影子分页/写时复制使得在文件系统中实现快照变得非常容易——您只需要跟踪文件系统树根的旧版本以及它在那个时候引用的任何内容。在日志记录中,这要困难得多,因为任何块都可以随时被覆盖,并且日志不是无限的——通常很快就会被覆盖,否则它会占用磁盘上的一堆空间。
也许写时复制的最大缺点,特别是对于旋转磁盘来说,是它倾向于使您的数据成为瑞士奶酪,导致它变得相当分散,因此需要更多的磁盘寻道,尤其是在经常更新的文件的大顺序读取期间。 ZFS有这个问题,我认为一些后来的写时复制系统通过具有一些中间层将逻辑块地址映射到物理地址来解决这个问题,从而允许数据被碎片整理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接