[解決済み】なぜLinuxはモノリシックカーネルと呼ばれるのですか?
質問
Linuxはモノリシックカーネルだと聞きました。モノリシックカーネルとは、カーネルコード全体をコンパイル・リンクして実行ファイルにすることですか?
Linuxがモジュールをサポートできるのであれば、すべてのサブシステムをモジュールに分割して、必要なときにロードすればいいのでは?その場合、カーネルは最初にすべてのモジュールをロードする必要はなく、モジュール内の機能のインデックスを保持し、必要なときにロードすることができる。
どのように解決するのか?
モノリシックカーネルとは、すべてのサービス(ファイルシステム、VFS、デバイスドライバなど)とコア機能(スケジューリング、メモリ割り当てなど)が同じ空間を共有する緊密なグループであるカーネルのことです。これは マイクロカーネル .
マイクロカーネルは、コア機能がシステムサービスやデバイスドライバ(基本的には単なるシステムサービス)から分離されているアプローチを好みます。例えば、VFS(仮想ファイルシステム)とブロックデバイスファイルシステム(つまりminixfs)は、カーネルの空間の外側で動作する別のプロセスで、カーネル、他のサービス、ユーザープロセスと通信するためにIPCを使用します。要するに、もしそれが モジュール Linuxでは サービス は、マイクロカーネルで、分離されたプロセスを示します。
という用語を混同しないでください。 モジュラー カーネルは、モノリシックでないものであることを意味します。いくつかのモノリシックなカーネルはモジュール化できるようにコンパイルできます(たとえばLinux)。重要なのは、モジュールがコア機能を扱う同じ空間(カーネル空間)に挿入され、そこから実行されることです。
マイクロカーネルの利点は、失敗したサービスを簡単に再開できることです。例えば、ルートファイルシステムがアボートを投げてもカーネルが停止することはありません。これは欠点とも言えますが、かなり重大なバグを隠すことができるからです(あるいは、問題が継続的に修正されるように見えるので、それほど重大でないように見せることができます)。一度デプロイされたものを都合よく修正できないようなシナリオでは、大きな利点と見なされます。
マイクロカーネルの欠点は、非同期IPCメッセージングのデバッグが非常に困難になることで、特に以下のような場合です。 繊維 が実装されています。さらに、FS/writeの問題を追跡するだけでも、ユーザースペースプロセス、ブロックデバイスサービス、VFSサービス、ファイルシステムサービス、(おそらく)PCIサービスを調査することになります。もし、空白になった場合は、IPCサービスを調べることになります。これはモノリシックカーネルではしばしば容易です。 GNU Hurd は、このようなデバッグの問題に悩まされています ( リファレンス ). 複雑なメッセージキューを扱う際のチェックポイントについては、ここでは触れないことにします。マイクロカーネルは気の弱い人には向かないのです。
動作する安定したカーネルへの最短の道は、モノリシックなアプローチです。どちらのアプローチもPOSIXインターフェースを提供することができ、カーネルの設計は、単に任意の設計で実行するコードを書きたい人にとっては、ほとんど興味がないものになります。
私は、生産現場でLinux(モノリシック)を使っています。しかし、私のカーネル開発に関する学習、ハッキング、いじりのほとんどは、マイクロカーネル、具体的には ヘレンOS .
Edit
私の長ったらしい回答でここまでたどり着いた方は、きっと''secret''を読むのが楽しいでしょう。 カーネル設計に関するトーバルズとタネンバウムの大論争 '. 20年以上経った2013年に読むと、さらに面白いですよ。一番面白かったのは、最後のメッセージにあるリーナスの署名です。
Linus "my first, and hopefully last flamefest" Torvalds
もちろん、タネンバウムが「x86はすぐに時代遅れになる」と予言したのと同じように、この予言は当たらなかった。
NB:
私が「Minix"」と言った場合、Minix 3を意味するものではありません。さらに、私がThe HURDについて言及するとき、私は(主に)Machマイクロカーネルについて言及しています。私は他の人の最近の仕事を貶める意図はありません。
関連
-
[解決済み】Redisにするタイミングは?MongoDBにするタイミングは?[クローズド]
-
[解決済み】ドメイン駆動型設計。ドメインサービス、アプリケーションサービス
-
[解決済み】コンポーネントベースのゲームエンジン設計【クローズド
-
[解決済み】「Layer」と「Tier」の違いは何ですか?
-
[解決済み】オブジェクト指向のプロジェクトはどのように設計するのですか?[クローズド]
-
[解決済み】マイクロサービスアーキテクチャでGraphQLを使用するタイミングと方法
-
[解決済み】「コルーチン」と「スレッド」の違い?
-
[解決済み】なぜLinuxはモノリシックカーネルと呼ばれるのですか?
-
[解決済み] UUIDを使わざるを得ないデザインとは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Redisにするタイミングは?MongoDBにするタイミングは?[クローズド]
-
[解決済み】ドメイン駆動型設計。ドメインサービス、アプリケーションサービス
-
[解決済み】コンポーネントベースのゲームエンジン設計【クローズド
-
[解決済み】ARMアーキテクチャはx86とどう違うのですか?[クローズド]
-
[解決済み】オブジェクト指向のプロジェクトはどのように設計するのですか?[クローズド]
-
[解決済み】マイクロサービスアーキテクチャでGraphQLを使用するタイミングと方法
-
[解決済み】「コルーチン」と「スレッド」の違い?
-
[解決済み】なぜLinuxはモノリシックカーネルと呼ばれるのですか?
-
[解決済み] モノリシックカーネルとマイクロカーネルの違いは何ですか?
-
[解決済み] UUIDを使わざるを得ないデザインとは?