问题标签 [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.
c++ - 通过 const 引用传递 Qt 类
众所周知,Qt 类在按值传递时使用copy-on-wite。因此,直到需要时才完成复制。当只需要对对象进行只读访问时,我已经看到很多次通过 const 引用传递 Qt 类。如果在这两种情况下都没有复制,为什么人们会通过const QString&
而不是简单?QString
operating-system - 当写请求发生在写时快照副本中时会发生什么?
我正在阅读一些操作系统概念并偶然发现了这一点。
据我了解,当你拍摄快照时,
写入时复制将记录文件系统的当前状态(元数据)。这将导致系统稍微停止(几乎是瞬时的)。
如果文件系统收到对未修改文件的读取请求,我们正在读取快照元数据并将我们重定向到原始副本。
当文件系统收到写请求时会发生什么?它会更新原始文件系统和复制的文件系统吗?
java - 将 CopyOnWriteArrayList 转换为 List 是否会导致它失去并发保证?
以上(标题)是我主要关心的问题。情况是
结果列表是从get()
负债中获得的吗?它会影响发生的事情min
还是它自己的副本?因此,例如,如果我正在迭代结果的结果是get()
什么?
同样,当我们这样做时,相反呢?如果我做
safeStuff
关于并发支持的第三行和stuffs
之后的状态是什么?
c++ - STL 中的写时复制支持
我刚刚阅读了一篇关于 Copy-on-write 的 Wikipedia 文章(好奇是否有任何文件系统支持它),并对以下段落感到惊讶:
COW 也用于内核之外的库、应用程序和系统代码中。例如,C++ 标准库提供的字符串类是专门为允许写时复制实现而设计的:
我不知道 STL 都支持写时复制。真的吗?它是否适用于其他 STL 类,例如std::vector
或std::array
?哪些编译器支持这种优化(特别是,我想知道 G++、英特尔 C++ 编译器和 Microsoft C++ 编译器)?
c# - 如何在 .NET 中编写写时复制列表
如何在 .NET 中使用写时复制模型编写线程安全列表?
下面是我目前的实现,但是在阅读了大量关于线程、内存屏障等的内容之后,我知道在涉及无锁的多线程时我需要小心。如果这是正确的实现,有人可以评论吗?
编辑
更具体地说:上面的代码是线程安全的,还是我应该添加更多内容?此外,所有线程最终都会看到list
参考的变化吗?或者,也许我应该volatile
在列表字段或 Thread.MemoryBarrier 中添加关键字访问引用和调用它的方法之间的包含方法?
这是例如Java实现,看起来像我上面的代码,但是这种方法在.NET中也是线程安全的吗?
这是同样的问题,但在 Java 中也是如此。
这是与此相关的另一个问题。
arraylist - CopyOnWriteArrayList 和 ConcurrentHashMap 原理的区别
在高级 Java 集合 API 中,我们有 CopyOnWriteArrayList 和 ConcurrentHashMap。然而,这些数据结构的基本原理是不同的。即ConcurrentHashMap 只锁定发生写操作的Map 的一部分。这就是它在不影响性能的情况下防止同步问题的方式。
另一方面,CopyOnWriteArrayList 通过复制原始列表来防止并发问题。为什么这些实现如此不同?Java 只是测试看看哪个更好用吗?
memory - 在写入和 fork() 时复制?
在具有分页内存的系统中,使用了写时复制技术,进程使用 fork() 调用创建一个新进程。
创建后,新进程立即尝试在内存中写入一些内容。CPU 会产生哪个错误 - 页面错误或其他错误?
据我所知,当使用写时复制时,这意味着不会复制公共数据,但是当我们使用 fork() 时,当新进程尝试写入某个页面时,该页面将停止共享,并且使用 fork 创建的进程获取页面的副本,以便可以在其中写入。
所以,我有点困惑处理器会产生错误吗?
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?
可能是系统调用之类的东西?
*圈出你最喜欢的选项(用手绘圆圈)
java - 为什么 CopyOnWriteArrayList 在写入时复制?
从 CopyOnWriteArrayList.java 中,add 方法如下:
不难理解 add 操作应该加锁,让我困惑的是它将旧数据复制到新数组并放弃前一个。同时get方法如下:
没有锁定get方法。我找到了一些解释,有人说复制到一个新数组可以避免 add 和 get 方法在同一个数组上操作。我的问题是为什么两个线程不能同时读写?
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。
我想要完成的主要事情是,一旦在某个分支中创建了文件,进一步的分支总是会自动更改该文件。这些文件的维护者必须采取一些明确的行动才能“破坏该链接”
有没有更好的方法来设置它?