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

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

💡 「終わったら次の人どうぞ」と自己申告制で順番を回すスケジューリング
📌 このページのポイント
ノンプリエンプティブスケジューリング 時間 → CPU プロセスA(完了まで実行) 完了 プロセスB 完了 プロセスC 待ちキュー(Aの実行中) B 待機中… C 待機中… D 待機中… ⚠ Aが終わるまで B・C・D は実行できない プロセスA プロセスB プロセスC 待機中
ノンプリエンプティブスケジューリングのイメージ
ひよこ ひよこ

ノンプリエンプティブスケジューリングってどういう仕組みなの?

ペンギン先生 ペンギン先生

プロセスが自分で「もう終わりました」「I/O待ちします」と言うまで、OSがCPUを取り上げないスケジューリング方式だよ。会議で発言者が自分から「以上です」と言うまで誰も割り込まない、みたいなイメージだね。

ひよこ ひよこ
ペンギン先生 ペンギン先生

プリエンプティブ方式はOSがタイマで強制的に「はい交代!」とプロセスを切り替えるけど、ノンプリエンプティブ方式ではプロセスの自主性に任せるんだ。実装がシンプルでコンテキストスイッチオーバーヘッドが少ない反面、行儀の悪いプロセスCPUを独占するリスクがあるよ。

ひよこ ひよこ

今のパソコンでも使われているの?

ペンギン先生 ペンギン先生

汎用OSではほぼ使われていないんだ。Windows 3.1やMac OS 9以前が協調型だったけど、1つのアプリがフリーズすると全体が固まる問題が頻発したから、プリエンプティブ方式に移行したよ。

ひよこ ひよこ

じゃあもう完全に使われていないの?

ペンギン先生 ペンギン先生

いや、実は特定の場面ではまだ使われているよ。例えば組み込みシステムの一部や、コルーチン・ファイバーのような協調的マルチタスク機構がそうだね。JavaScriptイベントループも、タスクが完了するまで次のタスクに移らないという意味ではノンプリエンプティブ的な考え方だよ。

ひよこ ひよこ

メリットもあるんだね!

ペンギン先生 ペンギン先生

そうだよ。コンテキストスイッチが予測可能なタイミングでしか起きないから、共有リソース競合状態が発生しにくいんだ。ロックやセマフォなどの排他制御が不要になるケースもあるから、プログラムが単純になるという大きなメリットがあるんだよ。

ひよこ ひよこ

使い分けのポイントって何なの?

ペンギン先生 ペンギン先生

応答性と公平性が重要なら断然プリエンプティブ方式。逆に、すべてのタスクが協力的に動くと保証できて、切り替えのオーバーヘッドを最小限にしたいならノンプリエンプティブ方式が有利だね。現代では「基本はプリエンプティブ、特定の局所的なタスク管理では協調型」というハイブリッドが主流だよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ノンプリエンプティブスケジューリング」って出てきたら「プロセスが自分でCPUを返すまで待つ方式」と思えればだいたいOK!
📖 おまけ:英語の意味
「Non-preemptive Scheduling」 = 非横取りスケジューリング
💬 non-preemptiveは「横取りしない」という意味で、OSがプロセスのCPU使用を邪魔しない紳士的なスケジューリングだよ
← 用語集にもどる