2017-11-24 20 views
-2

Windows上で外部実行可能ファイルを実行する必要があるマルチスレッドアプリケーションがあるとします。複数のスレッドでCGIスクリプトを呼び出すApacheの場合の最良の例。`CreateProcess`は本当にスレッドセーフですか?

CreateProcessドキュメントには、使用制限に関する情報は含まれていません。したがって、スレッドセーフであると考えられます。

CreateProcessを使用してcl.exeコマンドを複数のスレッドで実行するプログラムを作成できます。プログラムが行う唯一の仕事は100スレッドの作成で、各スレッドはcl.exeを実行し、1秒間スリープします。このプログラムを10分間実行するので、cl.exe 600 * 100 = 60000回実行されます。通常はcl.exeが正常に実行されますが、CreateProcessが返され、0が返されます。GetLastErrorが返されます。8. Microsoftから8 = ERROR_NOT_ENOUGH_MEMORY。私のシステムには24 GBのメモリがあり、このメモリの40%しか使用していないため不可能です。したがって、エラーは間違っています。

これで、1000スレッドで同じプロセスを実行しましたが、ほとんどすべてCreateProcess呼び出し結果が偽のERROR_NOT_ENOUGH_MEMORYになります。

この問題は、私たちがを毎回1つのスレッドで呼び出すことを確実にすると消えます(私はstd::mutexでそれを行います)。

CreateProcessはスレッドセーフであると思いますが、mutexを使用して単一スレッドでCreateProcessを呼び出すマルチスレッドアプリケーションで子プロセスを作成する方が効果的ですか?

+0

これは関連性があります:http://www.devsuperpage.com/search/Articles.aspx?G = 2&ArtID = 4598 – NPE

+3

CreateProcessはスレッドセーフです。あなたは32ビットアプリケーションを実行していますか?あるいは、あなたがシステムを激しく打つと疲れてしまうかもしれない他の多くのリソースがあります。そして、あなたが大量のコアを産み出さなければ、多くのCLが生産性を失うことがない限り。 –

+1

これは、多くのスレッドやプロセスで発生する可能性のある問題の一部を説明するのにも役立ちます。 https://blogs.technet.microsoft.com/markrussinovich/2009/07/05/push-the-limits-of-windows-processes-and-threads/ –

答えて

0

メモリ内のすべてのバイトが似ていると仮定しています。つまり、1つの大きなプールを形成しています。これはWindowsでは正しくありません。

主な部分は、ページプールと非ページプールです。ページプールには、必要に応じてディスクにページングできるコードとデータが格納されます。非ページプールをディスクにページすることはできません。たとえば、ページングを処理するOSの不可欠な部分をディスクにページすることはできません。どのようにページングするのですか?ここでは、一方のプールは空にできますが、もう一方のプールにはまだ空きがあります。

もう1つの限られたリソースは、物理メモリと仮想メモリ間のマッピングに使用されるRAMです。明らかに、あなたのすべてのプロセスで、あなたはそれをたくさん使っています。各プロセスには独自のアドレス空間があります。それが32ビットのclプロセスであると仮定しましょう。それは百万ページの形式で4GBのアドレス空間を持っています。あなたの60Kプロセスは一緒に60 アドレス空間のページを取る。これらのページのほんの一部はcl.exeの共有コピーですが、これらのページのそれぞれには物理RAMへの64ビットのポインタが必要です。

ここに表示されているのはちょっとおかしなことです。単一の4096バイトページへの60000 * 8 = 480.000バイトのポインタを持つことができます。これは、単純なメモリ統計が余計に誤解を招く原因となる、まれな状況です。実際のコンテンツの4096バイトを数えるだけであれば、必要なメモリは約100分の1に過小評価されます。

+0

システムのメモリが不足し、空きメモリが55%であると説明していますか?次に、あなたは私が書いたものを読まなかった。誰も60Kプロセスを並行して実行しません。 1000台まで60Kは、そのようなプログラムがどれくらい一分間にどれくらいの時間を創り出すかということですプログラムは毎秒プロセスを実行し、その終了を待ちます。 100個のプロセスが並行して実行されている場合でも、メモリ不足が表示されます。 – Vitaliy

関連する問題