【プリエンプティブスケジューリング】

プリエンプティブスケジューリング とは?

最終更新:
💡 OSが実行を中断して、次のタスクへCPUを渡す

OSが実行中のタスクを、そのタスクの自発的なCPU返却を待たずに中断し、別の実行可能なタスクへCPUを割り当てられる方式。時間切れや高優先度タスクの実行準備などが切り替えの契機になる。

📌 このページのポイント
OSが実行を中断し、別のタスクへCPUを渡す 1個のCPU:同じ優先度のA・B・Cの例 時間枠が尽きたら、OSが交代させる A 実行 B 実行 C 実行 A 再開 時間 ↓ ↓ ↓ 紫の印:時間枠による切り替えの契機 中断したタスクの状態を保存し、後で復元 高優先度のタスクへの切り替えなどもある
同優先度のタスクを時間枠で交代させるラウンドロビンの模式例。横方向に時間が進み、枠の色はタスクの区別。切り替え処理の時間は省略し、幅は実測値ではない。すべてのプリエンプティブ方式が等時間で交代するわけではない。
ひよこ ひよこ
プリエンプティブスケジューリングって何なの?
ペンギン先生 ペンギン先生
実行中のタスクが自分からCPUを返すのを待たず、OSが中断して別のタスクを動かせる方式だよ。先生が発表者へ「はい、交代」と伝えるイメージだね。OSで扱う実行の単位は、プロセスやスレッドなど実装によって異なるんだ。
ひよこ ひよこ
どうやって「交代」のタイミングを決めるの?
ペンギン先生 ペンギン先生
時間枠が尽きた場合や、優先度の高いタスクが実行可能になった場合などだよ。LinuxのSCHED_RRは時間枠を使う一方、SCHED_FIFOは時間枠がなくても高優先度のタスクに中断される。プリエンプティブと、一定時間ごとに交代することは同じ意味ではないんだ。
ひよこ ひよこ
強制的に止められたタスクはどうなるの?
ペンギン先生 ペンギン先生
コンテキストスイッチで実行状態を保存し、後で復元して再開するよ。たとえばZephyrではCPUレジスタを保存・復元する。中断はタスクを終了させる操作ではなく、そのCPUでの実行をいったん交代することなんだ。
ひよこ ひよこ
どんなOSで使われるの?
ペンギン先生 ペンギン先生
WindowsやLinuxにも、この方式のスケジューリングがあるよ。一方、RTOSのZephyrは協調的なスレッドとプリエンプティブなスレッドを扱える。同じOSでも実行単位や設定に違いがあるので、全部がいつでも中断できるとは考えないんだ。
ひよこ ひよこ
リアルタイムなら、最優先タスクは即座に動く?
ペンギン先生 ペンギン先生
高優先度へ切り替える方針は重要だけれど、待ち時間がゼロになる保証ではないよ。割り込み処理や切り替えを制限する区間、ロック待ちなども関係する。期限を守れるかは、処理時間と待ち時間を含めて確認するんだ。
ひよこ ひよこ
弱点ってあるの?
ペンギン先生 ペンギン先生
切り替えには処理が必要で、共有データの更新途中で中断されることもあるよ。ロックなどで同期する設計が必要になる。ただし排他制御はこの方式だけの課題ではなく、複数CPUで同時に実行する場合にも考えるんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「プリエンプティブスケジューリング」って出てきたら「OSが実行中のタスクを中断し、別のタスクへCPUを渡せる方式」と思えばだいたいOK!
📖 おまけ:英語の意味
「Preemptive Scheduling」 = 先取り・横取りスケジューリング
💬 preemptは「先取りする・横取りする」という意味で、OSがプロセスからCPUを横取りするイメージだよ

参考資料

← 用語集にもどる