仮想CPUが4つしかない場合、どのようにして1805スレッドを作成できますか?


10

誰かが私のアクティビティモニターで、私が現在1805スレッドを持っていると言う方法を誰かが私に説明できるかどうか疑問に思っていました OS Xアクティビティモニターのスクリーンショット

しかし、私は自分のコンピューターに4つの仮想コアしかありません(つまり、4つのスレッドしか持てないはずです)。スレッド数は、CPUが実行するスレッドを決定するときにCPUによって処理されているすべてのスレッドを意味しますか?

編集:私のマシンには4つのスレッドしか存在できないと思う理由は、この答えに由来します。私の誤解は、「スレッド」という言葉が別の文脈で使用されていることに起因すると思います。


コメントは詳細な議論のためのものではありません。この会話はチャットに移動しました
bmike

回答:


24

スケジューリング

1,805のスレッドが同時に実行されることはありません。彼らはトレードオフします。1つのコアが少しのスレッドを実行してから、別のスレッドを少し実行するためにそれを確保します。他のコアも同じです。くるくると、スレッドは一度に少しずつ実行され、一度にすべてではありません。

オペレーティングシステム(DarwinおよびmacOS)の主な責任は、どのスレッドがどのコアでどのくらいの時間実行されるかをスケジューリングすることです。

多くのスレッドには実行する作業がないため、休止状態にあり、スケジュールされていません。同様に、多くのスレッドが、ストレージから取得されるデータ、ネットワーク接続の完了、データベースからのデータのロードなど、いくつかのリソースで待機している場合があります。待機するリソースのステータスを確認する以外にほとんど何もすることなく、そのようなスレッドはたとえあったとしても非常に短時間でスケジュールされます。

アプリプログラマーは、外部リソースの待機に時間がかかることがわかっている場合に、スレッドを一定時間スリープさせることで、このスケジューリング操作を支援できます。また、CPUを集中的に使用し、外部リソースを待機する必要がない「タイトな」ループを実行する場合、プログラマーはボランティアへの呼び出しを挿入して、コアを占有せずに他のスレッドを実行できるように、一時的に保留することができます。

詳細については、マルチスレッドWikipediaページを参照してください

同時マルチスレッド

あなたのリンクされた質問に関しては、スレッドは確かにここと同じです。

1つの問題は、OSによってスケジュールされたときにスレッドを切り替えるオーバーヘッドコストです。現在のスレッドの命令とデータをコアからアンロードし、次にスケジュールされているスレッドの命令とデータをロードするには、かなりの時間を要します。オペレーティングシステムの仕事の一部は、このオーバーヘッドコストを最適化するために、スレッドを適切にスケジュールできるようにすることです。

一部のCPUメーカーは、この時間を短縮して、スレッドのペア間の切り替えを大幅に高速化する技術を開発しています。インテルは彼らのテクノロジーをハイパースレッディングと呼んでいます。一般的に同時マルチスレッド(SMT)として知られています。

スレッドのペアは実際には同時に実行されませんが、切り替えは非常にスムーズで高速なので、両方のスレッドが実質的に同時のように見えます。これは非常にうまく機能するため、各コアはOSに対して仮想コアのペアとして表示されます。したがって、たとえば4つの物理コアを持つSMT対応CPUは、8コアCPUとしてOSに提示されます。

この最適化にもかかわらず、そのような仮想コア間の切り替えには、依然としていくつかのオーバーヘッドがあります。CPUを集中的に使用するスレッドが多すぎると、実行時間を要求してすべてがコアでスケジュールされるため、システムが非効率になり、1つのスレッドが多くの作業を行うことはありません。遊び場で3つのボールを9人の子供で共有するのとは対照的に、ボールで1人の子供が真剣にプレイタイムを獲得できない900 人の子供で共有するのと同じです。

したがって、CPUファームウェアには、システム管理者がマシンにスイッチを入れてSMTを無効にできるオプションがあり、一時停止する機会が非常に少ない、異常なCPUバインドのアプリを実行しているユーザーにメリットがあると判断した場合にSMTを無効にすることができます。

そのような場合、元の質問に戻ります。この特別な状況では、実際に、これらのハイパーアクティブスレッドが物理コアよりも多くないように操作を制限する必要があります。繰り返しますが、これは非常に珍しい状況であり、専門的な科学データ処理プロジェクトなどで発生する可能性がありますが、一般的なビジネス/企業/エンタープライズシナリオにはほとんど当てはまりません。


コメントは詳細な議論のためのものではありません。この会話はチャットに移動しました
bmike

また、yield()システムコールをCPUを集中的に使用するスレッドに配置する人はいません(Classic MacOSでの協調マルチタスクからのレガシーコードを除く)。スレッドがタイムスライスを使い果たすと、プリエンプティブマルチタスクは再スケジュールします。
Peter Cordes

ハイパースレッディングの説明が間違っています。ハードウェアスレッド!=ソフトウェアスレッド。これらは実行コンテキスト/論理コアです。物理コア上の両方の論理コアは、実際に同時に命令を実行します。フロントエンドはスレッド間で(各サイクルで)交替しますが、アウトオブオーダー実行コアは、同じサイクルで両方のスレッドからの命令/ uopsを実行できます。これにより、2つのスレッドからOoO実行への命令レベルの並列処理が公開され、実行ユニットに作業を提供しやすくなります(これが基本的にSMTのポイントです)。「最適化されたコンテキスト切り替え」だけではありません。
Peter Cordes


