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


0

さらに説明すると、ハイパースレッディングのないデュアルコアCPUがあるとします。つまり、2つのバックグラウンドネットワークスレッドを実行し、それぞれが着信接続を待機しているネットワークアプリケーションがあるとします。処理するために、これらのスレッドは常に実行されているはずですが、今、別のOSのプロセスとスレッドがまだ機能しているのはなぜでしょうか。私には見えますが、2つのスレッドが完全にCPU処理装置を使い果たしているため、それらは処理できません。 ... それはどのように起こり、機能しますか?目立った凍結なしに、CPUはどのようにして多数のスレッドを一度に処理できますか。 (一度にたくさんの重いプログラムが実行されると、ウィンドウが遅くなってクレイジーになることがありますが、それは一般的な問題ではありません)

ありがとう。


1
OSがスケジューリングを処理するため
Ramhound

回答:


5

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

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


スレッドは待機中でも実行中でもかまいませんが、両方を同時に実行することはできません。
David Schwartz

@DavidSchwartz同期I / Oでは、「書き込みがI / Oイベントを待つのではなく」次のI / Oデータを「より正確に書き込める」という要求が発生し、OSはより多くのデータがあるまでスレッドをスケジュール解除できます。利用可能です "#:。非同期I / Oを使用しても、スレッドはI / Oを待機していますが、待機中は実行されたままになります(ユーザーがコンピュータの使用中に電子メールを待機している場合など)。 (コールバック関数を使用すると、スレッドはできるだけ早く新しいデータを処理できます。または、粒度の粗いポーリングを使用して、作業単位が完了した後に新しいデータを確認します。)
Paul A. Clayton

従来のポーリングでは、スレッドは両方とも待機しています(ポーリングループには有用な作業が含まれている可能性がありますが(必ずしもロック待機ループではありません))。ハードウェア管理イベント(x86のMONITOR / MWAITなど)では、スレッドは実行中(OSの観点)と待機中(ハードウェアの観点)になります。粒度の粗いハードウェアマルチスレッドでは、I / Oレジスタの読み取り(従来はキャッシュできません)によって、ハードウェアスケジューラが実行中のOSの観点からまだスレッドを切り替える可能性があります。
Paul A. Clayton

2

協調的マルチタスクを使用していて、悪いプログラムがある場合は、そのとおりです。

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

  1. 協調的マルチタスキング:私は、CPUを永遠に使い続けることはしません。代わりに、しばらくしてから、またはブロックされたときに、別のプログラムにチャンスを与えます。
    パウロの答えは後者を説明しています。

  2. プリエンプティブマルチタスキング(どこでも使用されている):OS(プログラムではない)がプログラムに短期間CPUを渡してから取り除きます。これはタイマーを実行するのと同じくらい単純であり、一度それが期限切れになるとプロセスを停止して待機中の次のトレッド/プログラムにそれを渡すことです。


あなたの場合、それを2人の労働者と3つ(またはそれ以上)の仕事を持つ事務所と考えてください。 (タスクA、タスクB、タスクCと呼びましょう)。

最初の作業は、次のように監督者の指示を確認することです。

  • タイマーを10分に設定してください。それがオフになったとき、あなたの現在のタスクへの取り組みをやめて、TODOリストの一番下にそれを置き、この文書を読み続けてください。
  • 次に、TODOリストの先頭から最初の項目を削除して作業を始めます。
  • 繰り返す。

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

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

10分後にタイマーが切れます。ワーカー1はタスクAの作業を中止し、監督者の指示を受けます。現在のタスクをTODOリストの一番下に置くという状態。スーパーバイザーの指示を続けると、タイマーを再起動し、TODOリストの一番上にあるもの(作業C)を処理し始めます。

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

などなど

これはやや単純化されています。しかし、それはあなたに2つのトレッド(労働者)が3つ以上のタスクで100%の時間働くことができるという考えを与えるべきです。

実際のスケジューラにはもっとたくさんのことがあります。例えば。割り込み(タスクの途中で鳴っている電話とそれを処理する方法と比較してください)、スマートスケジューリング(同じタスクを同じワーカーに与えることで、ワーカーは既に慣れ親しんでいるので処理が速くなるでしょう)。 I / O(労働者が図書館からの本を必要としている場合、彼はタイマーが切れるまで待つことはありませんが、すぐに次のタスクなどを続けます)


0

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

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