リエントラントカーネルとは?
4 に答える
はるかに簡単な答え:
カーネルの再入可能。
カーネルが再入可能でない場合、プロセスはユーザーモードのときにのみ一時停止できます。カーネルモードで一時停止することもできますが、それでも他のすべてのプロセスでのカーネルモードの実行はブロックされます。これは、すべてのカーネルスレッドが同じメモリを共有するためです。それらの間で実行が任意にジャンプすると、破損が発生する可能性があります。
リエントラントカーネルを使用すると、プロセス(より正確には、対応するカーネルスレッド)がカーネルモード中にCPUを解放できます。他のプロセスがカーネルモードに入るのを妨げることはありません。典型的な使用例はIO待機です。プロセスはファイルを読み取りたいと考えています。このためにカーネル関数を呼び出します。カーネル関数内で、ディスクコントローラはデータを要求されます。データの取得には時間がかかり、その間機能はブロックされます。再入可能なカーネルでは、ディスクコントローラーからの割り込みがデータが利用可能であり、スレッドを再開できることを示すまで、スケジューラーはCPUを別のプロセス(カーネルスレッド)に割り当てます。このプロセスは、ユーザー入力のように、IO(カーネル機能が必要)に引き続きアクセスできます。システムの応答性が維持され、IO待機によるCPU時間の浪費が削減されます。
これは、今日のデスクトップオペレーティングシステムではほぼ標準です。
カーネルプリエンプション
カーネルプリエンプションは、システムの全体的なスループットには役立ちません。代わりに、より良い応答性を求めています。
ここでの考え方は、通常、カーネル機能はハードウェアの原因によってのみ中断されるということです。外部割り込み、またはIO待機の場合、スケジューラーに自発的に制御を渡します。代わりに、プリエンプティブカーネルは、ユーザーモードでプロセスを中断するのと同じように、カーネル機能を中断および一時停止します。カーネル内で重い作業が行われている場合でも、マウス入力の処理などのプロセスがウェイクアップされるため、システムの応答性が向上します。
カーネルレベルでのプリエンプションは、カーネル開発者にとって事態を困難にします。カーネル機能は、自発的に、または割り込みハンドラー(ある程度制御された環境)だけでなく、スケジューラーによる他のプロセスによっても一時停止できません。たとえば、デッドロックを回避するように注意する必要があります。スレッドはリソースAをロックしますが、必要なリソースBは、リソースBをロックするが、リソースAを必要とする別のスレッドによって中断されます。
一粒の塩による先制についての私の説明を取りなさい。訂正をいただければ幸いです。
すべての Unix カーネルは再入可能です。これは、複数のプロセスがカーネル モードで同時に実行されている可能性があることを意味します。もちろん、ユニプロセッサ システムでは 1 つのプロセスしか進行できませんが、多くのプロセスは、CPU または何らかの I/O 操作の完了を待っているときに、カーネル モードでブロックできます。たとえば、プロセスに代わってディスクに読み取りを発行した後、カーネルはディスクコントローラーにそれを処理させ、他のプロセスの実行を再開します。デバイスが読み取りを完了すると、割り込みによってカーネルに通知されるため、前のプロセスは実行を再開できます。
再入可能性を提供する 1 つの方法は、ローカル変数のみを変更し、グローバル データ構造を変更しないように関数を記述することです。このような関数は、再入可能関数と呼ばれます。しかし、再入可能カーネルは、そのような再入可能関数だけに限定されるわけではありません (ただし、一部のリアルタイム カーネルはそのように実装されています)。代わりに、再入不可の関数をカーネルに組み込み、ロック メカニズムを使用して、一度に 1 つのプロセスのみが再入不可の関数を実行できるようにします。
ハードウェア割り込みが発生した場合、再入可能カーネルは、そのプロセスがカーネル モードであっても、現在実行中のプロセスを一時停止できます。この機能は、割り込みを発行するデバイス コントローラーのスループットを向上させるため、非常に重要です。デバイスが割り込みを発行すると、CPU がそれを確認するまで待機します。カーネルが迅速に応答できる場合、デバイス コントローラーは、CPU が割り込みを処理している間に他のタスクを実行できます。
次に、カーネルの再入可能性と、それがカーネルの組織に与える影響を見てみましょう。カーネル制御パスは、システム コール、例外、または割り込みを処理するためにカーネルによって実行される一連の命令を示します。
最も単純なケースでは、CPU はカーネル制御パスを最初の命令から最後の命令まで順番に実行します。ただし、次のいずれかのイベントが発生すると、CPU はカーネル制御パスをインターリーブします。
ユーザー モードで実行中のプロセスがシステム コールを呼び出し、対応するカーネル制御パスが要求をすぐに満たすことができないことを確認します。次に、スケジューラを呼び出して、実行する新しいプロセスを選択します。その結果、プロセスの切り替えが発生します。最初のカーネル制御パスは未完了のままになり、CPU は他のカーネル制御パスの実行を再開します。この場合、2 つの異なるプロセスに代わって 2 つの制御パスが実行されます。
CPU は、カーネル制御パスの実行中に、RAM に存在しないページへのアクセスなどの例外を検出します。最初の制御パスが中断され、CPU が適切な手順の実行を開始します。この例では、このタイプのプロシージャは、プロセスに新しいページを割り当て、その内容をディスクから読み取ることができます。手順が終了すると、最初の制御パスを再開できます。この場合、2 つの制御パスが同じプロセスのために実行されます。
CPU が割り込みを有効にしてカーネル制御パスを実行しているときに、ハードウェア割り込みが発生します。最初のカーネル制御パスは未完成のままで、CPU は割り込みを処理するために別のカーネル制御パスの処理を開始します。割り込みハンドラが終了すると、最初のカーネル制御パスが再開されます。この場合、2 つのカーネル制御パスが同じプロセスの実行コンテキストで実行され、合計システム CPU 時間がそれに計上されます。ただし、割り込みハンドラは必ずしもプロセスに代わって動作するとは限りません。
カーネル プリエンプションが有効な状態で CPU が実行されている間に割り込みが発生し、より優先度の高いプロセスが実行可能になります。この場合、最初のカーネル制御パスは未完了のままになり、CPU は優先度の高いプロセスに代わって別のカーネル制御パスの実行を再開します。これは、カーネルがカーネル プリエンプション サポート付きでコンパイルされている場合にのみ発生します。
これらの情報は、http://jno.glas.net/data/prog_books/lin_kern_2.6/0596005652/understandlk-CHP-1-SECT-6.htmlで入手できます。
http://linux.omnipotent.net/article.php?article_id=12496&page=-1の詳細
カーネルは、ハードウェアと直接インターフェイスし、実行するプロセスをスケジュールするオペレーティングシステムのコア部分です。
プロセスはカーネル関数を呼び出して、ハードウェアへのアクセスや新しいプロセスの開始などのタスクを実行します。したがって、一定期間、プロセスはカーネルコードを実行します。複数のプロセスが同時にカーネルコードを実行できる場合、カーネルは再入可能と呼ばれます。「同時に」とは、2つのプロセスが実際にカーネルコードを同時に実行している(マルチプロセッサシステム上で)か、1つのプロセスがカーネルコードの実行中に中断されている(たとえば、ハードウェアが応答するのを待っているため)ことを意味します。また、実行がスケジュールされている別のプロセスもカーネルに呼び出されています。
再入可能なカーネルは、カーネルの競合がないため、パフォーマンスが向上します。再入可能ではないカーネルは、2つのプロセスがカーネルコードを同時に実行していないことを確認するためにロックを使用する必要があります。
再入可能関数は、データの破損を心配することなく、複数のタスクで同時に使用できる関数です。逆に、再入不可関数は、セマフォを使用するか、コードのクリティカル セクションでの割り込みを無効にすることによって、関数への相互排除が保証されない限り、複数のタスクで共有できない関数です。再入可能関数はいつでも中断でき、データを失うことなく後で再開できます。再入可能関数は、ローカル変数を使用するか、グローバル変数が使用されている場合はデータを保護します。
再入可能関数:
Does not hold static data over successive calls
Does not return a pointer to static data; all data is provided by the caller of the function
Uses local data or ensures protection of global data by making a local copy of it
Must not call any non-reentrant functions