Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,os.fork()是使用写时复制还是完整复制父进程?_Python_Linux_Fork - Fatal编程技术网

在Python中,os.fork()是使用写时复制还是完整复制父进程?

在Python中,os.fork()是使用写时复制还是完整复制父进程?,python,linux,fork,Python,Linux,Fork,我希望将一个相当大的数据结构加载到进程中,然后进行fork操作,以减少总内存消耗。os.fork是否会这样工作,或者在Linux(RHEL)中复制所有父进程?如果您在*nix系统上,那么os.fork()将使用系统的fork()调用,至少在Linux中,该调用是写时复制: 请参见“注释”部分即使使用了COW,CPython也会使用引用计数并将引用计数存储在每个对象的标题中。因此,除非您对这些数据不做任何处理,否则很快就会对相关内存进行虚假写入,这将迫使系统复制数据。将其传递给函数?这是另一个参

我希望将一个相当大的数据结构加载到进程中,然后进行fork操作,以减少总内存消耗。
os.fork
是否会这样工作,或者在Linux(RHEL)中复制所有父进程?

如果您在*nix系统上,那么
os.fork()
将使用系统的
fork()
调用,至少在Linux中,该调用是写时复制:


请参见“注释”部分

即使使用了COW,CPython也会使用引用计数并将引用计数存储在每个对象的标题中。因此,除非您对这些数据不做任何处理,否则很快就会对相关内存进行虚假写入,这将迫使系统复制数据。将其传递给函数?这是另一个参考,一个
增量
,一个对原始内存的写入。是否将其存储在变量或对象属性中?一样。甚至只是在上面查找一个方法?同上。 由于各种原因,某些内置数据结构将其大部分数据与对象(例如大多数集合)分开分配。如果这些结果出现在不同的页面上——或者不管COW在做什么——你可能会很幸运。但是,从这样一个集合引用的对象并不是例外——使用它同样可以操作其refcount


此外,一些数据将被共享,因为设计没有对其进行写入(例如,本机CPython代码),并且您的
fork
'd进程不接触的某些对象可能会被共享(老实说,我不确定;我认为循环GC不会写入对象)。但是Python代码使用的Python对象实际上是可以被写入的。类似的推理也适用于PyPy、Jython、IronPython等(只是它们在对象头中摆弄位,而不是进行引用计数)尽管我不能保证所有可能的配置。

为什么您认为写叉上的拷贝可以减少内存消耗?因为子进程将共享相当大的胖静态数据结构。或者至少我猜,我想这会对奶牛有好处。但这正是我的想法。有趣的是,我想知道它是如何在windows上实现的。@AliVeli它根本没有在windows上实现(“可用性:Unix”)。POSIX标准没有提到写时复制,因此Unix系统可以自由地不使用它。另外,在非*unix系统中没有
fork
,因此您的初始语句是重言式的。