コンテンツにスキップ

「コンテキストスイッチ」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
Melan (会話 | 投稿記録)
最初の版 oldid=2441395 や、その後の oldid=3180946 がen:Context switchの無断翻訳と思われる。Template:著作権問題調査依頼を付加。履歴継承のない翻訳は著作権侵害。Wikipedia:翻訳のガイドライン
 
(18人の利用者による、間の20版が非表示)
1行目: 1行目:
{{著作権問題調査依頼|date=2023-05}}
'''コンテキストスイッチ''' (context switch) とは、複数の[[プロセス]]が1つの[[CPU]]を共有できるように、CPUの状態(コンテキスト)を保存したり復元したりする過程のことである。コンテキストスイッチは[[マルチタスク]][[オペレーティングシステム]]に不可欠な機能である。通常コンテキストスイッチは多くの計算機処理を必要とするため、オペレーティングシステムの設計においてはコンテキストスイッチを最適化することが重要である。
{{出典の明記|date=2023-05}}
'''コンテキストスイッチ''' (context switch) とは、複数の[[プロセス]]が1つの[[CPU]]を共有できるように、CPUの状態([[コンテキスト (情報工学)]])を保存したり復元したりする過程のことである。コンテキストスイッチは[[マルチタスク]][[オペレーティングシステム]]に不可欠な機能である。通常コンテキストスイッチは多くの計算機処理を必要とするため、オペレーティングシステムの設計においてはコンテキストスイッチを最適化することが重要である。


==コンテキストスイッチの発生するケース==
==コンテキストスイッチの発生するケース==
===[[マルチタスク|マルチタスキング]]===
===マルチタスキング===
マルチタスク・オペレーティングシステムにおいては、実行中のプロセスは途中でCPUを明け渡し、他のプロセスも実行されるようにする必要がある。このプロセスの切り替えの際にコンテキストスイッチが発生する。
[[マルチタスク]]・オペレーティングシステムにおいては、実行中のプロセスは途中でCPUを明け渡し、他のプロセスも実行されるようにする必要がある。このプロセスの切り替えの際にコンテキストスイッチが発生する。


プリエンプティブな[[マルチタスク]]OSでは、スケジューラーが各プロセスを「タイムスライス」と呼ばれるある短い時間ずつ走行させる。
プリエンプティブな[[マルチタスク]]OSでは、スケジューラーが各プロセスを「タイムスライス」と呼ばれるある短い時間ずつ走行させる。
しかし、プロセスがその時間内にCPUを明け渡さなかった場合(明け渡すとは、例えばI/Oを行ってその完了を待つ場合など)、タイマ割り込みが発生し、OSが別のプロセスを走行させるようスケジュール設定しコンテキストスイッチが発生する。これによりCPUが計算ばかりするアプリケーションに占されないようにするのである。
しかし、プロセスがその時間内にCPUを明け渡さなかった場合(明け渡すとは、例えばI/Oを行ってその完了を待つ場合など)、タイマ割り込みが発生し、OSが別のプロセスを走行させるようスケジュール設定しコンテキストスイッチが発生する。これによりCPUが計算ばかりするアプリケーションに占されないようにするのである。


===[[割り込み]]処理===
===割り込み処理===
割り込みが発生した時には、現在のプロセスの実行を停止して[[割り込みハンドラ]]を実行する必要があるため、コンテキストスイッチが発生する。
[[割り込み (コンピュータ)|割り込み]]が発生した時には、現在のプロセスの実行を停止して[[割り込みハンドラ]]を実行する必要があるため、コンテキストスイッチが発生する。


リアルタイムOSの場合、プリエンプティブなタスクが実行中に割り込みが発生した時は、割り込み処理が終了しても停止させたタスクに実行権が戻るとは限らない。
[[リアルタイムオペレーティングシステム]]の場合、プリエンプティブなタスクが実行中に割り込みが発生した時は、割り込み処理が終了しても停止させたタスクに実行権が戻るとは限らない。
割り込み処理終了時に停止させたタスクよりプライオリティの高いタスクが実行可能となっている場合はディスパッチが行われプライオリティの高いタスクを優先して処理するのが一般的である。
割り込み処理終了時に停止させたタスクよりプライオリティの高いタスクが実行可能となっている場合はディスパッチが行われプライオリティの高いタスクを優先して処理するのが一般的である。


29行目: 31行目:
アーキテクチャによっては複数のコンテキストを同時に保持するハードウェアも存在する。その場合コンテキストをメモリに格納したりメモリから復帰させたりといったことをする必要がない。極端なケースとして[[バレルプロセッサ]]アーキテクチャではマシンサイクル毎にスレッド間でスイッチしながら動作する。
アーキテクチャによっては複数のコンテキストを同時に保持するハードウェアも存在する。その場合コンテキストをメモリに格納したりメモリから復帰させたりといったことをする必要がない。極端なケースとして[[バレルプロセッサ]]アーキテクチャではマシンサイクル毎にスレッド間でスイッチしながら動作する。


