标签: copy-on-write

Go语言是否使用Copy-on-write作为字符串

Go语言是否像Java一样使用Copy-on-write作为字符串?即如果我按值将字符串传递给方法并且从不更改它将分配内存并复制字符串(这将是时间效率低下)或者它将仅引用单个副本.

string copy-on-write go

3
推荐指数
1
解决办法
3055
查看次数

别名perl中的哈希元素

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

$hash->{'key'} = 'very long text';
$hash->{'alias'} = $hash->{'key'};
Run Code Online (Sandbox Code Playgroud)

perl performance alias reference copy-on-write

3
推荐指数
2
解决办法
1215
查看次数

如何在字符串不自动触发时触发COW

我有一个记录,看到这个问题的背景信息.

TDigits = AnsiString;  //Should be `= array of NativeUInt`, but string has COW

TBigint = record
  Digit: TDigits; // Unsigned number, LSB stored in D[0], MSB in D[size-1]
  Size: Byte; // Mininum = 4, maximum 127.
  MSI: Byte; // Most significant (native)integer minimum=1, maximum=127
  Sign: Shortint;
  class operator Implicit(a: Integer): TBigint;
Run Code Online (Sandbox Code Playgroud)

背景
我正在使用一个(几乎)像普通整数一样工作的bignum类.
因此a:= 1000000*10000000*12000000*10000000*1000000;产生非常有用的结果.为此,我使用了一个记录class operators.这些触发自动类型转换和初始化.
除非没有转换,因为我正在分配TBigint给另一个TBigint.

解决方案
使用Ansistring存储核心数据,它具有写入时复制功能,并在需要时自行克隆.

问题是:(如果Delphi不知道你正在改变字符串,COW不起作用)
我有一些纯粹的汇编程序例程来操纵数字dynamic array伪装成Ansistring.

但是,当我做这样的事情时: …

delphi string copy-on-write

3
推荐指数
1
解决办法
191
查看次数

写入时副本的线程安全性

我试图了解开发线程安全应用程序的正确方法.

在目前的项目中,我有以下课程:

class Test
{
public:
    void setVal(unsigned int val)
    {
        mtx.lock();
        testValue = val;
        mtx.unlock();
    }

    unsigned int getVal()
    {
        unsigned int copy = testValue;
        return copy;
    }
private:
    boost::mutex mtx;
    unsigned int testValue;
}
Run Code Online (Sandbox Code Playgroud)

而我的问题是:在多线程环境中上面的方法是Test :: getVal()threadsafe,还是在复制前必须锁定?我读过一些关于COW的文章,现在我不确定.

谢谢!

c++ multithreading copy-on-write

3
推荐指数
1
解决办法
521
查看次数

Linux中的进程之间如何共享代码段?

我已经阅读了关于在 Linux 中分叉新进程时发生的写时复制原则。

我还了解到,如果一个程序的多个实例同时运行,则只能在内存中找到该程序代码的一个实例。

我想知道这是否是写时复制原则的直接后果,如果不是,确保程序代码的不必要副本不会驻留在内存中的过程是什么?

linux memory fork copy-on-write

3
推荐指数
1
解决办法
2574
查看次数

Python嵌套函数是copy-on-could-write吗?

请原谅Python爱好者一个主要的学术问题.

我对嵌套函数的成本(如果有的话)感兴趣 - 不是使用闭包等的功能合理的函数,而是保持外部名称空间整齐.

所以我做了一个简单的测量:

def inner(x):
    return x*x

def flat(x):
    return inner(x)

def nested(x):
    def inner(x):
        return x*x
    return inner(x)

# just to get a feel of the cost of having two more lines
def fake_nested(x):
    y = x
    z = x
    return inner(x)

from timeit import timeit

print(timeit('f(3)', globals=dict(f=flat)))
print(timeit('f(3)', globals=dict(f=nested)))
print(timeit('f(3)', globals=dict(f=fake_nested)))

# 0.17055258399341255
# 0.23098028398817405
# 0.19381927204085514
Run Code Online (Sandbox Code Playgroud)

所以似乎有一些开销,它似乎比通过再增加两行来解释.

但是,似乎def每次调用外部函数时都不会计算内部语句,实际上内部函数对象似乎是缓存的:

def nested(x):
    def inner(x):
        return x*x
    print(id(inner), id(inner.__code__), id(inner.__closure__))
    return inner(x)

