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

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

最終更新:
💡 CPUを強制的に取り上げず、タスクが譲るのを待つ方式

実行中のプロセスやスレッドを、別のタスクへCPUを渡すために強制的には切り替えないスケジューリング方式。終了・待ち状態への移行・明示的な譲渡などを機に次のタスクを選ぶ。

📌 このページのポイント
実行中のCPUを強制的に取り上げない 一つのCPUで A → B → C の例 CPU 実行するタスク CPU A B C 時間 AがI/O待ち → Bへ Aの実行中の実行可能キュー B:待機 C:待機 終了だけでなく、待ち・yieldでも譲る 譲らない処理が長いと、ほかのタスクが待つ 非横取りは「割り込み禁止」とは別
青・緑・橙はタスクA・B・C。上はCPUを使う時間、下はA実行中のキューの状態で、同じ時系列ではない。Aは終了せずI/O待ちで譲る例。その後Aが再び実行可能になる場面と切り替えのコストは省略。割り込み処理は起こり得る。
ひよこ ひよこ
ノンプリエンプティブスケジューリングってどういう仕組みなの?
ペンギン先生 ペンギン先生
タスクが終了したり、I/Oなどの待ち状態になったり、自分からCPUを譲ったりするまで、別のタスクへ強制的に交代させない方式だよ。会議で発言者が区切りまで話してから次へ譲るイメージだね。プロセス全体の終了まで必ず待つという意味ではないんだ。
ひよこ ひよこ
ペンギン先生 ペンギン先生
プリエンプティブ方式は、タイマや高優先度タスクの準備などを機に、実行中でもCPUを取り上げられるよ。非横取り方式ではタスクが譲るタイミングに頼るので、長い計算がほかのタスクを待たせる。切り替え回数やコストはタスクの動作と実装にもよるので、必ず軽いとは言えないんだ。
ひよこ ひよこ
今のパソコンでも使われているの?
ペンギン先生 ペンギン先生
OSのCPU割り当てと、アプリ内部のタスク管理は分けて考えよう。OSがスレッドをプリエンプティブに動かしていても、そのスレッドの中で協調的に処理を切り替えることはできる。非横取りだからOSが一切介入せず、割り込みも起きないという意味ではないよ。
ひよこ ひよこ
じゃあもう完全に使われていないの?
ペンギン先生 ペンギン先生
今も使う場面があるよ。たとえばZephyrには協調型スレッドがあり、yieldやsleepでCPUを譲れるんだ。Webのイベントループにも、選んだタスクの処理を進めてから次へ移る仕組みがある。ただしこれはアプリ側の処理順序で、OSのCPUスケジューラが非横取りだということではないよ。
ひよこ ひよこ
メリットもあるんだね!
ペンギン先生 ペンギン先生
切り替える場所を把握しやすく、同じCPU上の協調タスク同士の処理を整理しやすいんだ。ただし割り込みや別のCPU、途中の待ち・譲渡でほかの処理が動く場合はある。共有データの排他制御が一切不要になると決めつけず、どの処理が同時に触るかを確認するよ。
ひよこ ひよこ
使い分けのポイントって何なの?
ペンギン先生 ペンギン先生
タスクがどれだけ長くCPUを使うか、ほかの処理をどれだけ待たせてよいかを見るんだ。協調型なら長い処理を適切に区切って譲る設計が必要。プリエンプティブ方式でも優先度などの設定で待ち時間は変わるので、名前だけで応答性や公平性が保証されるわけではないよ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ノンプリエンプティブスケジューリング」って出てきたら「CPUを強制的に取り上げず、タスクが譲るのを待つ方式」と思えばだいたいOK!
📖 おまけ:英語の意味
「Non-preemptive Scheduling」 = 非横取りスケジューリング
💬 Nonは否定、preemptiveは先に取る・横取りするという意味。別のタスクへ渡すために、実行中のCPU使用を強制的に取り上げない方式だよ

参考資料

← 用語集にもどる