多处理模块显示与主进程相同的每个子进程的内存。

时间:2012-04-29 02:26:56

标签: python linux memory-management

我正在使用python的多处理模块,并且对此有一些混淆。

基本上,我最初在Main进程中存储了一些数据,大约是16GB(主内存大小),如top命令所示。我已将这些数据存储为全局变量。

然后对这些数据进行多处理,并相应地进行相应处理。

现在我看到正在进行多处理,即所有进程都有自己的CPU利用率,但所有进程的内存各占16 GB ..为什么如此。是不是应该使用通过全局变量的引用传递的相同内存..请一些想法。

top命令的输出如下: -

  

PID用户PR NI VIRT RES SHR S%CPU%MEM TIME + COMMAND   13908 admin 20 0 16.7g 16g 848 R 100.0 17.3 0:32.92 python
  13429 admin 20 0 16.7g 16g 3336 S 0.0 17.3 15:06.97 python
  13910 admin 20 0 16.7g 16g 848 R 100.3 17.3 0:32.94 python
  13911 admin 20 0 16.7g 16g 840 R 100.0 17.3 0:33.02 python
  13912 admin 20 0 16.7g 16g 836 R 99.6 17.3 0:33.00 python
  13907 admin 20 0 16.7g 16g 796 R 100.0 17.3 0:33.06 python
  13909 admin 20 0 16.7g 16g 796 R 99.6 17.3 0:32.93 python

2 个答案:

答案 0 :(得分:2)

将多处理模块视为os.fork()的语法糖。

现在叉子是什么?当进程分叉时,操作系统使用新的进程ID创建一个新的子进程,复制父进程的状态(内存,环境变量等)。

答案 1 :(得分:2)

multiprocessing模块生成的每个进程都在一个单独的地址空间中。在创建新进程之后,原始进程所拥有的所有物理和虚拟内存至少逻辑独立于新进程,但最初每个新进程都是完全重复的(嗯,请参阅脚注)。旧。因此,每个都将具有与原始虚拟大小相同的虚拟大小(16.7 GB)。

使用“copy-on-write”尽可能地共享实际的底层物理页面。当各种副本运行并对其虚拟内存进行更改时,内核将根据需要复制基础物理页面。永远不会写入的内存可以在所有副本之间共享。因此,尽管每个进程似乎都在攫取大量内存,但事实并非如此。如果你写它的大部分,但是,如果每个单独的进程改变了大部分16 GB的数据 - 那么它们将都有单独的副本,并使用更多的物理RAM。

multiprocessing模块确实提供了一些共享数据的方法(请参阅http://docs.python.org/library/multiprocessing.html中的“共享内存”部分),如果您希望它们共享修改(但是请考虑锁定是如何工作的;请参阅文件)。

<小时/> 脚注:在fork或clone系统调用之后,原始版本和克隆版本之间存在一个微小的差别:原始版本获取克隆的ID,并且克隆返回数字零。