9

並行して実行する必要のあるタスクが2つ(3つ、4つなど)あると想像してください。さて、これを行う簡単な方法は、別々のスレッドを作成してそれを忘れることです。しかし、昔ながらのシングルコアCPUでは、多くのコンテキストスイッチングを意味します。コンテキストスイッチングが大きく、悪く、遅く、一般的には単に悪であることは誰もが知っています。避けるべきですよね?

その点で、とにかくソフトウェアをゼロから作成している場合は、さらに一歩進んで、独自のタスク切り替えを実装することができます。各タスクを部分に分割し、その間の状態を保存してから、単一のスレッド内でタスクを切り替えます。または、複数のCPUコアがあることを検出した場合は、各タスクを別々のスレッドに渡すだけで、すべてうまくいくでしょう。

2番目のソリューションには、使用可能なCPUコアの数に適応できるという利点がありますが、手動のタスク切り替えは、OSコアのものよりも本当に高速ですか?TaskManager特に、全体をaやanITaskなどで一般的にしようとしている場合はどうでしょうか。

明確化:私はWindows開発者なので、主にこのOSの答えに興味がありますが、他のOSについても知ることが最も興味深いでしょう。答えを書くときは、それがどのOSであるかを述べてください。

さらに明確にする:わかりました。したがって、これは特定のアプリケーションのコンテキストではありません。これは本当に一般的な質問であり、スケーラビリティについての私の考えの結果です。アプリケーションを拡張して、将来のCPU(および現在のさまざまなCPU)を効果的に利用したい場合は、マルチスレッドにする必要があります。しかし、スレッドはいくつですか?一定数のスレッドを作成すると、プログラムは、同じ数のコアを持たないすべてのCPUで最適に実行されません。

スレッドの数は実行時に決定されるのが理想的ですが、実行時に任意の数の部分に実際に分割できるタスクはほとんどありません。ただし、多くのタスクは、設計時にかなり大きな一定数のスレッドに分割できます。したがって、たとえば、私のプログラムが32スレッドを生成できる場合、それはすでに最大32コアのCPUのすべてのコアを利用しますが、これはまだかなり先のことです(私は思います)。しかし、単純なシングルコアまたはデュアルコアCPUでは、コンテキストスイッチングが大量に発生するため、処理速度が低下します。

したがって、手動タスク切り替えについての私の考え。このようにして、32個の「仮想」スレッドを作成し、それを最適な数の実際のスレッドにマップし、「コンテキスト切り替え」を手動で行うことができます。問題は、手動の「コンテキスト切り替え」のオーバーヘッドは、OSコンテキスト切り替えのオーバーヘッドよりも少ないのでしょうか。

当然、これはすべて、ゲームのようにCPUにバインドされたプロセスに適用されます。ありふれたCRUDアプリケーションの場合、これはほとんど価値がありません。このようなアプリケーションは、1つのスレッド(最大2つ)で作成するのが最適です。

4

3 に答える 3

6

OSカーネルがまだ他のプロセスを切り替えているため、手動のタスク切り替えがどのように高速になるかわかりません。時期尚早の最適化であり、多大な労力の無駄になる可能性があるようです。

システムが他に何もしていない場合は、膨大な数のコンテキスト スイッチが発生しない可能性があります。スレッドはそのタイムスライスを使用し、カーネル スケジューラは他に何も実行する必要がないことを確認し、すぐにスレッドに切り替えます。また、OS は CPU 間でスレッドを移動しないように最善を尽くすため、キャッシュを使用するとメリットがあります。

本当に CPU バウンドの場合は、CPU の数を検出し、その数のスレッドを開始します。ほぼ 100% の CPU 使用率が表示されるはずです。そうでない場合、完全に CPU バウンドというわけではなく、おそらく答えは N + X スレッドを開始することです。非常に IO バウンドのプロセスの場合、CPU 数の (大きな) 倍数を開始することになります (つまり、トラフィックの多い Web サーバーは 1000 以上のスレッドを実行します)。

最後に、参考までに、Windows と Linux の両方のスケジューラーはミリ秒ごとにウェイクアップして、別のプロセスを実行する必要があるかどうかを確認します。そのため、アイドル状態のシステムでも、1 秒あたり 1000 回以上のコンテキスト スイッチが発生します。負荷の高いシステムでは、CPU ごとに 1 秒あたり 10,000 を超えるエラーが発生しましたが、大きな問題はありませんでした。

于 2010-05-12T18:13:14.160 に答える
5

私が見ることができる手動切り替えの唯一の利点は、切り替えが発生する場所とタイミングをより適切に制御できることです。もちろん、理想的な場所は、作業単位が完了したで、すべてをまとめて破棄できるようにすることです。これにより、キャッシュ ミスを回避できます。

これに労力を費やさないことをお勧めします。

于 2010-05-08T16:09:12.960 に答える
3

シングルコアの Windows マシンは今後数年で消滅するので、私は通常、マルチコアが一般的であるという前提で新しいコードを作成します。ハードウェアが提供する同時実行性を、現在および将来にわたって自動的に処理する OS スレッド管理を採用することをお勧めします。

あなたのアプリケーションが何をするのかはわかりませんが、複数のコンピューティング バウンド タスクがない限り、ほとんどのアプリケーションでコンテキスト スイッチが重大なボトルネックになるとは思えません。タスクが I/O でブロックされている場合、OS を凌駕しようとしてもあまりメリットが得られません。

于 2010-05-08T15:51:50.900 に答える