我想知道什么是copy-on-write是什么以及它用于什么?Sun JDK教程中多次提到术语"写时复制数组",但我不明白它的含义.
我打算写下我自己的解释,但这篇维基百科的文章几乎总结了一下.
这是基本概念:
写时复制(有时称为"COW")是计算机编程中使用的优化策略.基本思想是,如果多个呼叫者要求最初无法区分的资源,您可以给他们指向同一资源的指针.可以维持此功能,直到调用者尝试修改其资源的"副本",此时创建一个真正的私有副本以防止其他人看到更改.所有这些都对呼叫者透明地发生.主要优点是,如果调用者从不进行任何修改,则不需要创建私有副本.
这里还有一个COW常用的应用:
COW概念还用于维护数据库服务器(如Microsoft SQL Server 2005)上的即时快照.即时快照通过在更新底层数据时存储数据的预修改副本来保留数据库的静态视图.即时快照用于测试用途或与时间相关的报告,不应用于替换备份.
"写入时复制"或多或少意味着它的含义:每个人都有相同数据的单一共享副本,直到它被写入,然后复制.通常,copy-on-write用于解决并发类问题.例如,在ZFS中,磁盘上的数据块被分配为写时复制; 只要没有变化,你保留原始块; 更改仅更改了受影响的块.这意味着分配了最小数量的新块.
这些更改通常也实现为事务性的,即它们具有ACID属性.这消除了一些并发问题,因为这样可以保证所有更新都是原子的.
我不会在Copy-on-Write上重复相同的答案.我认为安德鲁的回答和查理的回答已经非常明确了.我将从OS世界给你一个例子,只是提到这个概念的使用范围有多广泛.
我们可以使用fork()
或vfork()
创建一个新流程.vfork遵循copy-on-write的概念.例如,vfork创建的子进程将与父进程共享数据和代码段.这加快了分叉时间.如果您正在执行exec,然后执行vfork,则应使用vfork.因此,vfork将创建子进程,该进程将与其父进程共享数据和代码段,但是当我们调用exec时,它将在子进程的地址空间中加载新可执行文件的映像.
仅举几个例子,Mercurial使用copy-on-write使克隆本地存储库成为一种非常"便宜"的操作.
原理与其他示例相同,只是您在谈论物理文件而不是内存中的对象.最初,克隆不是重复,而是与原始链接的硬链接.在更改克隆中的文件时,将写入副本以表示新版本.