ユーザー モードとカーネル モードを理解する

ほとんどのオペレーティング システムには、CPU 使用率を表示する何らかの方法があります。 Windows では、これはタスク マネージャーです。

Task Manager showing CPU usage and kernel time

CPU 使用率は一般に、アイドルでないタスクに費やした CPU 時間の単純なパーセントとして表現されます。 しかし、これは少し単純化されています。 最新のオペレーティング システムでは、CPU は実際には 2 つの非常に異なるモードで時間を費やしています。

  1. カーネル モード

    カーネル モードでは、実行コードは基盤となるハードウェアへの完全で無制限のアクセスを持っています。 実行コードは任意のCPU命令を実行し、任意のメモリアドレスを参照することができる。 カーネルモードは一般に、オペレーティング システムの最も低レベルで最も信頼できる機能として予約されています。 カーネルモードでのクラッシュは壊滅的で、PC 全体が停止します。

  2. ユーザーモード

    ユーザーモードでは、実行コードはハードウェアに直接アクセスしたりメモリを参照する能力を持ちません。 ユーザーモードで実行するコードは、ハードウェアやメモリにアクセスするためにシステムAPIに委譲する必要があります。 このような分離による保護があるため、ユーザー モードでのクラッシュは常に回復可能です。

上のスクリーンショットのように、タスクマネージャでカーネル時間の表示を有効にすることが可能です。 緑の線が総CPU時間、赤の線がカーネル時間です。

これらの 2 つのモードは単なるラベルではなく、CPU ハードウェアによって強制されます。 ユーザーモードで実行するコードが、特権的な CPU 命令にアクセスしたり、アクセス権のないメモリを変更するなど、その権限外のことを行おうとすると、トラップ可能な例外がスローされます。 システム全体がクラッシュするのではなく、その特定のアプリケーションだけがクラッシュするのです。 これがユーザーモードの価値です。

x86 CPU ハードウェアは、実際には 4 つの保護リングを提供しています。 0、1、2、および 3 です。 通常、リング 0 (カーネル) とリング 3 (ユーザー) のみが使用されます。

CPU リング モデル

2 つの分離リングのみを使用している場合、デバイス ドライバーをどこに置くべきか少し不明です – ビデオ カード、キーボード、マウス、プリンタなどを使用するコードなど。 これらのドライバは、パフォーマンスを最大化するためにカーネルモードで実行されるのでしょうか、それとも安定性を最大化するためにユーザーモードで実行されるのでしょうか? 少なくともWindowsでは、その答えは「場合による」です。 デバイスドライバは、ユーザーモードとカーネルモードのどちらで実行することもできます。 最近では、ほとんどのドライバはユーザー側に振り向けられますが、ビデオカードドライバは例外で、カーネルモードのパフォーマンスがむき出しになる必要があります。 しかし、それすらも変わりつつある。Windows Vistaでは、ビデオドライバがユーザーとカーネルのセクションに分割されているのだ。 おそらくこれが、ゲーマーが Vista ではゲームのパフォーマンスが 10 パーセントほど遅いと不満を漏らす理由でしょう。 どのようなコードがユーザー モードで実行されるべきなのか。 どのようなコードがカーネル モードで実行されるべきなのでしょうか。 あるいは、床を地下室と再定義するかもしれません。仮想化の台頭により、他のすべてのリングの下に新しいリング -1 が作成され、それは現在 x86 ハードウェア仮想化として知られています。 ユーザーモードとカーネルモードの間の移行にはコストがかかります。 本当に高価です。 たとえば、例外をスローするソフトウェアが遅いのはそのためです。 例外はカーネルモードの遷移を意味するのです。 7019>

ユーザー/カーネル間の境界線を引き直す最も一般的な例は、おそらく Web サーバーでしょう。 Microsoft の IIS 6 は、そのコア機能のかなりの部分をカーネル モードに移行しましたが、これは、特定のオープン ソース Web サーバーがカーネル モードを活用して業界のベンチマークで大勝利を収めたことが最も顕著な例です。 カーネルの最適化は(両陣営とも)静的なHTMLコンテンツにしか適用されないため、私に言わせれば、ある意味無意味な戦争だった。 しかし、ベンチマークであろうとなかろうと、すべての戦争はそのようなものです。

CPU がユーザー モードとカーネル モード間でコードを厳密に分離することは、ほとんどの人にとって完全に透明ですが、それは文字通り、常にクラッシュするコンピューターと常に壊滅的にクラッシュするコンピューターとの違いなのです。 これこそ、私たち無謀なコードを書くプログラマーが「進歩」と呼びたいものです。 というわけで、世界中のプログラマーを代表して、User modeに感謝を捧げたいと思います。 あなたはロックだ!

コメントを残す

メールアドレスが公開されることはありません。