Python的写时复制,真的存在吗?

3
当一个进程fork出一个子进程时,子进程不会复制父进程的变量。但是,如果子进程修改了父进程变量的值,它将创建一个新的变量,这被称为写时复制。现在请看下面的代码:
# coding=utf-8
import os
value = []
res = os.fork()

if res == 0:
    value = [324]
    print 'child  id={id} value={value}'.format(id=id(value), value=value)
else:
    value = [2]
    print 'parent  id={id} value={value}'.format(id=id(value), value=value)

如果你运行它,结果可能会像这样:
parent  id=4321407056 value=[2]
child  id=4321407056 value=[324]

我的问题是:
(1) 变量值的内存地址相同,为4321407056。 但我已经改变了值,也就是把新值写入变量,为什么内存地址没有改变呢?
(2) 如果它们具有相同的内存地址,为什么它们的值不同,一个是[2],另一个是[234]?

2
https://en.wikipedia.org/wiki/Virtual_memory - user2357112
虚拟内存解释了为什么两个进程具有相同的地址,但是在赋值后地址为什么没有改变? - geckos
1个回答

2

这是两个不同的过程。由于现代系统都使用虚拟内存,应用程序中看到的地址实际上并不对应信息物理存储的位置。同一个地址可能对应不同的应用程序:堆中的某个位置、映射到磁盘文件、映射到显示设备、不存在或完全不同。

当进程分叉时,它将保留父进程的逻辑内存映射 - 否则所有指针都需要更新。但在做出更改后,该映射将指向完全不同的物理内存区域。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接