12

Windows 8で新しいタスクマネージャーを使用すると、驚いたことに、現在使用されている/実行されているスレッドが約1kであることに気付きました。

iveは、マルチスレッドソフトウェアとゲームの背後にあるチュートリアルと理論に共鳴して触れただけです。ソフトウェアから最高のパフォーマンスを引き出したい場合は、実行する作業があるときに、論理プロセッサごとに少なくとも1つのスレッドが必要であると想定しました。そうでなければ、そのプロセッサは「未使用」になるからです。

しかし、私はすでに約1000のスレッドを実行しているので、すべてのプロセッサがすでに何かに取り組んでいるのではないでしょうか。

処理能力が他の50ほどのプロセスによってすでに使用されているのに、なぜマルチスレッドなのですか?これらの1000スレッドすべてを管理するには、CPUが十分に必要ですか?プログラマーとして、オペレーティングシステムではなくスレッドを処理する必要があるのはなぜですか?それが各プロセスに1つのスレッドを与える場合、私のソフトウェアはまだ「マルチスレッド」ではないでしょうか。

より多くのスレッドを使用することは、プロセスに優先順位を付けるためのより優れた方法にすぎませんか?

4

3 に答える 3

24

おそらくそうではないでしょう。この質問は少し修辞的ですが、ジェフリー・リッチターによるこの記事/本の抜粋を見てください、狂気を止めてください(本CLRからC#経由で)。それはあなたが尋ねるそれらのことだけを議論します。

私たちが気にしたのが生のパフォーマンスだけだった場合、任意のマシンに必要なスレッドの最適な数は、そのマシンのCPUの数と同じです。[...]すべてのスレッドには、カーネルオブジェクト、カーネルモードスタック、およびその他のリソースが割り当てられています。スレッドが安価であるためにスレッドを作成するというこの傾向は止めなければなりません。スレッドは安くはありません。むしろ、高価なので、賢く使用してください。

その本を強くお勧めします。かなり大きいですが、前から後ろまで読む価値があります。約900ページです。

マルチスレッドは非常に複雑なテーマであり、数行で簡単に答えることはできませんが、達成しようとしていることに大きく依存します。いつものように、それは状況によって異なり、最適なパフォーマンスを得るには、ソリューションを測定/評価/最適化する必要があります。ただし、スレッドを定期的にディッシュすることは、一般的にはおそらく良い考えではありません。ちなみに、マネージスレッドは1 MBのスタックメモリを割り当てます。つまり、.NETアプリケーションでスレッドを作成(および保持)することは非常に無駄になる可能性があります。

また、トレッドが存在するからといって、それが完全なコアを消費していることを意味するわけではありません。それはいくつかの仕事をするかもしれませんが、それはまたアイドル状態になっていくつかの仕事が来るのを待つかもしれません(これは最もありそうなケースです、さもなければあなたの全体的なCPU消費は常に0より100に近くなります)。ただし、それらシステムリソースを浪費します。

スレッドを導入すると、それらを使いやすくするために多くの手法が導入されていますが(さまざまな並列フレームワークなど)、アプリケーションにかなりの複雑さが加わります。根本的な複雑さはまだそこにあり、時には無害なふりをしますが、常にその真の性質(タイミングの問題、デッドロック、デバッグの複雑さなど)に突入する準備ができています。

つまり、「理由がない限り、複数のスレッドを使用しないでください」と言うかもしれません。
それでも、t(h)は軽く読みます。

于 2013-02-20T19:20:53.213 に答える
8

私はジョコブの答えが好きで、重要な点のほとんどはすでになされていると感じています。

  • 1kスレッド(グローバル)は、完全に実行されていることを意味するわけではありません。
  • 一般に、システム内のスレッドのグローバル数について考えることは非常に誤解を招きます(以下の説明を参照)
  • スレッドは(だけでなく)並列プログラミングに使用されます。複数の実行行が必要な状況で使用されます(たとえば、ネットワーク応答の待機をブロックしたが、UIを更新して応答性を維持する必要がある場合など)。 、または同じプロセスで優先度の低いタスク(スペルチェック、コード検査など)がある場合、...)。結局のところ、スレッドは存在し、マルチコアCPUよりずっと前から有用でした。
  • しかし今では、「狂気」がよく見られます。スレッドが多すぎます。これは新しいことではありません。初期のネットワーク(Web?)サーバーが接続ごとに1つのスレッド(!)である最初のケースの1つです。愚かな、無駄。続けて、スレッドプール(およびI / O完了ポートなどのより洗練されたもの)と(最近では)非同期プログラミングを使用しています。

ただし、スレッドプールの場合でも、スレッドの数はプロセスごとです(Windows2000以降で使用可能なシステムスレッドプールを使用している場合を除く)。したがって、それぞれが4コアシステムから最大の利点を活用したい50のプロセスがある場合、グローバルに200スレッドの妥当な数があります(通常、スレッドプールには、I/Oブロックと考慮に入れてください)。

これは当然のことであり、OS全体ではなく、プロセスごとに考える必要があります。すべてのプロセスで、ハード制限のある集中型スレッドプールを使用するとどうなるかを考えてください。1つのアプリケーションがそれらすべてを使用するとします。どのような選択肢がありますか?いいえ、OS全体に厳しい制限を設けることはできません。各アプリケーションは基本的に独自のものです。これは、NTやLinuxのように、分離されたプロセスと仮想のプライベートアドレス空間に基づく「最新の」(1990年代)OSによって実施されるモデルです。メモリの場合のように強制されます)

于 2013-02-28T13:33:08.313 に答える
0

簡単に言うと、オペレーティングシステムを使用すると、すべてのアプリケーションが独自のマシン(コンピューター)で実行されているように感じられます。たとえば、32ビットアプリケーションには理論上4GBのメモリがありますが、物理コンピュータには2GBがあります。OSは、これを提供するためにタイムシェアリング多重化などの技術を使用しています。このメカニズムを使用すると、この1Kスレッドを監視できます。(28人のユーザーが接続しているターミナルサーバーで72Kを見ました。)スレッドの作成は高価であるため、プログラマーは一度だけスレッドを作成し、ミューテックス、セマフォなどのメカニズムを介してタスクが実行されるとスレッドをスリープ状態にします...

これは、多くのスレッドと1%のCPU使用率が表示されるためです。スレッドが使用したCPUリソースの量を確認したい場合は、スレッドまたはアプリケーションのCPU時間を確認してください。これにより、何が起こっているかについてより多くの手がかりが得られます。

于 2013-03-02T23:12:29.333 に答える