问题标签 [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.
linux - 如何知道写时复制页面是否是实际副本?
当我使用 mmap 创建写入时复制映射(MAP_PRIVATE)时,一旦我写入特定地址,就会复制此映射的某些页面。在我的程序中的某个时刻,我想弄清楚哪些页面实际上被复制了。有一个调用,称为“mincore”,但它只报告页面是否在内存中,这与正在复制的页面不同。
有什么方法可以确定哪些页面被复制了?
c++ - 以编程方式确定 std::string 是否使用 Copy-On-Write (COW) 机制
继这个问题的讨论之后,我想知道使用本机 C++ 的人如何以编程方式确定他们正在使用的 std::string 实现是否使用Copy-On-Write (COW)
我有以下功能:
问题是我似乎找不到返回 true 的 C++ 工具链。我对如何为 std::string 实现 COW 的假设是否存在缺陷?
更新:根据 kotlinski 的评论,我改变了函数中对 data() 的可写引用的使用,现在对于某些实现,它似乎返回“true”。
注意:根据N2668: "Concurrency Modifications to Basic String",在即将发布的 C++0x 标准中,COW 选项将从 basic_string 中删除。感谢 James 和 Beldaz 提出这个问题。
c++ - 什么是隐式共享?
我正在用 C++ 构建一个游戏引擎库。不久前,我正在使用 Qt 构建一个应用程序,并且对它对Implicit Sharing的使用非常着迷。我想知道是否有人可以更详细地解释这种技术,或者可以提供一个简单的例子。
c++ - 在 C++ 中使用哪些字符串类?
我们有一个 C++ (MFC) 中的多线程桌面应用程序。目前开发人员使用 CString 或 std::string,可能取决于他们的心情。所以我们想选择一个实现(可能不是这两个)。
MFC 的 CString 基于写时复制 (COW) 习语,有些人会声称这在多线程环境中是不可接受的(可能参考本文)。我不相信这种说法,因为原子计数器似乎相当快,而且这种开销以某种方式通过减少内存重新分配来补偿。
我了解到 std::string 的实现取决于编译器——它不是 MSVC 中的 COW,但它是,或者在 gcc 中。据我了解,新的 C++0x 标准将通过要求非 COW 实现来解决此问题,并解决一些其他问题,例如连续缓冲区要求。所以实际上 std::string 在这一点上看起来没有很好的定义......
一个我不喜欢 std::string 的简单示例:如果没有过多的重新分配,就无法从函数返回字符串(如果按值返回,则复制构造函数,并且无法访问内部缓冲区来优化它,所以“返回通过参考”例如std::string& Result
没有帮助)。我可以通过按值返回(由于 COW 没有复制)或按引用传递并直接访问缓冲区来使用 CString 执行此操作。再一次,C++0x 用它的右值引用来拯救,但我们不会在最近的特性中使用 C++0x。
我们应该使用哪个字符串类?COW真的会成为问题吗?还有其他常用的有效字符串实现吗?谢谢。
编辑:我们目前不使用 unicode,我们不太可能需要它。但是,如果有一些容易支持 unicode 的东西(而不是以 ICU 为代价......),那将是一个加号。
c - 执行 fork() 时在某些内存页面上禁用写时复制(COW)
当父进程fork子进程时(linux下),我想一开始就将父进程中的一些内存页复制到子进程的地址空间,也就是说,不需要等待copy-on-写(牛)。是否有任何机制支持这一点?谢谢:-)
perl - 在对一条数据进行一次更改后,是否会复制所有标记为写时复制的内存?
我的问题也许是一个措辞不佳的问题,源于我对内存管理的业余理解。
我担心的是:我有一个 Perl 脚本,它会分叉很多次。正如我从 perldoc 中的 fork 页面所了解的那样,正在实施写时复制。然后每个孩子调用system()
,再次分叉,调用外部程序。来自外部程序的数据被读回子程序,并作为可存储文件转储,以便在所有子程序退出后由父程序获取和处理。
我担心的是我对这种情况的感知波动。考虑一下我在脑海中看到的最坏情况:对于每个孩子,只要有新数据到达,整个写时复制内存就会被复制。如果是这种情况,我将在创建几个分叉后很快遇到内存问题。
但或者,写时复制是否只复制包含所需数据的最小内存块?那么这个内存量是什么?它的尺寸是如何设置的?
我不确定我所要求的具体内容是依赖于语言还是依赖于某些较低级别的过程。
python - Python中的对象回滚、写时复制、版本化代理等
前提:给定一个 Python 对象obj
,我想将它传递给一些随机函数,并且,当函数完成时,我需要重置obj
为原始状态的选项。此外,不能对它进行实际更改,obj
因为其他代码可能仍希望访问它的原始状态。
obj
在一个大的只是稍微修改的常见情况下,最佳解决方案应该很快。obj
需要回滚的罕见情况下的性能不太重要。
这些要求与简单地复制对象的蛮力解决方案是正交的:在常见情况下它会非常慢,而对于不常见的回滚来说却非常快。
该解决方案通常应允许处理对象的代码将其视为普通对象。这包括为其分配各种属性,包括自定义类。显然,解决方案需要考虑到整个对象树。可能需要一些让步。到目前为止,我在我的解决方案中考虑的限制示例包括要求非基本类型都继承自一个特殊的基类,不允许 dicts 和列表以换取元组和自定义 dict 类等。主要的奥秘是可以接受的。
我已经为此工作了一段时间,并且很想看看更有经验的 Python 向导是否有什么想法和建议。
编辑:Fred 的回答让我意识到了一个缺失的要求:不能对 original 进行任何更改
obj
,因为原始状态也很有价值。
c++ - std::string 写时复制实现线程安全
可能的重复:
C++:多线程程序中的
std::string 使用 gcc 4.3 时 std::string 是安全的吗?
大家好,
假设我们将对象的引用传递给线程过程,然后我们修改该对象。这里我们有数据竞争,所以为了避免这种情况最好按值传递对象。现在看起来很安全,但真的安全吗?如果对象的类型是std::string
. 有些编译器实现std::string
了写时复制语义,因此不会复制实际数据,而是它们都引用相同的数据。当对其中一个对象调用修改器函数时,就会完成真正的复制。现有的 C++ 标准允许这样的实现,但是现有的标准没有提到多线程,所以这个实现被允许不是线程安全的。那正确吗?
您对这种解决方案有何看法?
std::string x = "blablabla; std::strinc copy_of_x = x.c_str();
谢谢。
java - 从 CopyOnWriteArrayList 中删除元素
当我尝试使用迭代器从 CopyOnWriteArrayList 中删除元素时出现异常。我注意到它已记录在案
不支持迭代器本身的元素更改操作(删除、设置和添加)。这些方法抛出 UnsupportedOperationException。
(来自http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html)
现在,令人惊讶的是,我可以使用 foreach 迭代它并使用 remove() 函数。但是后来我得到了一个著名的错误——当尝试使用 for 循环从列表中删除一个项目时——你跳过了被删除元素旁边的元素。那么有什么建议吗?
process - 共享地址空间与复制页表条目
之前
copy on write (COW)
说父子进程共享同一个地址空间,就是说它们共享同一个代码段、数据段、堆和栈对吧?如果在COW之前父子进程共享同一个地址空间,那是什么
the page table entries are copied from parent process to child process
意思呢?复制页表条目是否意味着复制地址空间?