実行中のタスクが自分からCPUを手放すまで、OSが切り替えを行わない方式。
ノンプリエンプティブ方式(non-preemptive=先取り・横取りをしない、の意味)とは、実行中のタスクが完了するか、I/O待ちなどで自発的にCPU(=中央処理装置。計算を行う部品)を手放すまで、OS(=コンピュータ全体を管理する基本ソフト)が強制的に切り替えない方式のことです。
身近な例で考えると、カラオケで1曲歌い終わるまでマイクを次の人に渡さないのに似ています。歌っている本人が「歌い終わった」「ちょっと休む」と自分でマイクを置くまで、周りは横から取り上げません。タスクが自分の区切りで手放すのを待つわけです。
上のツールで▶ボタンを押すと、実行中のタスクAが自分からCPUを解放し、次のタスクBへ切り替わる流れを確認できます。
切り替えが起こるのは、実行中のタスクが自分からCPUを手放したときだけです。手放すきっかけは主に次のとおりです。
・処理の完了:タスクがやるべき仕事を終え、もうCPUが要らなくなる
・I/O待ちに入る:ディスクやネットワークの読み書きの完了を待つため、自らシステムコール(=OSへの機能の依頼)で待ち状態に入る
ここでのポイントは、OSが横から強制的に止めることをしない点です。タイマで時間切れにして取り上げる、ということがありません。あくまでタスク側が「もう使い終わった」と区切りをつけたタイミングで、初めて次のタスクへバトンが渡ります。
言い換えると、各タスクの「お行儀の良さ」に頼った方式です。タスクが適度に処理を区切ってCPUを手放してくれることを前提にしています。上のツールのSTEP3で、タスクAが自ら解放するタイミングを確認できます。
ノンプリエンプティブ方式の良いところは仕組みの単純さです。OSが横やりを入れないので、切替の管理がシンプルで、状態の保存・復元の回数も少なく済みます。
一方の弱点は、1つのタスクがCPUを長く握りっぱなしにできてしまうことです。お行儀の悪いタスクや、無限ループに陥った暴走タスクがあると、他のタスクがいつまでも順番待ちのまま止まってしまいます。
これに対し、プリエンプティブ方式はOSがタイマ割込みで強制的に切り替えるため、1タスクの独占を防げて応答性が良くなります。「歌い終わるまで待つカラオケ(ノンプリエンプティブ)」と「持ち時間で司会者が交代させる発表(プリエンプティブ)」と対比すると、両者の長所短所が整理しやすいです。