问题标签 [copy-on-write]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
85 浏览

triggers - 写入时复制触发器

我可以指望特殊触发器表的顺序,inserted并且deleted,是否相同?

如果不是,我该如何处理影响标识列的插入语句?

我有一个生产(主)数据库。我正在尝试建立一个开发数据库,​​它是生产数据库之上的一层。在开发数据库中,我的应用程序未修改的表和视图是生产数据库的同义词。我为它修改的表设置了视图。当这些视图被更新或插入时,数据被插入到辅助表而不是生产数据库表中。视图从辅助表中选择所有行,然后从生产表中选择辅助表中不存在的任何行(比较在主键列上)。

假设我的一张生产表是MainDB.App.Data,它的辅助表是MockDB.MockTables.Data,视图是MockDB.App.Data。我在更新或插入模拟表的视图上有一个触发器:

0 投票
1 回答
1145 浏览

delphi - 写入时复制记录数组

写时复制语义是否适用于动态记录数组?

如何正确复制记录数组?

这够了吗?:

复制完成后,我需要重置第一个数组:

我可以这样做吗?

0 投票
2 回答
8656 浏览

c - 写时复制如何在 fork() 中工作?

我想知道 fork() 中的写时复制是如何发生的。

假设我们有一个具有动态 int 数组的进程 A:

数组中的元素被初始化为一些有意义的值。然后,我们使用fork()创建一个子进程,即B。B会迭代数组并做一些计算:

  1. 我知道 B 不会立即复制整个数组,但是子 B 什么时候为数组分配内存?在 fork() 期间?
  2. 它是一次分配整个数组,还是只分配一个整数a = a+1
  3. a = a+1;这是怎么发生的?B 是否从 A 读取数据并将新数据写入自己的数组?

我写了一些代码来探索 COW 是如何工作的。我的环境:ubuntu 14.04、gcc4.8.2

在fork()之后,子进程修改数组中的一半数字,然后修改整个数组。输出是:

似乎数组没有作为一个整体分配。如果我将第一个修改阶段稍微更改为:

输出将是:

0 投票
4 回答
765 浏览

python - Python 是否将字符串对象操作为写入时复制样式

我注意到在 python 中,字符串对象只保留一份副本。就像下面的代码:

s1 和 s2 指向同一个对象。

当我编辑 s1 时,s2 仍然保留对象('abcde'),但 s1 指向一个新副本。这种行为喜欢写时复制。

那么python真的在字符串对象上使用复制机制吗?

0 投票
1 回答
3211 浏览

windows-7 - 使用 NTFS 在 Windows 7 上创建写时复制目录

我有一个包含源代码的目录,我对其进行编译以生成目标文件。我想快速应用补丁并以这样一种方式重建,即我可以同时访问旧目标文件和新目标文件。一种方法是:

但是,即使在同一个驱动器上,复制也需要大约 10 分钟。如果我可以制作new一个写时复制版本,old那会快得多。Windows 7 NTFS 可以创建写时复制目录吗?修改外部目录时,这些目录是否可以扩展为写时复制子目录?

0 投票
1 回答
1724 浏览

c - 在 Mac OS X 上使用 mmap 实现写时复制缓冲区

我一直在使用 Linux 上的写时复制缓冲区,以下示例似乎按预期工作:

然而,在 OS X (10.10) 下,第二个mmap调用返回MAP_FAILED, errno= 22 ( EINVAL)。OS X 手册页mmap似乎表明这应该可以工作(它甚至在标志的描述中提到了写时复制)MAP_PRIVATE,并且我已经尝试了各种不同的标志来调用mmap,但似乎没有任何效果。有任何想法吗 ?

0 投票
2 回答
103 浏览

memory - Copy-On-Write : 父子修改页面后是什么状态?

当你 fork 一个进程时,在开始时,父子共享同一个内存页。但是如果其中一个人在这个页面上写,它会被复制,这样第一个就不会受到这个变化的影响。这大致就是所谓的 Copy-on-Write。

我的问题是:如果我们 fork() 一个进程,然后孩子修改页面会发生什么:页面重复一次,但之后,父亲也修改了页面。页面是否再次重复?父亲“知道”独生子已经被复制了吗?

预先感谢您的帮助。

0 投票
1 回答
1243 浏览

c++ - C++ - 写时复制基本实现

我们应该在我们的学校项目中使用写时复制。我一直在尝试一个非常简单的课程,但没有任何运气。我有这个:

这很奇怪,因为当我取出 couts 时,一切正常(没有泄漏,valgrind 没有错误)。

任何帮助,将不胜感激。

0 投票
0 回答
124 浏览

ruby - Ruby 分叉和运行 GC 的 CoW 正在扼杀性能

问题是:在 2.2.1 中 fork 和调用 GC 时内存重复。这样做的主要问题是,在处理高达 3GB 的海量数据时,我的机器在一次分叉后就被杀死了。

我们编写了一个重现问题的小程序(见附件)。

该程序实例化一个对象,然后分叉成两个进程。GC 在子进程中被调用。内存分配(由 /proc/pid/smaps 给出)从共享变为私有,从而表明内存消耗翻了一番。

这是程序的输出(大小以 mb 为单位):

https://bugs.ruby-lang.org/issues/10559#change-50245

我们已经使用 ruby​​ 1.9.3、2.1.3 和 2.2.1(最新)在 Ubuntu 14.04 上测试了该程序。测试是在新安装的 Ubuntu 机器上进行的,因此没有涉及其他软件。

我们还尝试 fork 10 个子节点,发现内存消耗翻了 10 倍,该问题仅在运行 GC 后出现。

问题:这个问题的根源是什么(Ruby、内核、Ubuntu)以及可以用它做什么?

该程序的源代码可以在这里找到:https ://bugs.ruby-lang.org/issues/10559#change-50245

编辑 :

这是我处理的代码。

如果您在 linux 上运行上述代码并使用 smaps 监控共享内存,您会看到在子进程中创建新对象的那一刻,整个内存都变得私有,但它不应该因为我什至没有修改原始对象。然而,有趣的是,如果像下面这样创建附加到数组的字符串,那么一切都会正常运行。

我怀疑这是因为底层版本产生的垃圾更少。但即使我在 fork 之前多次强制 GC,它仍然会发生。我怀疑这是因为所有内容都分配在 GC 堆上,实际上已被修改,这导致了写时复制。有可能吗?

0 投票
2 回答
277 浏览

python - 将不可变变量传递给函数时,python 是否使用写时复制?

当我将字符串传递给函数时,python 是将整个字符串复制到新的内存位置还是等到我尝试从函数内部修改字符串?

谢谢 :)