Linuxカーネルはマイクロカーネルアーキテクチャと比較してどうですか?


38

マイクロカーネルアーキテクチャの利点の1つは、システム全体を再起動することなく、ネットワークやファイルシステムなどの重要なサービスを停止/開始できることです。しかし、最近のLinuxカーネル(常にそうなのでしょうか?)がモジュールを使用して同じ効果を達成するオプションを提供していることを考えると、マイクロカーネルの(残りの)利点は何ですか?


5
マイクロカーネルとLinuxのトピックについては、「Linuxがモノリシックカーネルと呼ばれる理由」に対するこの非常に良い回答も参照してください。
ジル 'SO-悪であるのをやめる'

1
MicroKernel対Monolithicカーネルに関する議論を読むことができます。oreilly.com/openbook/opensources/book/appa.htmlこの論文では、Andrew TanenbaumはMicrokernelをサポートし、Linus TorvaldsはMonolithicカーネルをサポートしています。
ブーワン

回答:


35

マイクロカーネルは、モノリシックカーネルよりも、最も内側の最も信頼できるモードで実行するために必要なコードが少なくなります。これには、次のような多くの側面があります。

  • マイクロカーネルを使用すると、基本的でない機能(接続されていない、または使用されていないハードウェアのドライバーなど)を自由にロードおよびアンロードできます。これは、モジュールを介してLinux上でほとんど達成できます。
  • マイクロカーネルはより堅牢です。カーネル以外のコンポーネントがクラッシュした場合、システム全体を使用することはありません。バグのあるファイルシステムまたはデバイスドライバーは、Linuxシステムをクラッシュさせる可能性があります。Linuxには、コーディングの実践とテスト以外に、これらの問題を軽減する方法がありません。
  • マイクロカーネルの信頼できるコンピューティングベースは小さくなっています。そのため、悪意のあるデバイスドライバーやファイルシステムでさえ、システム全体を制御することはできません(たとえば、最新のUSBガジェットの疑わしい起源のドライバーは、ハードディスクを読み取ることができません)。
  • 前のポイントの結果は、通常のユーザーがモノリシックカーネルのカーネルコンポーネントになる独自のコンポーネントをロードできることです。

Unix GUIは、ユーザーウィンドウのコードであるXウィンドウを介して提供されます(ビデオデバイスドライバー(の一部)を除く)。現代の多くの大学では、普通のユーザーがFUSEを使用してファイルシステムドライバーをロードできます。Linuxネットワークパケットフィルタリングの一部は、ユーザーランドで実行できます。ただし、デバイスドライバー、スケジューラ、メモリマネージャー、およびほとんどのネットワークプロトコルは依然としてカーネルのみです。

Linuxおよびマイクロカーネルについての古典的な(古くなった場合)の読み物はTanenbaum–Torvaldsの議論です。20年後、Linuxは非常にゆっくりとマイクロカーネル構造に向かっていると言うことができます(ロード可能なモジュールは早くから登場し、FUSEはより新しい)が、まだ長い道のりがあります。

変更されたもう1つの点は、デスクトップおよびハイエンドの組み込みコンピューターでの仮想化の関連性の向上です。目的によっては、カーネルとユーザーランドの間ではなく、ハイパーバイザーとゲストOSの間の区別があります。



1
それはすべて非常に素晴らしい理論です。デバイスが何らかの形で押し込まれた場合、システムは乾杯します。操作の途中でドライバーがクラッシュした場合、ドライバーを再起動しなくても、システムは機能状態に復元されます。何らかのパフォーマンスが必要な場合、ドライバーはマルチスレッドである必要があります...そして、「1つのスケジューラ」の利点は完全に失われます。パフォーマンスが必要な場合は、メモリコピーとコンテキストスイッチを(コストが高くなるほど)回避する必要があります。「モジュール性」は失われます。一部のマイクロカーネルのサイズを調べると、ドライバーが含まれているモノリシックカーネルに匹敵するサイズと複雑さを確認できます。
フォンブランド

15

マイクロカーネルは、ユーザー空間とは対照的に、システムがカーネルモードにある時間を可能な限り最小限に制限します。

カーネルモードでクラッシュが発生すると、カーネル全体がダウンします。つまり、システム全体がダウンします。ユーザーモードでクラッシュが発生した場合、そのプロセスだけが停止します。Linuxはこの点で堅牢ですが、カーネルサブシステムが他のカーネルサブシステムのメモリを意図的または偶然に上書きする可能性があります。

マイクロカーネルの概念は、ネットワークやデバイスドライバーなど、従来はカーネルモードであった多くのものをユーザー空間に配置します。マイクロカーネルは実際には多くの責任を負わないため、よりシンプルで信頼性が高いことも意味します。IPプロトコルが単純で愚かであることを考えると、複雑さを端まで押しやり、コアを無駄にせず、堅牢なネットワークを実現します。


5

読み物へのリンクを投稿していただきありがとうございます!ブレントWの抽象的論点は健全であり、ある程度、マイクロカーネル同期メカニズムの過度の複雑性に関するクリストフLの懸念に共感します。ただし、後者のペーパーでは、メッセージベースのイベントループを見落とす可能性があると思います。イベントループは互いにメモリを共有しないため、ロックは不要であり、(IMO)宣言型コーディングスタイルに適しているため、一貫したアルゴリズムを明示的に定義できます(ラムダ計算のポイント...)-私は通常アプリをコーディングしますが、このQは楽しい学習経験
人造人間のアンドロイド

1

