1

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

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

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

マルチプロセッシングが行われていることがわかります。つまり、すべてのプロセスに独自のCPU使用率がありますが、すべてのプロセスのメモリはそれぞれ16GBです。なぜそうなのですか。グローバル変数を参照してパススルーするのと同じメモリを使用する必要がありませんか。考えてみてください。

topコマンドの出力は次のとおりです。:-

PIDユーザーPRNIVIRT 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

4

2 に答える 2

3

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

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

モジュールは、データを共有するいくつかの方法を提供します ( http://docs.python.org/library/multiprocessing.htmlmultiprocessingの「共有メモリ」セクションを参照) 変更を共有したい場合 (ただし、ロックがどのように機能するかを考えてください) ; ドキュメントを参照してください)。


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

于 2012-04-29T02:53:36.633 に答える
2

マルチプロセッシング モジュールは、os.fork() の単なるシンタックス シュガーと考えてください。

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

于 2012-04-29T02:53:34.087 に答える