各 CPU コアは一度に 1 つまたは 2 つのスレッドを処理できるため、複数のスレッドが実行されている場合でも OS が安定するのはなぜですか?

各 CPU コアは一度に 1 つまたは 2 つのスレッドを処理できるため、複数のスレッドが実行されている場合でも OS が安定するのはなぜですか?

さらに説明すると、ハイパースレッディングのないデュアルコア CPU があるとします。つまり、一度に処理できるのは 2 つのスレッドだけです。では、2 つのバックグラウンド ネットワーク スレッドを実行しているネットワーク アプリケーションがあるとします。各スレッドは、処理する着信接続を待機しているため、これらのスレッドは常に実行されているはずです。では、他の OS のプロセスとスレッドはまだ動作しているのはなぜでしょうか。私の考えでは、2 つのスレッドがネットワーク着信接続を待機しているために CPU 処理ユニットを完全に使い果たしているため、処理できないようです。したがって、各スレッドはナノ秒ごとに接続の準備ができている必要があります... これはどのように発生し、動作するのでしょうか。CPU は、目立ったフリーズなしに、一度に多数のスレッドを処理できるのでしょうか。(一度に多数の重いプログラムを実行すると、Windows が遅くなったり、おかしくなったりすることはありますが、これは一般的な問題ではありません)

ありがとう。

答え1

答えは比較的簡単です。スレッドが I/O イベントを待機しているとき、残りのタイム スライスを OS に渡し、OS は別のスレッドをスケジュールできます。高レイテンシの I/O が完了すると、スレッドは実行準備完了としてマークされます。

これが可能になるのは、ほとんどの I/O が、I/O 要求が完了したかどうかを繰り返し確認するのではなく (ポーリングと呼ばれる)、割り込みによって管理されるためです。

答え2

協調型マルチタスクを使用していて、プログラムが不良である場合: はい、その通りです。

しかし、現実の世界では次のことが起こるはずです。

  1. 協調型マルチタスク: I スレッドは CPU を永久に使い続けるわけではありません。その代わり、しばらくしてから、またはブロックされたときに、別のプログラムにチャンスを与えます。Paul
    の回答では後者について説明しています。

  2. プリエンプティブ マルチタスク (ほぼどこでも使用されています): OS (プログラムではありません) が CPU を短時間プログラムに渡し、その後 CPU を奪います。これは、タイマーを実行して、期限が切れるとプロセスを停止し、待機している次のスレッド/プログラムに渡すという単純なものです。


あなたの場合、2 人の従業員と 3 つ (またはそれ以上) のタスクがあるオフィスと考えてください。 (タスク A、タスク B、タスク C と呼びます)。

最初の作業では、次のような監督者の指示を確認します。

  • タイマーを 10 分に設定します。タイマーが鳴ったら、現在のタスクの作業を中止し、そのタスクを TODO リストの一番下に置いて、このドキュメントを読み続けます。
  • 次に、TODO リストの先頭から最初の項目を削除し、作業を開始します。
  • 繰り返す。

ワーカー 1 はタイマーを設定し、TODO リストの最初のタスク (この場合はタスク A) を取得します。

ワーカー 2 も同じことを行います。タイマーを設定し、TODO リストの一番上から現在のものを取得します。ワーカー 1 がタスク A を削除したため、ワーカー 2 はタスク B を開始します。

10 分後、タイマーが鳴ります。作業者 1 はタスク A の作業を停止し、監督者の指示を受け取ります。その指示では、現在のタスクを TODO リストの一番下に置くように指示されています。監督者の指示に従い、タイマーが再開され、現在 TODO リストの一番上にあるタスク (タスク C) の作業が開始されます。

ワーカー2も同様にタスクBを停止し、TODOリストの先頭(この例ではタスクA)から開始します。

などなど。

これは多少簡略化されていますが、2 人のトレッド (作業者) が 3 つ以上のタスクを 100% の時間で処理できる仕組みがわかると思います。

実際のスケジューラには、他にも多くのものがあります。たとえば、割り込み (タスクの途中で電話が鳴った場合の処理​​方法と比較)、スマート スケジューリング (同じタスクを同じ作業者に与えると、作業者は既にそのタスクに慣れているため、タスクがより早く完了する可能性が高くなります)、I/O (作業者が図書館から本を必要とする場合、タイマーが切れるまで待たずに、すぐに次のタスクを続行する、など)。

答え3

OS は、異なる CPU で複数のスレッドが実行されている場合とほぼ同じ方法で安定します。CPU コアの外部から見ると、同じコア内の 2 つの LP と、2 つの異なるコアにそれぞれ 1 つの LP がある場合の動作に明らかな違いはほとんどありません。セマフォなどの同じ「マルチプロセッサ対応」プログラミング手法はすべて、どちらの場合も使用する必要があります。

関連情報