nested(3)
x = [list(range(i)) …
Run Code Online (Sandbox Code Playgroud)

python nested function copy-on-write

3
推荐指数
1
解决办法
108
查看次数

Swift中多线程环境中的写时复制

我已经阅读了有关在中进行优化Arrays和其他数据结构的写时复制概念Swift

我想知道的是写时复制在多线程环境中如何工作。

    let arr1 = [1, 2, 3, 4]
    let arr2 = arr1
    arr1.withUnsafeBytes { print("arr1:", $0.baseAddress) } //0x000060000007ee60
    arr2.withUnsafeBytes { print("arr2:", $0.baseAddress) } //0x000060000007ee60

    DispatchQueue.global(qos: .default).async {
        let arr3 = arr1
        arr3.withUnsafeBytes { print("arr3:", $0.baseAddress) } //0x000060000007ee60
    }
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,arr1并且arr2最初具有与中期望的相同的地址copy-on-write。不过,arr3成也共享相同的存储arr1arr2虽然是在不同的线程执行。

据我所知,每个线程都有不同的堆栈分配。那为什么arr3仍然共享相同的位置?

有人可以解释一下它是如何工作的。

arrays copy-on-write ios swift ios-multithreading

3
推荐指数
1
解决办法
269
查看次数

MATLAB 中的 Copy-on-Write 和 varargin

MATLAB 文档中有避免不必要的数据副本部分,其中可以找到以下语句:

写时复制

如果函数不修改输入参数,MATLAB 不会复制输入变量中包含的值。

在这种情况下,没有关于 varargin 的词。我试图制定一个能够监控内存使用情况的函数,但没有成功。所以我在这里问:写时复制功能是否适用于 varargin?

假设函数function Y = f(x,y,z)与函数function Y = f(varargin)。在第一种情况下,函数调用f(a,b,c)不会复制a,bc(无论变量的类型如何)。在第二种情况下,函数调用的行为f(a,b,c)不清楚。将MATLAB点出来varargin{1}avarargin{2}bvarargin{3}c不明确创建单元阵列,或者是varargin一个明确的串联ab以及c(因此内存将存储单元阵列内的三个变量的副本)?

memory matlab memory-management copy-on-write

3
推荐指数
2
解决办法
188
查看次数

Python是否将写时复制用于列表的副本?

假设我复制一个现有列表:

existing_list = [ 1, 2, 3 ];
copied_list = existing_list[:]

...

copied_list[2] = 'a' // COW happens here
Run Code Online (Sandbox Code Playgroud)

[一些编辑]

我听说当copyed_list或existing_list发生突变时,Python使用写时复制。这是真的?

在我看来,这就像一个过于复杂的事情,需要到处锁定(考虑多线程)。

为了清楚起见:我不是在寻找COW体现。我只是想了解什么是Python标准行为。

python copy-on-write

2
推荐指数
1
解决办法
2082
查看次数

Linux内核如何检测是否修改了内存地址以实现COW?

源代码在这里:

 #include <stdio.h>
 #include <stdlib.h>

 void main() {
     int *a = malloc(sizeof(int));
     *a = 11;
     int b = 22;//on the stack

     int pid = fork();

     if (pid == 0) {
         printf("pid=%d, a = %d, &a=%p\n", getpid(), *a, a);
         printf("pid=%d, b = %d, &b=%p\n", getpid(), b, &b);
         getchar();
         *a = 33;// ===========cow=========happend here=====
         b = 44;
         printf("pid=%d, a = %d, &a=%p\n", getpid(), *a, a);
         printf("pid=%d, b = %d, &b=%p\n", getpid(), b, &b);
     } else {
         printf("pid=%d, a = %d, &a=%p\n", getpid(), …
Run Code Online (Sandbox Code Playgroud)

c linux copy-on-write linux-kernel

2
推荐指数
1
解决办法
698
查看次数

是否有可能将切片/向量强制转换为函数参数中的'Cow <[type]>'?

移动API使用时Cow<[sometype]>,必须更换:

some_func(arg1, arg2, arg3);
Run Code Online (Sandbox Code Playgroud)

附:

some_func(Cow::from(&arg1[..]), Cow::from(&arg2[..]), Cow::from(&arg3[..]));
Run Code Online (Sandbox Code Playgroud)

语法相当密集.

Cow当作为函数参数传递时,是否有一种方法可以将向量或切片强制转换为它们的等价物?


可能有充分的理由这样做,例如,如果您多次对函数使用相同的参数,则显式语法是提示Cow<[]>应该为版本分配变量并保留.但是,我很想知道这是否可行.

copy-on-write rust

2
推荐指数
1
解决办法
183
查看次数

COW 与 ROW 快照技术

当我阅读快照技术时……我发现写时复制(COW)和写时重定向(ROW)对于理解他们承诺的实际操作非常令人困惑……有人请解释我如何他们实际上正在工作......

谢谢

storage snapshot copy-on-write read-committed-snapshot

1
推荐指数
1
解决办法
4649
查看次数