代码之家  ›  专栏  ›  技术社区  ›  hhafez

什么是书面副本?

  •  87
  • hhafez  · 技术社区  · 15 年前

    我想知道什么是书面副本,它是用来做什么的?sun jdk教程中多次提到了“copy-on-write-array”这个术语,但我不理解它的含义。

    6 回复  |  直到 7 年前
        1
  •  106
  •   Andrew Hare    15 年前

    我本来打算写自己的解释,但是 this Wikipedia article 差不多可以概括一下。

    基本概念如下:

    copy-on-write(有时称为“cow”)是计算机编程中使用的优化策略。基本思想是,如果多个调用者请求最初不可区分的资源,您可以为他们提供指向同一资源的指针。在调用者尝试修改其资源的“副本”之前,可以维护此函数,此时将创建一个真正的私有副本,以防止其他人看到更改。所有这些都对调用者透明地发生。主要优点是,如果调用者从不进行任何修改,就不需要创建私有副本。

    此外,这里还介绍了常用奶牛的应用:

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

        2
  •  45
  •   Charlie Martin    15 年前

    “写即拷”的意思差不多是:每个人都有一个相同数据的共享副本。 直到写下来 ,然后制作一份副本。通常,写时复制用于解决并发性问题。例如,在ZFS中,磁盘上的数据块是在写时分配的;只要没有更改,就保留原始块;更改只更改受影响的块。这意味着分配了最小数量的新块。

    这些更改通常也被实现为 交易的 也就是说,它们具有酸性。这消除了一些并发性问题,因为这样就保证了所有更新都是原子的。

        3
  •  8
  •   Ahmad F    7 年前

    我不会在书面副本上重复同样的回答。我想 Andrew's answer Charlie's answer 已经很清楚了。我将给您举一个操作系统世界的例子,只是要说明这个概念的使用范围有多广。

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

        4
  •  6
  •   harpo    14 年前

    再举一个例子, Mercurial uses copy-on-write 使克隆本地存储库成为真正的“廉价”操作。

    原理与其他示例相同,只是您所说的是物理文件,而不是内存中的对象。最初,克隆不是重复的,而是 hard link 原版。当您更改克隆中的文件时,将写入副本以表示新版本。

        5
  •  1
  •   Chris    15 年前

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

        6
  •  1
  •   Jamal Tom_B    8 年前

    我发现 this 关于php中zval的好文章,也提到了cow:

    copy-on-write(缩写为“cow”是一种节省内存的技巧。它在软件工程中的应用更为普遍。这意味着,如果这个符号已经指向一个zval,那么当您写入一个符号时,php将复制内存(或分配新的内存区域)。

    推荐文章