我们已经看到OS在分叉过程时会执行写时复制优化。原因是大多数时候fork是由exec处理的,因此我们不想承担页面分配和不必要地从调用者地址空间复制数据的开销。
在具有ext4或xfs(日记)文件系统的linux上执行CP时,也会发生这种情况。如果没有发生,那为什么不呢?
我们已经看到OS在分叉过程时会执行写时复制优化。原因是大多数时候fork是由exec处理的,因此我们不想承担页面分配和不必要地从调用者地址空间复制数据的开销。
在具有ext4或xfs(日记)文件系统的linux上执行CP时,也会发生这种情况。如果没有发生,那为什么不呢?
Answers:
要搜索的关键字是reflink
。它最近在XFS中实现。
编辑:XFS实现最初被标记为EXPERIMENTAL。在我写上面的:-)几个月后,该警告在内核版本4.16中被删除。
除非为您引入系统调用cp
(或至少要复制一个块),否则操作系统很难确定cp
程序要写入的数据与从另一个块读取的数据相同。最重要的是,您将需要额外的开销来管理“多个文件共享相同的块”方案。大型相似文件只有几个块之间的差异很少发生。因此,仅复制这些块,然后将此管理开销添加到所有文件中,总体上来说比较便宜。
现在,如果您通过在BTRFS中添加文件系统的另一个克隆/快照来“复制”文件(很多文件),情况将有所不同:现在,您已经“复制”了文件 了文件系统中的所有文件,并且对它们将是写时复制。它存在,但在ext4中不存在。
“日记”是一个完全独立的概念,重要的是文件的管理结构。