プリエンプティブとノンプリエンプティブ

マルチタスクのスケジューリングポリシーで、タイムスライスでタスク/スレッド/プロセスの優先度を切り替えないが、割り込みハンドラ内の処理により高優先度のタスク/スレッド/プロセスが実行可能状態になると、ハンドラから抜けた場合にそちらに実行が移るようなものは、プリエンプティブ (preemptive) でしょうか、ノンプリエンティブ (non-preemptive) でしょうか。*1

答えは、高優先度のタスクが実行権を奪っていきますので、プリエンプティブ。ですが、どうも組み込みOS系の話題と縁遠い人に聞いてみると、タイムスライシングを行わない=ノンプリエンプティブと回答することが多いようです。そういう自分も、以前、ミーティングで取引先の方と散々会話がかみ合わなくなるまで勘違いしていました。

組み込みOSの世界では、タスクが知らない間に切り替わるかどうかで、プログラマが気をつけるべきことが段違いに変わるため、プリエンプティブかノンプリエンプティブかは大問題です。逆にオーバーヘッドがやたら大きいわ、タイムクォンタムが大きすぎるわのタイムスライシングなんて実装されているわけがありません。*2

一方、PC以上のリッチなOSの世界では、タイムスライシングが行われるのが常識であり、タイムスライシングが行われない=Windows3.1みたいなロートル、という連想があります。

そこらへんの認識の違いが、用語の用法の厳密度の差に現れているのかと思うとなかなか興味深いですね。

ところで、Windows3.1 って本当にノンプリエンプティブなんでしたっけ?ざっと調べても確信が持てないのですが……。会社で恐竜本を確認するしかないかなぁ。

追記

恐竜本によると、Windows3.1 は確かにノンプリエンプティブでした。MacOS X より前の MacOS もノンプリエンプティブだという衝撃的な記述があってびっくり。

*1:ちなみに、これはリアルタイムOSと呼ばれているものの一般的なスケジューリングポリシーです。

*2:RTLinux のようなリッチな RTOS は除く