了解影子分页及其与日志文件系统的区别

Understanding shadow paging and how it differs from journaling file systems

我正在尝试很好地掌握类 unix 文件系统中的影子分页;您可能会在 ZFS or WAFL 中看到的内容。似乎在影子分页中,当一个人想要对页面进行更改时,将写入另一个页面或 "shadow page" 。在操作完成后,即当所有内容都已提交时,影子页面被写出,替换旧页面。这是对影子分页的正确(尽管是高层次的)理解吗?

影子分页与日志文件系统有何不同?他们看起来很相似。

感谢您的宝贵时间!

这两个系统都允许您通过不同的机制提供原子性/一致性:

  • 影子分页总是在您修改某些内容时分配一个新块,并且当一个块被覆盖时,它的旧副本将变为空闲,因为不会有任何其他活动文件系统块对它的引用。崩溃一致性来自树上的递归元数据更新——您更新叶块所在的位置(在修改期间复制到其他地方),并且必须更新其父块(在修改期间复制到其他地方),等等。文件系统的新版本当直到树的根的整个链被更新时,所有修改都变得可见。

  • 日志允许您就地修改块,但您仍然必须将它们写入两次:一次写入标记您的意图的日志(并在需要时提供多次更新原子性,例如用于实现移动文件从一个目录到另一个目录),然后在日志本身中一次。由于您是就地修改,对于同一块的覆盖,除了您覆盖的特定块之外,您通常不需要更新许多其他文件系统树块,因为当您编写新版本时,这些块没有改变位置。

最大的区别是影子分页/写时复制使得在文件系统中实现快照变得非常容易——您需要做的就是跟踪文件系统树根的旧版本,以及任何东西当时引用了。在日志中,这要困难得多,因为任何块都可以随时被覆盖,而且日志不是无限的——通常它会很快被覆盖,否则它会占用磁盘上的一堆 space。

写时复制的最大缺点可能是,尤其是对于旋转磁盘而言,它往往会使您的数据变得瑞士奶酪,导致数据变得非常碎片化,因此在大量顺序读取文件时需要更多的磁盘寻道经常更新。 ZFS 有这个问题,我认为一些后来的写时复制系统通过一些中间层将逻辑块地址映射到物理地址以允许对数据进行碎片整理来解决这个问题。