x86アーキテクチャを見てください。モノリシックカーネルはリング 0と3 のみを使用しています。本当に無駄です。しかし、コンテキスト切り替えが少ないため、再び高速になります。

x86リング


x86のリング構造は、過剰に設計されています。実用的ではありません(仮想マシンを除き、ますます使用されています...)
vonbrand

1
  1. モノリシックカーネルは、マイクロカーネルよりもはるかに古いです。マイクロカーネルのアイデアは1980年代の終わりに登場しましたが、Unixで使用されています。

  2. モノリシックカーネルを備えたOSの例はUNIX、LINUXであり、マイクロカーネルを備えたOSはQNX、L4、HURD、最初はハイブリッドカーネルに変換された最初のMach(MacOS Xではありません)です。MINIXでも、デバイスドライバーはカーネルの一部としてコンパイルされるため、純粋なマイクロカーネルではありません。

  3. モノリシックカーネルは、マイクロカーネルよりも高速です。最初のMachマイクロカーネルは、モノリシックカーネルよりも50%遅いです。L4のような後のバージョンは、モノリシックカーネルよりも2%または4%遅いだけです。

  4. モノリシックカーネルは一般にかさばりますが、純粋なマイクロカーネルはサイズ小さく、プロセッサの第1レベルキャッシュ(第1世代のマイクロカーネル)に収まる必要があります。

  5. モノリシックカーネルでは、デバイスドライバーはカーネルスペースにあり、マイクロカーネルデバイスドライバーはユーザースペースにあります。

  6. デバイスドライバーはカーネル空間に常駐するため、モノリシックカーネルはマイクロカーネルよりも安全性低くなります(ドライバーの障害によりクラッシュする可能性があります)。マイクロカーネルは、モノリシックカーネルよりも安全であるため、多くの軍事用デバイスで使用されています。

  7. モノリシックカーネルは信号とソケットを使用してIPCを保証し、マイクロカーネルアプローチはメッセージキューを使用します。1 番目の彼らは、コンテキストスイッチの遅かったので、マイクロカーネルのgenが不十分IPCを実装しました。

  8. モノリシックシステムに新しい機能を追加するということは、再コンパイルせずに新しい機能やパッチ追加できる一方で、カーネル全体再コンパイルすることを意味します


(4)では、リンゴとスイカを比較しています。マイクロカーネル自体には(設計上)最小限の機能のみが含まれ、モノリシックカーネルにはさらに多くの機能が含まれています。(6)は素晴らしい理論であり、ピースがどれだけ適切に開発されているか、そして実際の IPCメカニズムがどれだけ漏れやすいかに依存します(パフォーマンスのために、実際の「メッセージパッシング」はできません)。注(7)は、「メッセージキュー」の非常に複雑な処理を意味するため、その利点はほとんど無効になります。(8)の場合、たとえばLinuxの場合、カーネルに依存しないモジュールをコンパイルすることは確かに可能です。実際、これはドライバー開発のために定期的に行われます。
フォンブランド

0

Windows NT(現在のWindowsシステムの基礎となるカーネル)は、非常に小さなマイクロカーネル設計として始まりました。パフォーマンスの問題により、ますます多くの「ユーザーランド」コードが「ミコネル」に移行しました...今日、そのマイクロカーネル構造は残っています。


-1

Linuxカーネルは、モノリシックカーネルとマイクロカーネルのハイブリッドです。純粋なモノリシック実装では、実行時にロードされるモジュールはありません。


9
そうではありません。モジュールが動的にロードされるという事実は、完全なカーネル特権で実行され、モノリシックカーネルの一部として実行されるという事実を変更しません。
バルテック

3
ハイブリッド設計では、いくつかのドライバー(USB、スキャナー、プリンター、グラフィックス用)がカーネルではなくユーザー空間に実装されることが重要です。insmodとrmmodがあるからではなく、libusb、sane、cups、およびmesaがあるので、区別は明確ではなく、Linuxはハイブリッドカーネルと言えます。
マチェイピエチョトカ

-1

用語monolithic kernelとすることはmicrokernel、彼らはカーネルの設計(サイズ対構造)の異なる側面を説明するように真剣に比較することはできません。

典型的なモノリシックカーネルはSunOS-4.xカーネルであり、Linuxは基本的なカーネルのコンテンツを手動で構成するため、依然として類似しています。

Solarisカーネル(1992年の2.1以降)は、すべてのドライバーがオンデマンドで自動的にロードされ、初期ブート中にごく一部しかロードされないため、モノリシックと呼ぶことはできません。

SunOS-4.xおよびSolaris(SunOS-5.x)およびLinuxはすべてシングルコンテキスト実装です。コード全体が単一のMMUコンテキストで実行されます。

Mac OS XはMachに基づいており、MMUコンテキストによって分離されたいくつかのプロセスを備えたマルチコンテキスト実装として実行されます。この概念では、ドライバーは別個のプロセスと別個のMMUコンテキストにあります。

多くの人がMac OS Xを「マイクロカーネルシステム」と呼んでいますが、基本的なカーネルはSolarisの基本的なカーネルよりも小さくないかもしれません。

だから、single context kernels対について話す方が良いと思われるmulti context kernels


1
MacOSは、マイクロカーネル上で(本質的にモノリシックな)BSDシムを実行します。個別のプロセスへの分離はまったくなく、実際のマイクロカーネル設計ではありません。
フォンブランド

1
したがって、少なくとも2つのいわゆるカーネルプロセスを使用する設計を認めます。microkernelとにかく用語 は間違っているので、それは通常、呼び出されるべきものに使用されmulti context kernelます。
気味悪い
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.