什么是复制写入?

我想知道什么是copy-on-write和它用于什么? Sun JDK教程中多次提到“写入时复制数组”这个术语,但我不明白这是什么意思。

我打算写我自己的解释,但这个维基百科文章几乎总结了它。

这里是基本的概念:

写时复制(有时称为“COW”)是计算机编程中使用的优化策略。 其基本思想是,如果多个调用者请求最初难以区分的资源,则可以将它们指向相同的资源。 这个函数可以保持到调用者试图修改资源的“副本”为止,此时创build一​​个真正的私人副本,以防止其他人看到变化。 所有这些都对呼叫者来说是透明的。 主要优点是,如果调用者从不进行任何修改,则不需要创build私人副本。

这里也是COW的一个常见用途的应用:

COW概念还用于维护数据库服务器(如Microsoft SQL Server 2005)上的即时快照。即时快照通过在更新下层数据时存储数据的预修改副本来保留数据库的静态视图。 即时快照用于testing使用情况或与时间有关的报告,不应用于replace备份。

“写入时复制”意味着或多或less听起来像:每个人都有一个相同的数据共享副本, 直到写入 ,然后复制。 通常情况下,写入时复制用于解决并发类问题。 例如,在ZFS中,磁盘上的数据块被分配了写时拷贝(copy-on-write) 只要没有变化,你就保留原来的块; 一个改变只改变了受影响的块。 这意味着分配了最小数量的新块。

这些变化通常也是事务性的 ,即它们具有ACID属性。 这消除了一些并发问题,因为这样可以保证所有的更新都是primefaces的。

为了提供另一个例子, Mercurial使用copy-on-write来将本地存储库复制成一个非常“廉价”的操作。

原理与其他示例相同,除了您正在讨论的是物理文件而不是内存中的对象。 最初,克隆不是重复的,而是与原始的硬链接 。 在更改克隆中的文件时,会写入副本以表示新版本。

我不会在写入时重复相同的答案。 我认为安德鲁和查理已经说得很清楚了。 我会给你一个来自操作系统世界的例子,只是提到这个概念有多广泛的使用。

我们可以使用fork()来创build一个新的进程或者vfork()来创build一个新的进程。 vfork遵循复制写的概念。 例如,由vfork创build的subprocess将与父进程共享数据和代码段。 这加快了分叉时间。 如果您正在执行exec,然后执行vfork,则预计会使用vfork。 所以vfork会创build一个subprocess,它将与父进程共享数据和代码段,但是当我们调用exec时,它会在subprocess的地址空间中加载一个新的可执行文件的映像。

它也被用在Ruby的“企业版”中,作为一种节省内存的方式。

我在PHP中发现了关于zval的好文章,也提到了COW:

Copy On Write(简写为“COW”)是一种旨在节省内存的技巧。 它在软件工程中更普遍地使用。 这意味着当你写一个符号时,PHP会复制内存(或分配新的内存区域),如果这个符号已经指向了一个zval。

Interesting Posts