シングルコアプロセッサでコンテキスト切り替えを行う場合、責任のあるコードは、スレッドの切り替えを処理する唯一のCPUで実行されます。
しかし、複数のCPUがある場合、これはどのように行われますか?すべてのスレーブCPUのすべてのコンテキストスイッチングを行うマスターCPUはありますか?各CPUは、独自のコンテキストスイッチングを担当していますか?もしそうなら、2つのCPUが同じスレッドを実行しないように、スイッチングはどのように同期されますか?または、他のメカニズムがありますか?
シングルコアプロセッサでコンテキスト切り替えを行う場合、責任のあるコードは、スレッドの切り替えを処理する唯一のCPUで実行されます。
しかし、複数のCPUがある場合、これはどのように行われますか?すべてのスレーブCPUのすべてのコンテキストスイッチングを行うマスターCPUはありますか?各CPUは、独自のコンテキストスイッチングを担当していますか?もしそうなら、2つのCPUが同じスレッドを実行しないように、スイッチングはどのように同期されますか?または、他のメカニズムがありますか?
カーネルはマルチスレッドです。どのコアでも実行できます。コアがスレッドを交換する必要が生じると、次に実行するスレッドの選択を担当するカーネルの部分を呼び出します。
カーネルはマルチスレッドです。つまり、複数のコアで同時に安全に実行できるように書かれています。そのため、複数の CPU が同時に再スケジュールされた場合に正しい結果が生じるようにコードが構築されているため、特定のスレッドを実行するのは 1 つの CPU だけです。
CPU はコンテキスト切り替えを行いません。オペレーティング システムが行います。
基本的に、OS は、CPU コアに新しいコンテキスト (レジスタ、メモリ マッピングなど) をロードすることによって、コンテキスト スイッチを実行します。スレッドは、そのようなコンテキストを保存できる OS 構造です。したがって、OS は、実行されていないスレッドを選択して CPU コンテキストをロードする役割も果たします。
OS が実行中のスレッドを選択すると、2 つのコアが同じスレッドを実行しようとします。同じメモリを共有し、その単一のスレッドがそれ自体と並行して実行されることを期待しないため、これは混乱を引き起こすに違いありません (!) したがって、OS はそのようなことをしません。
P1 と P2 の 2 つのプロセスがあるとします。おおよそのステップ シーケンスは次のようになります。
The current registers are stored into the process structure for P1.
The stored register values from the process structure for P2 are loaded into the CPU's registers.
CPU returns the User mode
P1 is context switched out and P2 is context switched in and running
CPU のみが割り込みを OS に送信し、Context Switch を実行することに注意してください。