问题标签 [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 投票
2 回答
1205 浏览

c++ - 通过 const 引用传递 Qt 类

众所周知,Qt 类在按值传递时使用copy-on-wite。因此,直到需要时才完成复制。当只需要对对象进行只读访问时,我已经看到很多次通过 const 引用传递 Qt 类。如果在这两种情况下都没有复制,为什么人们会通过const QString&而不是简单?QString

0 投票
1 回答
304 浏览

operating-system - 当写请求发生在写时快照副本中时会发生什么?

我正在阅读一些操作系统概念并偶然发现了这一点。

据我了解,当你拍摄快照时,

写入时复制将记录文件系统的当前状态(元数据)。这将导致系统稍微停止(几乎是瞬时的)。

如果文件系统收到对未修改文件的读取请求,我们正在读取快照元数据并将我们重定向到原始副本。

当文件系统收到写请求时会发生什么?它会更新原始文件系统和复制的文件系统吗?

0 投票
2 回答
3082 浏览

java - 将 CopyOnWriteArrayList 转换为 List 是否会导致它失去并发保证?

以上(标题)是我主要关心的问题。情况是

结果列表是从get()负债中获得的吗?它会影响发生的事情min还是它自己的副本?因此,例如,如果我正在迭代结果的结果是get()什么?

同样,当我们这样做时,相反呢?如果我做

safeStuff关于并发支持的第三行和stuffs之后的状态是什么?

0 投票
2 回答
7047 浏览

c++ - STL 中的写时复制支持

我刚刚阅读了一篇关于 Copy-on-write 的 Wikipedia 文章(好奇是否有任何文件系统支持它),并对以下段落感到惊讶:

COW 也用于内核之外的库、应用程序和系统代码中。例如,C++ 标准库提供的字符串类是专门为允许写时复制实现而设计的:

我不知道 STL 都支持写时复制。真的吗?它是否适用于其他 STL 类,例如std::vectorstd::array?哪些编译器支持这种优化(特别是,我想知道 G++、英特尔 C++ 编译器和 Microsoft C++ 编译器)?

0 投票
3 回答
2262 浏览

c# - 如何在 .NET 中编写写时复制列表

如何在 .NET 中使用写时复制模型编写线程安全列表?

下面是我目前的实现,但是在阅读了大量关于线程、内存屏障等的内容之后,我知道在涉及无锁的多线程时我需要小心。如果这是正确的实现,有人可以评论吗?

编辑

更具体地说:上面的代码是线程安全的,还是我应该添加更多内容?此外,所有线程最终都会看到list参考的变化吗?或者,也许我应该volatile在列表字段或 Thread.MemoryBarrier 中添加关键字访问引用和调用它的方法之间的包含方法?

这是例如Java实现,看起来像我上面的代码,但是这种方法在.NET中也是线程安全的吗?

这是同样的问题,但在 Java 中也是如此

是与此相关的另一个问题。

0 投票
1 回答
157 浏览

arraylist - CopyOnWriteArrayList 和 ConcurrentHashMap 原理的区别

在高级 Java 集合 API 中,我们有 CopyOnWriteArrayList 和 ConcurrentHashMap。然而,这些数据结构的基本原理是不同的。即ConcurrentHashMap 只锁定发生写操作的Map 的一部分。这就是它在不影响性能的情况下防止同步问题的方式。

另一方面,CopyOnWriteArrayList 通过复制原始列表来防止并发问题。为什么这些实现如此不同?Java 只是测试看看哪个更好用吗?

0 投票
1 回答
742 浏览

memory - 在写入和 fork() 时复制?

在具有分页内存的系统中,使用了写时复制技术,进程使用 fork() 调用创建一个新进程。

创建后,新进程立即尝试在内存中写入一些内容。CPU 会产生哪个错误 - 页面错误或其他错误?

据我所知,当使用写时复制时,这意味着不会复制公共数据,但是当我们使用 fork() 时,当新进程尝试写入某个页面时,该页面将停止共享,并且使用 fork 创建的进程获取页面的副本,以便可以在其中写入。

所以,我有点困惑处理器会产生错误吗?

0 投票
2 回答
288 浏览

string - 字符串不自动触发时如何触发COW

我有记录,有关背景信息,请参阅此问题

背景
我正在使用一个(几乎)像普通整数一样工作的 bignum 类。
因此a:= 1000000*10000000*12000000*10000000*1000000;会产生非常有用的结果。为此,我使用带有class operators. 这些触发自动类型转换和初始化。
除非没有转换,因为我将 a 分配TBigint给 another TBigint

解决方案
使用 Ansistring 存储核心数据,它具有写时复制功能,并会在需要时自行克隆。

问题:(如果 Delphi 不知道您正在更改字符串,则 COW 不起作用)
我有一些纯汇编程序例程可以操纵dynamic array伪装成Ansistring.

但是,当我做这样的事情时:

X并且LocX在臀部关节处,无论一个发生在另一个身上。
显然 Delphi 不知道 asm 例程DivBigint正在改变LocX,因此 COW 是有序的。

解决方法
如果我将例程更改为:

德尔福得到了所有的线索并且表现得很好。 LocX并且X没有链接,一切正常。
但是,我不想在一些空白空间的中间做出愚蠢的改变。

是否有一种体面/适当/官方*的方式来强制触发字符串中的 COW?
可能是系统调用之类的东西?

*圈出你最喜欢的选项(用手绘圆圈)

0 投票
3 回答
1747 浏览

java - 为什么 CopyOnWriteArrayList 在写入时复制?

从 CopyOnWriteArrayList.java 中,add 方法如下:

不难理解 add 操作应该加锁,让我困惑的是它将旧数据复制到新数组并放弃前一个。同时get方法如下:

没有锁定get方法。我找到了一些解释,有人说复制到一个新数组可以避免 add 和 get 方法在同一个数组上操作。我的问题是为什么两个线程不能同时读写?

0 投票
2 回答
156 浏览

svn - 版本化文件的 svn 写时复制语义:一个 svn:externals 用例?

我正在尝试创建 svn 分支的逻辑进展,其中较新的分支具有指向前一个分支中的文件的指针,而不是这些文件的副本。一旦您在较新的分支中更改了文件,它将与旧分支中的副本断开连接。(因此,写时复制)实际文件不是源代码,而是文本文件。我正在探索这里的可能性,并希望对此提议的布局提供反馈。

我们从一个典型的颠覆场景开始,在根级别有分支。当我们创建一个新分支时,它将作为最新分支的副本开始生命。例如:

分支 1 现在处于维护模式;分支 2 继续进行新的开发。

产量

我想要的是,不是让 A 和 B 成为断开连接的副本,而是让它们成为指针

因此,分支 2 中的文件 A 无缝地“跟踪”分支 1 中的文件 A。当分支 2 中的文件 A 必须与分支 1 中的文件 A 不同时,我们“断开链接”,创建一个实际的副本文件,然后从那里开始。

根据我的阅读,这可能与 svn:externals 一起实现。而不是 svn copy,我会编写脚本将分支 1 的目录结构复制到分支 2,然后对于每个包含文件的目录,在该目录上创建一个 svn:externals 属性,其中包含指向前一个分支的文件的 URL。

这是我的问题/问题:

  • 我希望不可能从分支/2/A 中的 svn:externals 副本更改分支/1/A。我相信这只有通过将 svn:externals 定义与修订联系起来才有可能,这违背了整个目的。有没有类似 svn:readonly 的东西?(不是我能找到的)

  • svn:externals 定义不是递归的。换句话说, ^/branches/3/A -> ^/branches/2/A (它本身指向) -> ^/branches/1/A 是不可能的。当有 3 个分支时,3 和 2 必须都明确指向分支 1。

我想要完成的主要事情是,一旦在某个分支中创建了文件,进一步的分支总是会自动更改该文件。这些文件的维护者必须采取一些明确的行动才能“破坏该链接”

有没有更好的方法来设置它?