7

昔は-メモリは仮想化も保護もされておらず、どのコードもどこにでも書き込むことができました。当時、1つのスレッドから1つのCPUへの設計は理にかなっています。それから数十年で、メモリは最初に保護され、次に仮想化されました。スレッドを仮想コアと考える-データとコードの準備ができたときに、そのスレッドが実際のCPUにプッシュされる(または、スケジューリングアルゴリズムについて調査を行うPHDエンジニアと数学者がそれを呼び出すとスケジュールされる)という約束のようなもの実際の作業を行います。

ここに画像の説明を入力してください

現在、タイミングの違いにより、CPUとキャッシュは、ストレージやネットワークからデータを取得するのに比べて非常に高速で動作します。www.google.comがパケットまたはデータの2つです。そのため、実際のCPUよりもはるかに多くのスレッドが表示されます。

黒/青のタイムスケールで発生するスレッド操作を変換して1秒= 1 nsに変換する場合、私たちが気にするのは、ディスクIOが100マイクロ秒かかるようなもので、4日間で200ミリ秒のインターネットラウンドトリップです。 CPUタイムスケールで秒を数える場合は20年の遅延。10のエクササイズの多くの能力と同様に、ほとんどすべての場合-CPUは「非常に遅い」外部の世界からの有意義な作業を待つために「数か月」の間アイドル状態にあります。

投稿された画像には何も問題がないように思われるため、スレッドについて疑問に思って、何を取得しているのか誤解している可能性があります。

上部のヘッダー行にあるスレッドという単語を右クリック(コントロールクリック)すると、アプリのステータスが追加され、ほとんどのスレッドがアイドル、スリープ、実行されていない可能性が高いことがわかります。


コメントは詳細な議論のためのものではありません。この会話はチャットに移動しました
bmike

1

「CPUに4つのコアしかない場合、どうすれば290のプロセスを持つことができますか?」この回答は少し歴史的なものであり、特定の質問はすでに回答されていますが、全体像を理解するのに役立ちます。そのため、TL; DRバージョンを提供するつもりはありません。

むかしむかし(1950年代から60年代を考えると)、コンピュータは一度に1つのことしかできませんでした。それらは非常に高価で、部屋全体が埋め尽くされており、複数の人で共有することでそれらを効率的に使用する方法が必要でした。これを行う最初の方法は、ユーザーがコンピューターにタスクを送信し、それらがキューに入れられ、次々に実行され、結果がユーザーに送り返されるバッチ処理でした。それは問題ありませんでしたが、数日かかる計算をしたい場合、その間は他の誰もコンピュータを使用できませんでした。

次のイノベーション(1960年代から70年代と考えてください)は時分割でした。これで、1つのタスク全体を実行してから次のタスク全体を実行する代わりに、コンピュータは1つのタスクを少し実行してから、一時停止して次のタスクを少し実行します。したがって、コンピュータは複数のプロセスを同時に実行しているような印象を与えます。これの大きな利点は、数日かかる計算を実行できるようになったことです。計算が中断されるため、さらに長くかかることになりますが、その間、他のユーザーはマシンを引き続き使用できます。

これはすべて、巨大なメイン​​フレームスタイルのコンピュータ用でした。パーソナルコンピュータが普及し始めたとき、最初はそれほど強力ではありませんでした。個人的なものだったので、一度に1つのアプリケーションしか実行できなくても問題はありませんでした(1980年代など)。しかし、彼らがより強力になった(1990年代から現在まで)と、人々は自分のパソコンにもタイムシェアリングを求めていました。

そのため、複数のプロセスを同時に1つずつ実際に短時間実行して一時停止することで、複数のプロセスを同時に実行しているような錯覚を与えるパーソナルコンピュータができあがりました。スレッドは基本的に同じものです。結局のところ、人々は、個々のプロセスでさえ、複数のことを同時に実行しているような錯覚を与えることを望んでいました。最初、アプリケーションの作成者はそれを自分で処理する必要がありました。グラフィックの更新に少し時間をかけ、それを一時停止し、計算に少し時間をかけ、それを一時停止し、他のことをしている間に少し時間を費やします...

ただし、オペレーティングシステムはすでに複数のプロセスの管理に優れていたため、これらのサブプロセス(スレッドと呼ばれる)を管理するように拡張することは理にかなっています。これで、すべてのプロセス(またはアプリケーション)に少なくとも1つのスレッドが含まれているモデルがありますが、一部には複数または複数のスレッドが含まれています。これらの各スレッドは、やや独立したサブタスクに対応しています。

ただし、最上位レベルでは、CPUは、これらのスレッドがすべて同時に実行されているように見せかけるだけです。実際には、少しの間実行し、一時停止し、少し実行する別のものを選択します。ただし、最近のCPUは一度に複数のスレッドを実行できます。だから、中に本当の現実、オペレーティング・システムは、同時にすべてのコアの「ビットのため、他の実行、ビット、一時停止のために実行何か、一時停止」のこのゲームをプレイしています。したがって、必要に応じて(およびアプリケーション設計者が)スレッドをいくつでも持つことができますが、いつでも、実際にはいくつかのスレッドを除いて一時停止されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.