質問

並列処理を実現するために、アプリケーション内でスレッドを使用するか、別のプロセスをまとめて作成するかを決定する方法。

役に立ちましたか?

解決

スレッドはより軽量であり、利用可能なすべての CPU またはコアを利用するためだけに複数の「ワーカー」を作成する場合には、スレッドの方が適しています。

ほとんどのサーバーと同様に、ワーカーをより適切に分離し、より堅牢にする必要がある場合は、ソケットを使用します。1 つのスレッドがひどくクラッシュすると、通常、そのプロセスで動作している他のスレッドを含むプロセス全体がダウンします。プロセスが悪化して停止しても、他のプロセスには影響を与えないため、何事もなかったかのように喜んで業務を続行できます。

他のヒント

プロセスにはより分離されたメモリがあります。これはさまざまな理由から重要です。

  • 単一のタスクが他のタスクをクラッシュさせることはより困難になります。
  • プロセスごとに使用できるメモリが増えます。これは、Apache などの大規模で高性能なアプリケーションや Postgres などのデータベース サーバーにとって重要です。これは、割り当てられたメモリとメモリ マップされたファイルの両方にとって重要です。

並列処理の程度は主に、マシンで利用可能な物理プロセッサ/コアによって決まります。シングルプロセッサ/コアのマシンを使用している場合、プロセスを分離するとオーバーヘッドが大きくなりすぎる可能性があります。この場合、通常はスレッドが優先されます。

複数のコア/CPU がある場合、各プロセス/スレッドの動作に応じて、オーバーヘッドが正当であればプロセスを選択できます。プロセスは明らかにスレッドよりもメモリ分離のレベルがはるかに優れていますが、同時に Windows ではプロセスはスレッドに比べてかなり重いです。

もちろん、スレッドは同じプロセスでデータを共有できますが、破損状態を防ぐために、共有データへのアクセスを同期する必要があります。プロセス間でのデータ共有はより複雑で、名前付きパイプ、カスタム ソケットベースの通信、リモート フレームワークの使用、共有ファイル/データベースなどの使用メカニズムに応じてオーバーヘッド (単純なスレッド同期よりも大きくなります) が発生します。

一般に、個々の実行ストリームがグローバル データを共有する必要がなく、それぞれを相互から保護したい場合は、プロセスを使用する必要があります。

決定に役立つリンクがいくつかありますので、ご活用ください。

http://blog.labnotes.org/2006/08/29/why-processes-scale-better-than-threads/ http://www.jroller.com/cpurdy/entry/fastcgi_not_so_fast

Windows では、プロセスの作成はスレッドよりも重くなります。したがって、小さなタスクがいくつかある場合は、スレッドまたはスレッド プールの方が適しています。または、プロセス プールを使用してプロセスをリサイクルします。また、プロセス間で状態を共有することは、スレッド間で状態を共有するよりも手間がかかります。しかし、また次のようになります。スレッドはプロセス全体を不安定にし、他のスレッドもダウンさせる可能性があります。そのようなことが起こる可能性を最小限に抑えたい場合は、別のプロセスを使用することもできます。.Net の AppDomain は、両方の中間点となる可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top