当前位置:  开发笔记 > 数据库 > 正文

什么是写时复制?

如何解决《什么是写时复制?》经验,为你挑选了4个好方法。

我想知道什么是copy-on-write是什么以及它用于什么?Sun JDK教程中多次提到术语"写时复制数组",但我不明白它的含义.



1> Andrew Hare..:

我打算写下我自己的解释,但这篇维基百科的文章几乎总结了一下.

这是基本概念:

写时复制(有时称为"COW")是计算机编程中使用的优化策略.基本思想是,如果多个呼叫者要求最初无法区分的资源,您可以给他们指向同一资源的指针.可以维持此功能,直到调用者尝试修改其资源的"副本",此时创建一​​个真正的私有副本以防止其他人看到更改.所有这些都对呼叫者透明地发生.主要优点是,如果调用者从不进行任何修改,则不需要创建私有副本.

这里还有一个COW常用的应用:

COW概念还用于维护数据库服务器(如Microsoft SQL Server 2005)上的即时快照.即时快照通过在更新底层数据时存储数据的预修改副本来保留数据库的静态视图.即时快照用于测试用途或与时间相关的报告,不应用于替换备份.



2> Charlie Mart..:

"写入时复制"或多或少意味着它的含义:每个人都有相同数据的单一共享副本,直到它被写入,然后复制.通常,copy-on-write用于解决并发类问题.例如,在ZFS中,磁盘上的数据块被分配为写时复制; 只要没有变化,你保留原始块; 更改仅更改了受影响的块.这意味着分配了最小数量的新块.

这些更改通常也实现为事务性的,即它们具有ACID属性.这消除了一些并发问题,因为这样可以保证所有更新都是原子的.


@ powder366 - 不,他们不会看到错误的数据,因为当您进行实际制作副本时的更改.例如,您有一个名为"A"的数据块.进程"1","2","3","4"各自想要复制它并开始阅读它,在"写入时复制"系统中没有任何东西被复制,但一切仍在读"A".现在进程`3`想要更改它的'A`副本,进程`3`现在实际上会复制`A`并创建一个名为`B`的新数据块.进程"1","2","4"仍在读取块"A"进程"3"现在正在读取"B".
@Developer:嗯,无论对A进行任何更改,都应该创建一个新副本。如果您问如果出现一个全新的过程并更改了“ A”会发生什么情况,那么我的解释并没有真正涉及到足够的细节。那将是特定于实现的,并且需要有关您希望其余实现如何工作的知识,例如文件\数据锁定等。

3> Shamik..:

我不会在Copy-on-Write上重复相同的答案.我认为安德鲁的回答和查理的回答已经非常明确了.我将从OS世界给你一个例子,只是提到这个概念的使用范围有多广泛.

我们可以使用fork()vfork()创建一个新流程.vfork遵循copy-on-write的概念.例如,vfork创建的子进程将与父进程共享数据和代码段.这加快了分叉时间.如果您正在执行exec,然后执行vfork,则应使用vfork.因此,vfork将创建子进程,该进程将与其父进程共享数据和代码段,但是当我们调用exec时,它将在子进程的地址空间中加载新可执行文件的映像.


"vfork遵循写时复制的概念".请考虑更改此行.`vfork`不使用COW.事实上,如果孩子写东西,它可能导致未定义的行为,而不是复制页面!事实上,你可以说另一种方式是有道理的.COW就像`vfork`一样,直到在共享空间中修改了某些内容!

4> harpo..:

仅举几个例子,Mercurial使用copy-on-write使克隆本地存储库成为一种非常"便宜"的操作.

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

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有