カーネルは、プロセスがシステム コールを呼び出すたびに、および割り込みが発生するたびに、通常の操作で非常に頻繁に制御を取得します。割り込みは、ハードウェアが CPU の注意を必要とするとき、または CPU がカーネルの注意を必要とするときに発生します。ハードウェアの特定の部分をプログラムして、定期的に注意を要求することができます (タイマー)。したがって、カーネルは、システムがロックアップして割り込みが生成されなくなっていない限り、定期的に呼び出されるようにすることができます。
その結果、
<ブロック引用>そのプロセスが譲歩せずに非常に長時間実行される計算を行っている場合
心配する必要はありません。Linux はプリエンプティブなマルチタスク オペレーティング システムです。つまり、 実行中のプログラムの協力を必要とせずにマルチタスクを実行します。
プロセスの強制終了に関しては、とにかくカーネルが関与します。プロセスが別のプロセスを強制終了したい場合は、カーネルを呼び出して強制終了する必要があるため、カーネルが制御されます。カーネルがプロセスを強制終了することを決定した場合 (例 OOM キラー、またはプロセスが許可されていないこと (マップされていないメモリへのアクセスなど) を実行しようとしたため)、それも制御されています。
カーネルはしないように構成できることに注意してください システムの CPU 自体のサブセットを制御する (非推奨の isolcpus
を使用) または、特定の CPU 自体でタスクをスケジュールしないようにする (cgroup v1 および cgroup v2 に完全に統合されている負荷分散なしの cpuset を使用)。ただし、システム内の少なくとも 1 つの CPU は、常にカーネルによって完全に管理されている必要があります。特定の CPU の使用目的に応じて、生成されるタイマー割り込みの数を減らすように構成することもできます。
また、シングル CPU (シングルコアなど) システムとマルチ CPU システムの間に大きな違いはありません。カーネル制御に関する限り、同じ懸念が両方に当てはまります。カーネル制御下でのマルチタスクに使用されます。
Linux とほとんどの最新の OS はプリエンプティブ マルチタスクを使用します。つまり、カーネルは各プロセスの実行が許可されている時間を完全に制御し、実行時間が長すぎる場合はプロセスをプリエンプトします。プロセスが好きなときに制御を渡す協調型マルチタスクとは異なります
基本的に、プリエンプティブ マルチタスクでは、カーネルはタイマーから定期的に起動され、カーネルが制御されているときはいつでも (タイマー割り込みが発生したり、システム コールが呼び出されたりすると)、カーネルは現在のプロセスのコンテキストを保存してから、次のプロセスに切り替えます。 ' 環境。これはコンテキスト スイッチと呼ばれ、すべてのスレッド情報、レジスタ値を含むプロセス全体の状態が保存および復元され、プロセスが継続的に実行されていないことを知らなくても、プリエンプトされた正確なポイントからプロセスを実行し続けます。したがって、多くのプロセスが表示されます 実際には常に 1 つのプロセスしか実行されていませんが、単一の CPU コアで同時に実行されます。カーネルは、すべてのプロセスとリソースの処理を行う特別なプロセスでもあります。他のプロセスを監視するためだけに別のコアから実行されるわけではありません
「Linux カーネルはプリエンプティブ」とはどういう意味ですか?