【ノンプリエンプティブスケジューリング】
ノンプリエンプティブスケジューリング とは?
💡 「終わったら次の人どうぞ」と自己申告制で順番を回すスケジューリング
📌 このページのポイント
ノンプリエンプティブスケジューリングってどういう仕組みなの?
プリエンプティブスケジューリングとはどう違うの?
プリエンプティブ方式はOSがタイマで強制的に「はい交代!」とプロセスを切り替えるけど、ノンプリエンプティブ方式ではプロセスの自主性に任せるんだ。実装がシンプルでコンテキストスイッチのオーバーヘッドが少ない反面、行儀の悪いプロセスがCPUを独占するリスクがあるよ。
今のパソコンでも使われているの?
汎用OSではほぼ使われていないんだ。Windows 3.1やMac OS 9以前が協調型だったけど、1つのアプリがフリーズすると全体が固まる問題が頻発したから、プリエンプティブ方式に移行したよ。
じゃあもう完全に使われていないの?
いや、実は特定の場面ではまだ使われているよ。例えば組み込みシステムの一部や、コルーチン・ファイバーのような協調的マルチタスク機構がそうだね。JavaScriptのイベントループも、タスクが完了するまで次のタスクに移らないという意味ではノンプリエンプティブ的な考え方だよ。
メリットもあるんだね!
使い分けのポイントって何なの?
応答性と公平性が重要なら断然プリエンプティブ方式。逆に、すべてのタスクが協力的に動くと保証できて、切り替えのオーバーヘッドを最小限にしたいならノンプリエンプティブ方式が有利だね。現代では「基本はプリエンプティブ、特定の局所的なタスク管理では協調型」というハイブリッドが主流だよ。
📖 おまけ:英語の意味
「Non-preemptive Scheduling」 = 非横取りスケジューリング
💬 non-preemptiveは「横取りしない」という意味で、OSがプロセスのCPU使用を邪魔しない紳士的なスケジューリングだよ