協調的マルチタスクを使用していて、悪いプログラムがある場合は、そのとおりです。
しかし現実の世界では、次のことが起こるはずです。
協調的マルチタスキング:私は、CPUを永遠に使い続けることはしません。代わりに、しばらくしてから、またはブロックされたときに、別のプログラムにチャンスを与えます。
パウロの答えは後者を説明しています。
プリエンプティブマルチタスキング(どこでも使用されている):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(労働者が図書館からの本を必要としている場合、彼はタイマーが切れるまで待つことはありませんが、すぐに次のタスクなどを続けます)