9

レディ キューにプロセスが 1 つしかなく、ラウンド ロビン スケジューリングを使用するシステムで、コンテキスト スイッチは発生しますか?

単一プロセスの現在の CPU バーストが、ラウンドロビン アルゴリズムの複数のタイム スライスにまたがっているとします。

私の推論は以下の通りです

一般的なケースでタイマー割り込みが発生したときに実行される手順は次のとおりです。

  1. 割り込みが発生します。カーネル モードに切り替える
  2. OS は現在のコンテキストを PCB に保存します (現在のプロセスのレジスタ、プロセス状態、およびメモリ管理情報を保存します)
  3. データや命令キャッシュ、TLB のフラッシュなど、多くのアーキテクチャ固有の操作を実行します。
  4. 現在のプロセスを準備完了キューに入れる
  5. 実行する新しいプロセスを選択してください
  6. そのプロセスの PCB からコンテキストをロードする
  7. ユーザーモードに切り替えます。新しいプロセスの実行を開始します

私は今、OS が最初に準備完了キューを検査し、他のプロセスがあるかどうかを確認することを考えています。何もない場合は、コンテキスト スイッチの必要はありません。したがって、タイマー割り込みの処理には、ユーザー モードとカーネル モード間の切り替え、準備完了の Q の確認、およびプロセスの実行を再開するためのユーザー モードへの切り替えが伴います。

これは何が起こるのですか?それとも、孤立したプロセスの現在の状態の不必要な保存と同じ状態の復元を含む適切なコンテキストの切り替えが行われますか?

後者が発生した場合、特別な理由はありますか?

この混乱は、そのような状況でのコンテキスト切り替えに費やされた時間の計算に関する試験問題の質問が原因で発生しました。与えられた答えは、コンテキストの切り替えが行われることを意味します。

カーネルコードを調べたことのある人がこれを理解できることを願っています。したがって、stackoverflowに関するこの質問。

4

1 に答える 1

8

Linux カーネルからの次のコードは、あなたの疑問を明確にします。さまざまな時点で、カーネルはスケジューラを呼び出して、実行する新しいプロセスを選択します。しかし、スケジューラーが現在実行中のタスク以外のタスクを検出しないことが判明する場合があります。その場合、スケジューラは「コンテキストの切り替え」を行わず、単に何もせずに戻ります。

たとえば、Linux カーネルのコードを示します。

   .........
   if (likely(prev != next)) {<-- if next and current are same, then no context switch
            sched_info_switch(prev, next);
            perf_event_task_sched_out(prev, next);

            rq->nr_switches++;
            rq->curr = next;
            ++*switch_count;

            context_switch(rq, prev, next); /* unlocks the rq */
            /*
             * The context switch have flipped the stack from under us
             * and restored the local variables which were saved when
             * this task called schedule() in the past. prev == current
             * is still correct, but it can be moved to another cpu/rq.
             */
            cpu = smp_processor_id();
            rq = cpu_rq(cpu);
    } else {
     ............
于 2012-01-25T08:47:07.180 に答える