== 脚注 ==
[[Category:OSのプロセス管理|こんてきすとすいっち]]
<references/>
[[Category:並行計算|こんてきすとすいっち]]


{{オペレーティングシステム}}
[[ca:Canvi de context]]
{{デフォルトソート:こんてきすとすいつち}}
[[cs:Změna kontextu]]
[[Category:OSのプロセス管理]]
[[de:Kontextwechsel]]
[[Category:並行計算]]
[[en:Context switch]]
[[fr:Commutation de contexte]]
[[it:Commutazione di contesto]]
[[ko:문맥 교환]]
[[pl:Przełączanie kontekstu]]
[[pt:Troca de contexto]]

2023年5月5日 (金) 10:58時点における最新版

コンテキストスイッチ (context switch) とは、複数のプロセスが1つのCPUを共有できるように、CPUの状態(コンテキスト (情報工学))を保存したり復元したりする過程のことである。コンテキストスイッチはマルチタスクオペレーティングシステムに不可欠な機能である。通常コンテキストスイッチは多くの計算機処理を必要とするため、オペレーティングシステムの設計においてはコンテキストスイッチを最適化することが重要である。

コンテキストスイッチの発生するケース

[編集]

マルチタスキング

[編集]

マルチタスク・オペレーティングシステムにおいては、実行中のプロセスは途中でCPUを明け渡し、他のプロセスも実行されるようにする必要がある。このプロセスの切り替えの際にコンテキストスイッチが発生する。

プリエンプティブなマルチタスクOSでは、スケジューラーが各プロセスを「タイムスライス」と呼ばれるある短い時間ずつ走行させる。 しかし、プロセスがその時間内にCPUを明け渡さなかった場合(明け渡すとは、例えばI/Oを行ってその完了を待つ場合など)、タイマ割り込みが発生し、OSが別のプロセスを走行させるようスケジュール設定しコンテキストスイッチが発生する。これによりCPUが計算ばかりするアプリケーションに占有されないようにするのである。

割り込み処理

[編集]

割り込みが発生した時には、現在のプロセスの実行を停止して割り込みハンドラを実行する必要があるため、コンテキストスイッチが発生する。

リアルタイムオペレーティングシステムの場合、プリエンプティブなタスクが実行中に割り込みが発生した時は、割り込み処理が終了しても停止させたタスクに実行権が戻るとは限らない。 割り込み処理終了時に停止させたタスクよりプライオリティの高いタスクが実行可能となっている場合はディスパッチが行われプライオリティの高いタスクを優先して処理するのが一般的である。

ユーザーモードとカーネルモードの切り替え

[編集]

ユーザーモードカーネルモード間の遷移が必要となった場合、コンテキストスイッチが発生する。システムコールはカーネルモードで実行されるので、これらの関数が呼び出される際にはまずカーネルのコンテキストを読み出し、システムコールを実行して、それから元のユーザーモードのコンテキストを復元する必要がある。

コンテキストスイッチの手順

[編集]

コンテキストスイッチでは、実行中のプロセスの状態を何らかの方法で保存し、後にそのプロセスを再開する際にその状態を復元して、正常に実行を継続できるようにしなければならない。

プロセスの状態には、そのプロセスが使用し得る全てのレジスタ(特にプログラムカウンタ)や、プロセスの実行に必要となるオペレーティングシステム固有の情報が含まれる。多くの場合、これらのデータは1つのデータ構造として保存される。

プロセスを切り替えるためには、実行中のプロセスの状態を表すデータ構造を作成し、保存しなければならない。このデータは、カーネルメモリ上にあるプロセスごとに割り当てられるスタックか、あるいはオペレーティングシステムによって定義された固有のデータ構造に保存される。

様々な実装例

[編集]

コンテキストスイッチはソフトウェアかハードウェアで実行される。インテル80386やその後継CPUはハードウェアがコンテキストスイッチをサポートしていて、そのための特別なデータセグメント(タスク・ステート・セグメント、TSS)を用意している。タスクスイッチが発生すると(明示的にタスクを切り替える命令を実行するか、割り込みが発生したとき)、CPUは自動的に新しいコンテキストをTSSからロードする。このようにハードウェアでコンテキストスイッチを行うと高速だと思われるかもしれないが、Windowsを含めた主なOSはこの機能を使っていない。これは主にふたつの理由によるものである。まずハードウェアによるコンテキストスイッチは全部のレジスタをセーブしない(汎用レジスタだけで、浮動小数点レジスタもセーブしない)。もうひとつの理由は性能の問題である。

アーキテクチャによっては複数のコンテキストを同時に保持するハードウェアも存在する。その場合コンテキストをメモリに格納したりメモリから復帰させたりといったことをする必要がない。極端なケースとしてバレルプロセッサアーキテクチャではマシンサイクル毎にスレッド間でスイッチしながら動作する。

脚注

[編集]