質問: 非プリエンプティブ、プリエンプティブ、および選択的プリエンプティブカーネルの違いは何ですか? 「非プリエンプティブ」、「プリエンプティブ」、「選択的プリエンプティブ」のカーネルの違いは何ですか?誰かがこれにいくつかの光を当てることができることを願っています。
回答: プリエンプティブカーネルでは、カーネルモードで実行されているプロセスを、カーネル関数の途中で別のプロセスに置き換えることができます。これはカーネルモードで実行されているプロセスにのみ適用され、ユーザーモードでプロセスを実行しているcpuは「アイドル」と見なされます。ユーザーモードプロセスがカーネルにサービスを要求する場合は、カーネルが処理できる例外を発行する必要があります。例として:プロセスaは例外ハンドラーを実行し、プロセスbはirq要求によって起動され、カーネルはプロセスaをbに置き換えます(強制プロセス切り替え)。プロセスaは未完成のままです。スケジューラは、プロセスaがcpu時間を取得するかどうかを後で決定します。非プリエンプティブカーネルでは、プロセスaは、終了するまで、または自発的に他のプロセスが彼に割り込むことを許可することを決定するまで(計画されたプロセススイッチ)、すべてのプロセッサ時間を使用します。今日のlinuxベースのオペレーティングシステムには、通常、完全にプリエンプティブなカーネルが含まれていません。中断することなく実行する必要がある重要な機能がまだあります。これを「選択的プリエンプティブカーネル」と呼べると思います。それとは別に、linuxカーネルを(ほぼ)完全にプリエンプティブにする方法があります。 リアルタイムlinux wiki lwn記事