スレッドを使用するか、アプリケーションで完全に別のプロセスを作成して並列処理を実現するかを決定する方法。
6 に答える
スレッドはより軽量であり、利用可能なすべてのCPUまたはコアを利用するためだけに複数の「ワーカー」を作成するには、スレッドを使用する方が適しています。
ほとんどのサーバーのように、ワーカーをより分離して堅牢にする必要がある場合は、ソケットを使用します。1つのスレッドがひどくクラッシュすると、通常、そのプロセスで動作している他のスレッドを含むプロセス全体が停止します。プロセスが酸っぱくなり死んでも、他のプロセスには触れないので、何も起こらなかったかのように忙しさを楽しく続けることができます。
プロセスには、より分離されたメモリがあります。これは、いくつかの理由で重要です。
- 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のAppDomainsは、両方の中間にある可能性があります。