copy-on-write相关内容

共享内存和写入时复制或右值引用以及移动语义?

通用容器(如 Qt 容器中的容器)的共享内存/写入时复制实现是否被 C++11 移动语义和右值引用取代? 一个失败而另一个成功的地方在哪里?还是它们是互补而非替代? 解决方案 写入时复制和移动语义都已用于优化将数据保存在堆上的对象的值语义.例如,std::string 既被实现为写时复制对象,又被实现为启用移动的对象. 所以写时复制和移动语义在这方面是相似的:如果你足够松散地定 ..

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

如果我在多线程环境中有一个未同步的 java 集合,并且我不想强制集合的读取器同步[1],那么我可以同步写入器并使用引用赋值的原子性可行吗?比如: 私有集合 global = new HashSet();//在此之后开始线程无效 allUpdatesGoThroughHere(对象示例操作数){//我的假设是这可以防止块中的操作被重新排序同步(全局){集合副本 = new HashSet(glo ..
发布时间:2022-01-22 20:03:20 Java开发

写时复制期间父进程是否会失去写能力?

假设我们有一个特定的父进程,内存中存储了一些任意数量的数据,我们使用 fork 来生成一个子进程.我了解,为了让操作系统在写入时执行复制,内存中包含我们正在修改的数据的特定页面将设置其只读位,并且操作系统将使用孩子尝试时将导致的异常修改数据以将整个页面复制到内存中的另一个区域,以便孩子获得自己的副本.我不明白的是,如果内存中的特定部分被标记为只读,那么数据最初所属的父进程也无法修改数据.那么这整个 ..

哪些段受写时复制的影响?

