1

一般的な質問があります:

私のプログラムは、ユーザー入力やシステム リソース (プリンターなど) を必要としない処理を続行します。つまり、私のプログラムは、CPU 時間以外のリソースを待機しません。

同じプログラム (ジョブとしましょう) が複数のユーザーによって開始される場合があります。

この場合、これをスレッドで実行する価値はありますか (つまり、各ユーザーは自分のジョブが遅延なく実行されていると感じます。それとも、ジョブを順番に実行する方がよいでしょうか?

個別のスレッドとして実行する場合の問題は、同時に実行するスレッドが多すぎて CPU 使用率が 100% を超えることです。

提案してください。ユーザーが自分のジョブの進行状況を確認できないとします。ユーザーは仕事が終わっても心配ありません。しかし同時に、ジョブの実行で CPU をビジー状態にしたいと考えています。

4

4 に答える 4

1

プロセスにかかる時間が気にならない場合、またはプロセスにかかる時間が許容できる場合は、1 つのスレッドを使用するのが最も簡単な解決策である可能性があります。たとえば、多くの GUI アプリケーションは、イベント処理スレッドを 1 つしか使用しません。

すべての CPU をビジー状態に保ちたい場合は、多くのビジー ループを開始して、すべての CPU を最大限に活用することができます。

通常必要なのは、より多くの CPU を使用してレイテンシーを短縮するか、スレッドプットを改善することです。これが目標でない限り、より多くの CPU を使用しても役に立ちません。

于 2012-06-26T13:42:10.297 に答える
0

あなたのプログラムにはメモリアクセスが必要だと思います。メモリアクセスが遅い可能性があり、その時点でプロセッサを実行する必要があります。同時に実行されるスレッドの数を制限する一般的な解決策は、スレッドプールを使用することです。

于 2012-06-26T13:40:22.997 に答える
0

この場合、これをスレッドで実行することは十分に価値があります(つまり、各ユーザーは自分のジョブが遅滞なく実行されていると感じます。それとも、ジョブを順番に実行する方がよいでしょうか?

それは仕事に大きく依存します。インタラクティブな場合は、すぐに実行すると、ユーザーにより良いインターフェースが提供されます。応答の速度が問題にならない場合は、マルチスレッドプログラムを作成するための複雑なコストを負担したくない場合があります。

別々のスレッドとして実行する場合の問題は、同時に実行するスレッドが多すぎるため、CPU使用率が100%を超えることです。

私はこれについて心配しません。複数のスレッドを使用する理由の1つは、複数のプロセッサーを使用して、実際にジョブをより高速に実行できることです。この場合、OSによっては、フルCPUを超えて使用している場合、実際にはプロセスの負荷が100%を超えることがあります。これは予想されることです。また、CPUが100%を超えた場合、アプリケーションがより重要なアプリケーションからサイクルを奪うことを心配しない限り、オペレーティングシステムはそれを正常に処理します。

于 2012-06-26T13:40:56.777 に答える
0

スレッドが本当に純粋にCPU バウンドである場合、処理に使用できるコア (または仮想コア) よりも多くのスレッドを作成しても意味がありません。したがって、クアッドコア マシンでは、4 つ以下のスレッドを作成してください (マシン上で実行されているのはプロセスだけではないため、おそらく 3 つだけです)。ハイパースレッディング (コアごとに 2 つの仮想スレッド) を備えたクアッドコア マシンでは、6 つまたは 7 つ作成する場合があります。あまりにも多くの追加スレッド (たとえば、数百) を作成すると、不要なコンテキスト切り替えが発生し、やりすぎるとコストが高くなる可能性があります。

逆に言えば、マルチコア マシンでは、1 つのスレッドは 1 つのコアでしか実行できません。したがって、クアッドコア マシンでは、ジョブを 1 つのスレッドで順次実行すると、CPU 容量の 25% しか使用されません。

そのため、使用可能なコアの数までジョブを並行して実行し、それを超えて (各コアで) 順番に実行します。

大きな注意点: 走行距離は異なる場合があります。この方程式には、マシンで他に何が起こっているか、特にジョブが実際に CPU バウンドかどうか (CPU や I/O サブシステムなどのシステムバウンドではなく) など、多くの入力があります。

于 2012-06-26T13:39:51.330 に答える