2012-04-29 4 views
1

私はPythonのマルチプロセッシングモジュールを使用しており、同じことについていくつかの混乱があります。メインプロセスと同じ、各子プロセスのメモリを示すマルチプロセッシングモジュール。

基本的に、私はいくつかのデータを最初にメインプロセスに保存します。これはトップコマンドに示すように16GB(メインメモリサイズ)です。私はこれらのデータをグローバル変数として保存しました。

このデータに対してマルチプロセッシングが実行され、それに応じて処理が異なります。

ここで、マルチプロセスはすべてのプロセスが独自のCPU使用率を持っていることがわかりますが、16 GBのすべてのプロセスのメモリは..なぜですか?グローバル変数を参照して渡すメモリと同じメモリを使うべきではないですか。いくつか考えてください。

topコマンドの出力はfollows.:-

PIDユーザPR NI VIRT RES SHR S%のCPU%MEM TIME +コマンド 13908管理20 0 16.7グラムの16グラム848 R 100.0 17.3 0通りである:32.92をパイソン
13429管理20 0 16.7グラム16グラム3336 S 0.0 17.3 15:06.97パイソン
13910管理20 0 16.7グラム16グラム848 R 100.3 17.3 0:32.94パイソン
13911管理20 0 16.7グラム16グラム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管理20 0 16.7グラム16グラム796 R 100.0 17.3 0:33.06パイソン
13909管理20 0 16.7グラム16グラム796 R 99.6 17.3 0:32.93

+0

あなたは 'man fork'を読むべきです。 –

答えて

2

は周りだけで構文砂糖としてマルチプロセッシングモジュールについて考えパイソンos.fork()。

今、フォークとは何ですか?プロセスがフォークすると、オペレーティングシステムは新しいプロセスIDを持つ新しい子プロセスを作成し、親プロセスの状態(メモリ、環境変数など)を複製します。

2

multiprocessingモジュールによって生成された各プロセスは、別々のアドレス空間にあります。元のプロセスが持っていたすべての物理メモリと仮想メモリは、少なくともであり、論理的にはとなります。新しいものが作成された後は新しいものとは独立していますが、最初は新しいプロセスは古いものと完全に重複しています。したがって、それぞれは、オリジナルと同じ仮想サイズ(16.7 GB)を持ちます。

実際の基本物理ページは、「コピーオンライト」を使用してできるだけ共有されます。さまざまなコピーが実行され、仮想メモリに変更が加えられると、カーネルは必要に応じて基礎となる物理ページをコピーします。書き込まれないメモリは、すべてのコピー間で共有できます。だから、たとえ各プロセスがたくさんのRAMを詰まらせているように見えても、実際はそうではありません。つまり、それぞれのプロセスで16 GBのデータのほとんどが変更された場合、それらはすべて個別のコピーを持ち、より多くの物理RAMを使用します。

multiprocessingモジュールでは、変更を共有したい場合(ただし、ロックの仕組みについては、ドキュメントを参照してください)、データを共有するいくつかの方法があります(http://docs.python.org/library/multiprocessing.htmlの「共有メモリ」を参照)。


脚注:フォークまたはクローンシステムコールの後、元のクローンとクローンの間には1つの小さな違いがあります。元のクローンはIDを取得し、クローンはゼロを返します。

関連する問題