我对 copy-on-write 的理解是“每个人都有一个相同数据的单一共享副本,直到它被写入,然后再复制一份". 相同数据的共享副本是由堆和 bss 段组成还是仅由堆组成? 将共享哪些内存段,这是否取决于操作系统? 解决方案 操作系统可以设置它希望的任何“写入时复制"策略,但通常,它们都做同样的事情(即最有意义的事情). 简单地说,对于一个类似 POSIX 的系统(linu ..

为什么子进程和父进程的变量地址相同

这是我的代码 int main(){pid_t pid;整数 y = 3;如果 ( (pid = fork()) 程序的输出如下: 之前:3 ffbff440之后:30 ffbff440父亲:3 ffbff440 我的问题是为什么孩子和父母的变量地址相同但值不同? 解决方案 因为它是一个虚拟地址,而不是一个物理地址. 每个进程都有自己的地址空间(例如,32位系统可能允许每个 ..
发布时间:2021-12-14 23:49:01 服务器开发

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

据我所知,写时复制不是在 C++11 中实现符合标准的 std::string 的可行方法,但是当它最近在讨论中出现时,我发现我自己无法直接支持这种说法. C++11 不承认基于 COW 的 std::string 实现,我是否正确? 如果是,这个限制是否在新标准(where)的某处明确说明? 或者这个限制是隐含的,从某种意义上说,这是对 std::string 的新要求的综合影 ..
发布时间:2021-12-01 15:48:03 C/C++开发

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

我正在用 PHP 编写一个 Web API 客户端,它将 CSV 数据解析为关联数组,我想在使用这些数组时保护我的用户免受数据重复. 我的用户永远不会写入这些数组(理论上他们可以,但实际上没有意义). 现在我的问题是...如果我的用户将这些数组作为参数传递给方法,PHP 的写时复制机制是否会阻止数据重复,或者任何不明确接受对数组的引用的方法都会接收数组的完整副本? 解决方案 C ..
发布时间:2021-11-18 02:03:28 PHP

R:选择子集而不复制

有没有办法从对象(数据框、矩阵、向量)选择子集而无需复制所选数据? 我处理相当大的数据集,但从不更改它们.然而,为了方便起见,我经常选择数据的子集进行操作.每次复制一个大子集的内存效率非常低,但是正常索引和 subset(以及因此 xapply() 函数系列)都会创建所选数据的副本.所以我正在寻找可以克服这个问题的函数或数据结构. 一些可能适合我的需求并希望在一些 R 包中实现的方法: ..
发布时间:2021-11-16 23:01:50 其他开发

是否对所有结构进行写入时的快速复制?

我知道 swift 会优化以在写入时复制数组,但它会为所有结构执行此操作吗?例如: struct Point {无功x:浮点数= 0}var p1 = Point()var p2 = p1//p1 和 p2 在后台共享相同的数据p2.x += 1//p2 现在有自己的数据副本 解决方案 Array 以写时复制行为实现 – 无论任何情况,您都会得到它编译器优化(当然,优化可以减少需要复制的情况 ..
发布时间:2021-09-01 20:33:29 移动开发

PHP null 和写时复制

假设我想要两个变量,并且它们都等于 null.(更现实地说,我正在考虑一个包含大量 null 的数组,但“两个变量"场景足以解决这个问题.)显然,我可以在多个中做到这一点办法.我可以这样做(方法 1): $a = null;$b = $a; 据我所知,这样做的结果是符号表中的两个条目指向一个 zval:'a' 和 'b'.但也可以这样做(方法 2): $a = null;$b = 空; 天 ..
发布时间:2021-06-10 18:40:00 PHP

写入MAP_PRIVATE mmaped文件

我正在尝试理解这种肮脏的CoW概念证明: https://github.com/dirtycow/dirtycow...ter/dirtyc0w.c . 当子线程(上面链接中的 procselfmemThread)写入被父线程映射为 MAP_PRIVATE 和 PROT_READ 的内存时会发生什么?具体来说,内核是否将现有映射修改为匿名且可写?何时进行写时复制?假设另一个子线程(上面链接中 ..
发布时间:2021-05-30 18:39:40 其他开发

Go语言是否使用字符串写时复制

Go语言是否像Java中那样对字符串使用写时复制?IE.如果我按值将字符串传递给方法而从未更改,则它将分配内存并复制字符串(这将节省时间),或者仅引用单个副本. 解决方案 它不是写时复制的,因为字符串是不可变的.但是共享一个字符串也不会复制基础内存区域.在Go中,字符串表示为(长度,数据)对.如果传递字符串,Go将复制长度和指针,但不复制所指向的数据. 有关更多信息,请参见有关gol ..
发布时间:2021-05-11 19:43:45 其他开发

父进程在写时复制期间是否会失去写能力?

假设我们有一个特定的父进程,并在内存中存储了任意数量的数据,然后使用 fork 生成一个子进程.我知道,为了使操作系统能够在写入时执行复制,内存中包含我们正在修改的数据的特定页面将设置其只读位,并且操作系统将使用在子进程尝试时会导致的异常修改数据以将整个页面复制到内存中的另一个区域,以便子代获得其自己的副本.我不明白的是,如果内存中的特定部分被标记为只读,那么数据最初所属的父进程将无法修改数据.那 ..

多重处理:为什么在复制列表时与子进程共享一个numpy数组?

我使用了此脚本(请参阅末尾的代码)以评估在派生父进程时是共享还是复制了全局对象. 简而言之,该脚本创建了一个全局data对象,并且子进程在data上进行迭代.该脚本还监视内存使用情况,以评估对象是否已在子进程中复制. 以下是结果: data = np.ones((N,N)).在子进程中的操作: data.sum().结果:data被共享(无副本) data = list(ran ..
发布时间:2020-11-09 23:11:36 Python

Swift中哪些值类型支持写时复制?

我在此处中了解了有关Array的写时复制实现的信息。 / p> 数组与标准库中的所有可变大小集合一样,都使用写时复制优化。阵列的多个副本共享同一存储,直到您修改其中一个副本为止。发生这种情况时,要修改的阵列将用其唯一拥有的副本替换其存储,然后对其进行适当修改。有时会应用优化来减少复制量。 我想知道您是否有关于哪个结构支持复制的信息。 解决方案 String 支持复制写操作,并且 ..
发布时间:2020-10-05 05:56:32 移动开发

如何实现写时复制?

我想在我的自定义C ++ String类上实现写时复制,我想知道如何... 我尝试实现一些选项, 谢谢你们:-) 解决方案 在多线程环境中(当今是大多数环境),CoW通常是对性能的巨大打击,而不是收益。而且,通过谨慎地使用const引用,即使在单线程环境中也不会带来很大的性能提升。 这篇关于DDJ的老文章解释了即使在只有一个线程的情况下,在多线程环境中CoW也有多糟糕。 ..
发布时间:2020-09-27 05:39:48 C/C++开发

R:选择子集而不复制

是否可以从对象(数据框,矩阵,向量)中选择子集,而无需复制所选数据? 我使用相当大的数据集,但是从不更改它们.但是,通常为了方便起见,我选择要操作的数据子集.每次创建一个大子集的副本都是非常低效的内存,但是普通索引和subset(因此是xapply()函数族)都创建所选数据的副本.因此,我正在寻找可以克服此问题的功能或数据结构. 一些可能满足我的需求的方法可能希望在某些R包中实现: ..
发布时间:2020-09-06 05:30:05 其他开发