地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

コンテキストスイッチ

コンテキストスイッチとは

コンテキストスイッチ (context switch) とは、複数のプロセスが1つのCPUを共有できるように、CPUの状態(コンテキスト (情報工学))を保存したり復元したりする過程のことである。 コンテキストスイッチマルチタスクオペレーティングシステムに不可欠な機能である。

wikiより

Linunは多数のプロセスを同時に動作させるマルチタスク環境である。 ユーザから見るとプロセスは走らせた分すべてが同時に動いているように見えるが 実はそうではない。 プロセスの同時実行数はプロセッサの数以上に同時に動くことはない。 マルチタスクをサポートするOSでは複数のプロセスを短い時間で区切って実行することで体感上はコア数以上のプロセスが同時に動いているように見せている

プロセスの切り替え

Linuxでのコンテキストスイッチの流れは以下

  • スケジューラで次に実行するプロセスを選択します。
  • ページテーブルを切り替えます。
  • スタックへ汎用レジスタ、フラグを退避します。
  • 現在のプロセスのthread_info構造体へスタックポインタ、インストラクションポインタを退避します。
  • 次に実行するプロセスのthread_info構造体からスタックポインタを復帰します。
  • セグメントレジスタを切り替えます。
  • 次に実行するプロセスのインストラクションポインタを復帰します。 この時点でコンテキストが次のプロセスへ切り替わります。
  • スタックから汎用レジスタ、フラグを復帰し、コンテキストスイッチを完了します。

プロセスが現在どのような状態であるかはプロセスディスクリプタが保持している 優先度だったりスケジューリング.PID等を保持している

コピーオンライト

fork()でプロセスを複製する際はカーネルは親プロセスのフレームのコピーは行わない。実行後は親と子でページフレームは共有する。そのあとでページに対して書き込みが発生した際にページを作成しコピーを実施する。これにより無駄なコピーを防いでいる。