问题标签 [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 回答
5892 浏览

php - 写时复制会防止阵列上的数据重复吗?

我正在用 PHP 编写一个 Web API 客户端,它将 CSV 数据解析为关联数组,我想在使用这些数组时保护我的用户免受数据重复。

我的用户永远不会写入这些数组(理论上他们可以,但在实践中没有意义)。

现在我的问题是......如果我的用户将这些数组作为参数传递给方法,PHP 的写时复制机制是否会防止数据重复,或者任何未明确接受对数组的引用的方法都会收到完整的副本数组的?

0 投票
1 回答
2392 浏览

c - 如何禁用mmap()的写时复制和按需填充零

我正在使用 mmap() 实现 cp(file copy) 命令。为此,我将源文件映射为 MAP_PRIVATE(我只想读取)模式,并将目标文件映射为 MAP_SHARED 模式(因为我必须写回目标文件的更改内容)。

在执行此操作时,我观察到由于两个原因而发生的许多次要页面错误导致性能下降。1) 为源文件调用 mmap(MAP_PRIVATE) 时按需填零。2) 为目标文件调用 mmap(MAP_SHARED) 时写入时复制。

有什么方法可以禁用 Zero-fill-on-demand 和 Copy-on-write 吗?

谢谢, 哈里什

0 投票
2 回答
238 浏览

c++ - 迭代器和引用计数字符串

如果我们考虑使用引用计数的 std::string 实现,请考虑以下场景:

L1 和 L2 会发生什么?引用计数是否中断并执行了深层复制?我是这么认为的,但我担心的是,如果发生这种情况,请执行以下简单操作:

或者一个简单的:

在非常量上下文中会执行不必​​要的深度复制。我对吗?实现如何处理这个细节?

0 投票
1 回答
1042 浏览

qt - QImage 写入时复制

QImage基于QSharedDataQimage跟随pimplor copy on write? _ 例如,复制(通过复制或分配)Qimage 会制作像素的深层复制吗?

0 投票
0 回答
682 浏览

linux - 在 Linux 内核中进行 COW 复制?

所以,我想知道 - 我将如何在内核中实现复制内存页面 ( ) 并利用写时复制机制而不是立即传输数据。struct page

现在,我通过将用户空间地址转换为页面来复制页面,使用allocate_pages内核分配所需数量的页面,使用复制它们copy_pages,最后使用install_special_mapping. 这可行,但我觉得这可以使用写时复制机制进行优化。

0 投票
5 回答
3786 浏览

java - 在 Java 中,我可以依靠引用分配是原子的来实现写入时复制吗?

如果我在多线程环境中有一个不同步的 java 集合,并且我不想强制集合的读取器同步[1],那么我同步写入器并使用引用分配的原子性的解决方案是否可行?就像是:

在这些类型的情况下,滚动您自己的解决方案似乎经常失败,所以我有兴趣了解其他模式、集合或库,我可以使用这些模式、集合或库来防止创建对象并阻止我的数据消费者。


[1] 原因是与写入相比,读取花费的时间占很大比例,以及引入死锁的风险。


编辑:几个答案和评论中有很多很好的信息,一些要点:

  1. 我发布的代码中存在错误。在全局(一个命名错误的变量)上同步可能无法在交换后保护同步块。
  2. 您可以通过在类上进行同步来解决此问题(将同步关键字移动到方法中),但可能存在其他错误。一个更安全、更易于维护的解决方案是使用 java.util.concurrent 中的一些东西。
  3. 我发布的代码中没有“最终一致性保证”,确保读者看到作者更新的一种方法是使用 volatile 关键字。
  4. 回想起来,激发这个问题的一般问题是试图在 java 中使用锁定写入来实现无锁读取,但是我的(已解决的)问题是一个集合,这可能会让未来的读者感到不必要的困惑。因此,如果我发布的代码不明显,则通过一次允许一个作者对不受多个阅读器线程保护的“某个对象”执行编辑来工作。编辑的提交是通过原子操作完成的,因此读者只能获得编辑前或编辑后的“对象”。当/如果读取器线程获得更新时,它不能发生在读取中间,因为读取发生在“对象”的旧副本上。在 java 提供更好的并发支持之前,可能已经发现并证明以某种方式破坏了一个简单的解决方案。
0 投票
7 回答
31866 浏览

c++ - C++11 中 COW std::string 实现的合法性

我的理解是写时复制不是std::string在 C++11 中实现一致性的可行方法,但是当它最近在讨论中出现时,我发现自己无法直接支持该声明。

我是否正确 C++11 不承认基于 COW 的实现std::string

如果是这样,这个限制是否在新标准的某处明确说明(在哪里)?

还是暗示了这种限制,因为新要求的综合影响std::string排除了基于 COW 的std::string. std::string在这种情况下,我会对“C++11 有效禁止基于 COW 的实现”的章节风格派生感兴趣。

0 投票
3 回答
1127 浏览

java - 写时依赖java字符串复制

我的应用程序创建了一个类的很多实例,比如 A 类。所有实例都包含一个字符串,其中大多数都包含相同的字符串

我知道 JVM 使“所有相等的字符串”指向只存储一次的同一个字符串。如果我的 A 实例之一的 myString 字段被覆盖,则对原始字符串的引用将替换为对新 String 值的引用,并且一切都按预期工作,就好像每个实例都有一个字符串的副本一样。

兼容的 JVM 是否需要这种行为,或者它是对 jvm 的一种改进,可能会从一个 jvm 更改为另一个,或从一个版本更改为另一个版本?
提出问题的另一种方式:在设计高度冗余(基于字符串)的数据结构时,应该只依赖写时复制机制还是建议在应用程序级别放置一些东西?

0 投票
5 回答
1323 浏览

performance - perl 中的哈希元素的别名

是否可以在不同的哈希键下访问相同的值?我如何告诉 Perl 不要复制“非常长的文本”?

0 投票
2 回答
417 浏览

php - PHP 的 extract() 函数是否使用写时复制将变量添加到符号表?

对不起,我确定这个答案在互联网上的某个地方(甚至可能是 stackoverflow),但我花了最后一个小时搜索,似乎找不到答案......

PHP 的 extract() 函数是否使用写时复制将变量添加到符号表?

我知道 PHP 函数调用默认情况下都有一个写时复制(除非您通过引用指定),只是对此感到好奇,因为我正在集成一个模板系统,所以我将一大堆变量抓取到一个 $data 数组中,它有时可能会很大,我想知道在包含模板文件之前提取它们是否是解决此问题的最佳方法。

谢谢!

编辑:

澄清: