问题标签 [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++ - 使用整数上的指针在写入时复制
我尝试使用整数上的指针来实现写入时复制。但我不明白如何编写代码。这个想法在我的脑海中非常清晰:当我使用默认构造函数时,我会创建一个对象的新实例(实例数=1),当我使用复制构造函数时,我会增加实例数并进行浅拷贝的对象。
我从 C++ 开始,指针的概念对我来说完全是新闻,所以我尝试了这个。但我真的不明白为什么“ref”仍然等于 1,即使我使用复制构造函数创建了对象的副本。
redis - 什么是写时复制内存
随着我不断向 redis 写入数据,copy-on-write 使用的内存不断增加。即使我将程序写成足够长的睡眠时间,以便 redis 能够完成所有后台保存(最后的内存消息是写时复制使用的 0 MB 内存),下一次后台保存将回到高数字。
例子,
牛使用的1300MB内存
牛使用的1400MB内存
牛使用0MB内存
牛使用1500MB内存
所有这些究竟意味着什么?据我所知,如果写时复制内存不断增加,那么内存就没有足够的空间。此外,每次使用高内存的后台保存时,redis 似乎都无法正常工作。Jedis 总是遇到套接字超时异常。
matlab - 就地编辑以防止通过写时复制进行重新分配
我想将功能包装在一个函数中,在这种情况下,增加一个可能很大的矩阵中的第一个元素:
考虑到增量将是一个更复杂、代码密集的操作。因此,我决定将它包装在一个函数中:
这强烈表明 A 被复制了,但它不应该是必要的;即Matlab可以检测到(1)A在同一个语句中被覆盖,(2)A的数据不与另一个变量共享。但是,它显然没有这样做。
因此,一种解决方案是按照此处 OP 的建议进行破解:Working with preallocated arrays in Matlab's mex function
但是,这会导致错误:
mxUnshareArray(const_cast(argin[0]), true);
我假设在 Matlab 8.1.0.604 (R2013a) 中删除了 mxUnshareArray;我的版本。我也可以简单地删除该行,这很快:
然而,它打破了 Matlab 的右手值不可变的规则。不幸的是,我不愿意放弃通过在函数中包装功能来清理我的代码,也不愿意允许无用的减速。请注意,我在 for 循环中使用该函数,我已经尝试使用 c++ 和 mex 优化部分。
一种解决方案可能是通过 OO 解决它,即:
哪个更快,但不如展开的裸增量快;我假设数据没有被复制。此外,它还有很多样板代码。
我的问题归结为:(1)是否有可能在 Matlab 中通过引用构造进行某种传递,或者在不复制输入参数的情况下编辑并将其传递给输出?(2)为什么没有mxUnshareArray?(3)如果我使用 mxUnshareArray,函数内的 A 版本是否会被取消共享,从而与工作区中的版本不同,从而不允许“模拟”通过引用传递?
我问是因为我想要速度和干净的代码:)
答案@Peters 解决方案是有效的。我想补充一点,它似乎并没有复制所有数据,即这段代码:
导致这个速度:
这仍然比裸解决方案慢约 10 倍。我假设这是由于函数调用开销造成的,并且当实际操作需要更多 CPU 周期时,相对速度损失较小。
arrays - How to increase the reference count of subarrays when the refcount of the holding array increases?
I have a COWarray that works OK, but now I want to expand the number of dimensions like so:
The array splits up its items in blocks. Every sub array has e.g. 100 items and the mean array has however many items are needed.
To the outside only a one dimensional array is presented, but internally the data of type T
is stored in the subarray.
This way I can have copy of write with very little copying going on when a single item changes. Instead of cloning all 20,000 items, only 100 items are clones plus the mean array with 200 items, i.e. only 300 items a nearly 99% reduction of effort and storage.
The problem is that I need to keep track of changes in the reference count of the main array and propagate those to the sub-arrays.
Something like:
Obviously for performance reasons I will use a plain for i loop
How do I do this?
I was thinking of adding a custom TInterfaced Object, but I'm not sure how to make it work.
memory-management - mmap vs malloc vs calloc 性能微基准测试:期待什么
我创建了一个微基准来比较 malloc 与 mmap 的分配性能和 RSS 使用情况。
我得出的结论是 mmap 是最快的,除非您实际使用内存。因此,我可能可以将它用于人口稀少的数据结构。
我的问题是这个结论是否正确以及我得出的数字是否有意义(详见下文)。
在我的系统(沙桥台式机)上,我得到:
- mmap:~900.000 分配/秒,RSS ~0.5 MB,VSIZE ~2GB
- mmap + MAP_POPULATE:~800 分配/秒,RSS 和 VSIZE ~2GB
- malloc:~280.000 分配/秒,RSS 和 VSIZE ~2GB
- calloc:~550 分配/秒,RSS 和 VSIZE ~2GB
- malloc, MALLOC_PERTURB_ == 1: ~260 allocations/s, RSS and VSIZE ~2GB
我已经“录制”了一点。
mmap + MAP_POPULATE 大部分时间都在 clear_page_c_e(2M 调用/秒)中,从 __mm_populate 调用。我猜这将是我必须支付的页面错误税,如果代码实际上对mmap'ed内存做了一些事情,但是......
...malloc(没有将 MALLOC_PERTURB_ 环境变量设置为任何内容)也将大部分时间花在 clear_page_c_e 中(也是 2M 调用/秒),但实现了更多的分配/秒。
带有 MALLOC_PERTURB_ 的 calloc 和 malloc 将所有时间都花在 memset 中。我理解malloc。我认为 calloc 应该将所有页面映射到一个全为零的写时复制页面,但我的 glibc 显然没有这样做。
除了普通的 mmap 之外,其他人都增加了 RSS,这让我有点惊讶。我认为 malloc 和/或 calloc 只会在使用内存时这样做。
c++ - 写入时复制的线程安全
我试图了解开发线程安全应用程序的正确方法。
在当前项目中,我有以下课程:
我的问题是:上面的方法 Test::getVal() 在多线程环境中是线程安全的,还是必须在复制之前锁定?我读过一些关于牛的文章,现在我不确定。
谢谢!
c++ - 写时复制正确用法?
我很想了解 COW 的工作原理,我在 wikibooks 上找到了以下课程,但我不理解这段代码。
我会在共享的地图对象上的多线程应用程序中使用它。
所以我已经将它分配给模板,现在我有:
现在我的问题:
我应该如何正确地为只想读取地图对象的随机线程获取地图实例?
例如,我应该如何从随机线程修改地图对象。插入新对象还是删除它?
java - 覆盖 CopyOnWriteArraySet.add 和 remove 的等于
我有如下课程
我想创建一个全局队列,如果队列 B 中存在对象 C,则应该允许添加,但反之则不行。所以在#1 之前,我循环遍历集合中的元素,执行 element.equals(B) 并添加 false。
但是 1 正在调用返回 true 的 B.equals(C) ,因此 mySet 在这一行之后只有一个 C 对象
2 再次调用 B.equals(C) ,它返回 true 并删除现有对象 C。在这种情况下不应该是 C.equals(B) 吗?我期待这条线不采取行动
这是对 CopyOnWriteArraySet 的错误使用吗?
感谢您的关注
c++ - Is 'implicit sharing' heritable from Qt classes?
If I create a subclass of an implicitly shared Qt class (e.g., QList), will my subclass be implicitly shared as well?
I read the brief introduction to implicit sharing located in the QtCore5.3 documentation, but I didn't see any mention of heritability.
My purpose in asking is to try to write more efficient code when deciding which arguments to pass and how to pass them.
c - Matlab 是否曾经复制传递给 mex 函数的数据?
关于惰性复制:Matlab 是否会复制传递给 mexFunction 的数据,并对其进行修改?
例如在
可以肯定的是,输入矩阵永远不会被复制,这样就可以传入并修改它,而不必返回引用?