2

今日、上司と私は、私が書いたコードについて話し合っていました。私のコードは、特定の HTTP/HTTPS リンクから 3 つのファイルをダウンロードします。3 つのファイルすべてが 3 つの別々のスレッドで同時にダウンロードされるように、ダウンロードをマルチスレッド化しました。この話し合いの中で、私の上司は、古いハードウェアとソフトウェア (Windows 2000 について話している) を実行している可能性が高い人々にコードが出荷されるだろうと私に言いました。

この時まで、スレッド化されたアプリケーションが古いハードウェアでどのように拡張されるかを考えたことはありませんでした。CPU が 1 コアしかない場合、スレッドが役に立たず、パフォーマンスがさらに低下する可能性があることを認識しています。このダウンロード タスクが I/O 操作であるかどうか疑問に思っていました。つまり、API が HTTP/HTTPS サーバーからの情報を待ってブロックされた場合、その間に何らかの計算を行う別のスレッドがスケジュールされますか? 古いOSはそのようなスケジューリングを行いますか?

彼が言ったもう 1 つのこと: コードは古いマシンで実行されるため、私のアプリケーションは CPU を消費するべきではありません。彼Sleep()は、CPU を集中的に使用するタスクの後に呼び出しを使用して、他のプログラムに息抜きの余地を与えると述べました。現在、私は常にSleep()、どのプログラムでも使用がひどいという印象を受けていました。私が間違っている?使用がSleep()正当化されるのはいつですか?

ご覧いただきありがとうございます。

4

1 に答える 1

5

このダウンロード タスクが I/O 操作であるかどうか疑問に思っていました。つまり、API が HTTP/HTTPS サーバーからの情報を待ってブロックされた場合、その間に何らかの計算を行う別のスレッドがスケジュールされますか? 古いOSはそのようなスケジューリングを行いますか?

はい、彼らがやります。それは IO をブロックした冗談です。イベントがブロックされたスレッドをウェイクアップするまで、スレッドは中断され、他の計算 (スレッド) が行われます。そのため、単一のスレッドで自分でダウンロード間のスケジューリングを行うのではなく、シングル コア マシンの場合でもスレッドに分割することは完全に理にかなっています。

もちろん、ダウンロードは帯域幅に関して相互に影響するため、スレッド化はダウンロードの高速化には役立ちません:-)

彼が言ったもう 1 つのこと: コードは古いマシンで実行されるため、私のアプリケーションは CPU を消費するべきではありません。彼は、CPU を集中的に使用するタスクの後に Sleep() 呼び出しを使用して、他のプログラムにある程度の余裕を持たせると述べました。

タスクが終了した後に実際にスリープを使用しても、ここでは役に立ちません。計算を開始する前に、特定の時間の計算の後にスリープを実行する (一種のタイム スライスを実行する) と、役立つ場合があります。ただし、これは協調システム (Windows 3.11 など) にのみ当てはまります。これは、スケジューラがタイム スライスを使用して計算時間をスレッドに割り当てるプリエンプティブ システムでは役割を果たしません。ここでは、他のタスクを優先するために、CPU を集中的に使用するタスクの優先度を下げることを考えることがより重要になります...

今、私は常に Sleep() を使用するのはどのプログラムでもひどいという印象を受けていました。私が間違っている?Sleep() の使用が正当化されるのはいつですか?

これは、あなたが何をしているかに大きく依存します。おそらく数秒後に設定される特定のフラグが設定されるのを待つビジー状態を実装する場合は、CPU パワーを単に燃やすのではなく、スケジュールされたタイム スライスを放棄するために、しばらくスリープ状態になった後に設定されているかどうかを再確認することをお勧めします。設定されていないフラグをチェックしています。

現代のシステムでは、計算を遅くするだけなので、計算に Sleep を導入しても意味がありません。

スケジューリングは、OS のスケジューラに従います。彼は「全体像」を持っている人です。私の意見では、「より良くする」ためのすべてのアプローチは、スケジューラーには明らかではない特定の関係を概観できる特定のアプリケーションの範囲内でのみ有効です。

補遺: いくつかの調査を行ったところ、Windows はWindows 95からプリエンプティブ マルチタスキングをサポートしていることがわかりました。Windows NT ライン (Windows 2000 が属する) は、常にプリエンプティブ マルチタスクをサポートしていました。

于 2013-02-13T17:34:34.550 に答える