OSアーキテクチャ(カーネルモデル)とC/C++言語で開発された代表的なOSを教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOS(Linuxカーネル)の授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Python,Solidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
- 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
- 最近は自然言語処理AIとイーサリアムに関する有益な情報発信に従事.
- (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
- (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
こういった私から学べます.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!
OSアーキテクチャ(カーネルモデル)とC/C++言語で開発された代表的なOSを紹介します.
本記事を読むとOSの過去,現在,未来がわかります!
目次
モノリシックカーネル
モノリシックカーネルは,OS全体がカーネル空間で動作するモデルです.
モノリシックカーネルは他のカーネルモデルとは異なり,それだけでコンピュータハードウェア上の高レベルの仮想インターフェースを定義している点です.
一連のプリミティブやシステムコールは,プロセス管理,並行処理,メモリ管理等のすべてのOSのサービスを実装しています.
デバイスドライバは,モジュールとしてカーネルに追加できます.
【C言語】Linux
Linuxはリーナス・トーバルズを中心にC言語で開発されたモノリシックカーネルのOSです.
LinuxはオープンソースなのでOSの研究開発で広く利用されています.
Linuxカーネルを知りたいあなたはこちらからどうぞ.
【C言語】Unix
UnixはC言語で開発されたモノリシックカーネルのOSです.
Unixの商用OSとしてはmacOS,AIX,HP-UX,Solaris等があります.
また,正式に認証を受けていないUnix系としてLinux(Androidを含む)やMINIX,BSDの派生OS(FreeBSD,NetBSD,OpenBSD,DragonFly BSD等)があります.
UnixとLinuxの比較動画はこちらです.
【C言語】xv6
xv6は,Sixth Edition Unixをマルチプロセッサx86およびRISC-V用にANSI Cで現代的に再実装したものです.
2006年にMITのオペレーティングシステム工学コースで教育用に作成されました.
xv6のRISC-V用の日本語ドキュメントはこちらです.
xv6の解説動画はこちらです.
マイクロカーネル
マイクロカーネルは,OSを実装するために必要な機構を提供できる最小に近い量のカーネルモデルです.
マイクロカーネルには,低レベルのアドレス空間管理,スレッド管理,プロセス間通信等が含まれます.
ハードウェアが複数のCPUモード(x86-64はリング,ARM64は例外レベル)を提供する場合,マイクロカーネルは一般にスーパーバイザまたはカーネルモードと呼ばれる最も特権的なレベルで実行される唯一のソフトウェアである可能性があります.
デバイスドライバ,プロトコルスタック,ファイルシステムといった従来のOSの機能は,通常マイクロカーネル自体から削除され,代わりにユーザ空間で実行されます.
マイクロカーネルをさらに最小化したカーネルをナノカーネル(またはピコカーネル)と呼ぶことがあります.
【C言語】Minix
Minixは,アムステルダム自由大学のアンドリュー・タネンバウム教授が,OSの教育用に執筆した著書「Operating Systems: Design and Implementation」の中で例として開発したUnix系のOSです.
また,Minixの由来は(MIni-Unix)です.
日本語訳の本「オペレーティングシステム」はこちらです.
アンドリュー・タネンバウム教授がMinixを語る動画です.
【C言語】Mach
Machは,カーネギーメロン大学のリチャード・ラシッド教授のMachプロジェクトによりC言語で開発されたマイクロカーネルのOSです.
Machの名前の由来は,Multiple asynchronously communication hosts(複数非同期通信ホスト)です.
MachのバージョンはMach 1.0,Mach 2.0,Mach 2.5,Mach 3.0の4種類ありますが,マイクロカーネルなのはMach 3.0のみです.
Mach 1.0,Mach 2.0,Mach 2.5はモノリシックカーネルになります.
Machの派生系は,GNU HurdのOSカーネルや,macOS,iOS,iPadOS,tvOS,watchOSに使われているXNU(後述)の基礎となっています.
【C/C++言語】L4
L4は,C/C++言語で開発されたマイクロカーネルのOSです.
L4は,単一目的の組み込み機器からマルチプロセッサのサーバまで,幅広いシステムのOSを構築するための最小かつ効率的な基盤を提供します.
L4は,オリジナルや派生した多くの種類のOS(L4マイクロカーネルファミリー)があります.
- L4(L4/x86)
- L4Ka::Hazelnut
- L4/Fiasco
- L4Ka::Pistachio
- L4/MIPS,L4/Alpha
- NICTA::L4-embedded
- seL4
L4の解説動画はこちらです.
【C++言語】Tornado/Hurricane
Tornadoは,HurricaneをベースとしてC++言語で開発されたマイクロカーネルのOSです.
Tornadoは,複数のシーケンシャルアプリケーションまたは単一のパラレルアプリケーションからOSサービスに対するアプリケーション要求の局所性と独立性が,カーネルおよびシステムサーバにおけるこれらの要求の処理における局所性と独立性に対応するように最適化されています.
Tornadoは,オブジェクト指向の構造を考慮し,すべての仮想および物理リソースを独立したオブジェクトで表現することで,この局所性を実現しました.
【C言語】Factored Operating Systems(fos)
Factored Operating Systems(fos)は,スケーラビリティを主要な設計制約とするメニーコアシステムをターゲットとしたC言語で開発されたマイクロカーネルのOSです.
fosは,スケーラビリティを高めるために時間共有に代わって空間共有が行われます.
各OSサービスは,集合的にシステムサービスを実装する通信サーバのセットにファクタリングされています.
これらのサーバは,分散型インターネットサービスが設計されているのとほぼ同じ方法で設計されています.
高レベルのインターネットサービスを提供する代わりに,これらのサーバは従来のカーネルサービスを提供し,従来のカーネルデータ構造をファクタリングされた空間的分散方法で置き換えています.
【C言語】K42
K42は,大規模な共有メモリ型NUMAマルチプロセッシングコンピュータにおけるシステムソフトウェアの性能とスケーラビリティの問題を解決するためにC言語で開発されたマイクロカーネルのOSです.
K42は,マイクロカーネルとして機能する小さな例外処理コンポーネント,Protected Procedure Call (PPC) と名付けられた高速プロセス間通信機構,およびOSの他のほとんどのコンポーネントのためのサーバで構成されています.
これらのサーバは別々のアドレス空間に存在し,マイクロカーネルや他のサーバとの通信は高速プロセス間機構に依存しています.
【C++言語】Fuchsia/Zircon
Fuchsiaは,セキュアなコンピュータを設計するためのコンセプト「Capability」に基づくC++言語で開発されたOSです.
また,Zircon(旧Magenta)はC++言語で開発されたマイクロカーネルのOSです.
FuchsiaとZirconのコードは以下になります.
Zirconはカーネル (ソースは/zircon/kernel) と,システムの起動,ハードウェアとの通信,ユーザ空間プロセスのロードと実行などに必要なユーザ空間サービス,ドライバ,ライブラリ (ソースは/zircon/system) の小さなセットで構成されています.
Fuchsiaは,Zirconの基盤の上に,より大きなOSを構築します.
Fuchsia/Zirconの解説動画はこちらです.
【C言語】HarmonyOS
HarmonyOSは,ファーウェイとHiSiliconが開発しているIoTシステムで複数のスマートデバイスと連携し相互接続するためのマイクロカーネルのOSです.
ファーウェイのスマートフォンやタブレットのOSとして採用されています.
現在の設計では,OSは様々な資源のデバイスに適したカーネルを抽象化レイヤから選択します.
IoTデバイスの場合,システムはHarmony OSとLiteOS(軽量リアルタイムOS)で動作します.
一方,スマートフォンとタブレットの場合,HarmonyOSとLinuxで動作します.
将来的には,HarmonyOSは単体で動作することを目指しています.
HarmonyOSの解説動画はこちらです.
参考:Snap
Snapは,マイクロカーネルのモデルをインスパイアして開発したユーザ空間のネットワークシステムです.
SnapはOSのカーネルモデルをネットワークシステムに応用しているので興味深いですね!
ハイブリッドカーネル
ハイブリッドカーネルは,モノリシックカーネルとマイクロカーネルの利点を組み合わせるカーネルモデルです.
ハイブリッドカーネルは定義があいまいで,Linuxの創始者「リーナス・トーバルズ」からは単なるマーケティング(As to the whole "hybrid kernel" thing - it's just marketing. ")と却下されています.
いわゆるバズワードみたいなものですね...
【C/C++言語】Windows NT
Windows NTは,Windows NTファミリーのすべてのOS(Windows 11とWindows Server 2022まで)と,Windows Phone 8,Windows Phone 8.1,Xbox Oneで利用されるC/C++言語で開発されたハイブリッドカーネルのOSです.
Windowsはクローズドソースなので,LinuxのようにOSの研究開発では利用されず,主にアプリケーションの研究開発で利用されます.
【C/C++言語】XNU
XNUは,macOS,iOS,iPadOS,tvOS,watchOSで利用されるC/C++言語で開発されたハイブリッドカーネルです.
XNUは,マイクロカーネルのメッセージパッシングにより,より大きなモジュール性とOSのより大きな部分がメモリ保護の恩恵を受けることができます.
また,XNUの一部の重要なタスクではモノリシックカーネルの速度を維持するなど,両方の技術を最大限に活用しています.
XNUのコードはこちらからダウンロードできます.
エクソカーネル
エクソカーネルは,MIT Parallel and Distributed Operating Systemsグループによって開発されたOSのカーネルモデルです.
エクソカーネルのことをライブラリOS(LibOS)と呼ぶ場合があります.
OSは一般に,(仮想)ファイルシステムのような高レベルの抽象化を通じて,アプリケーションにハードウェア資源を提供します.
エクソカーネルの背後にある考えは,アプリケーション開発者にできるだけ少ない抽象化を強制し,ハードウェア抽象化についてできるだけ多くの決定を可能にすることです.
エクソカーネルの機能はリソースの保護と多重化の確保に限定されるため,従来のマイクロカーネルによるメッセージパッシングの実装やモノリシックカーネルによる高レベル抽象化の実装に比べて,かなり単純化された小さなものとなっています.
【C言語】Aegis/XoK
MIT Parallel and Distributed Operating SystemsグループはエクソカーネルのOSとしてAegis/XoKを開発しました.
Aegisは,ストレージを限定的にサポートする概念実証のために開発されたC言語で開発されたエクソカーネルのOSです.
XoKはエクソカーネルのコンセプトをより徹底したC言語で開発されたエクソカーネルのOSです.
エクソカーネルやAegis/XoKの詳細を知りたいあなたは,以下の論文を読みましょう!
- Exokernel: An Operating System Architecture for Application-Level Resource Management
- The Exokernel Operating System Architecture
【C言語】Nemesis
Nemesisは,マルチメディア用途を念頭において考案されたC言語で開発されたエクソカーネルのOSです.
ほとんどのOSがカーネルで行っている機能を共有ライブラリで実現し,小さな軽量カーネルで設計されています.
Nemesisにより,アプリケーションのプロセスに代わってカーネルで行われる処理を減らし,その処理をプロセス自体に移すことで,資源の利用量の計算を容易にしました.
【C言語】Corey
Coreyは,カーネルデータ構造の共有をアプリケーションで制御できるように設計された実験的なOSです.
アプリケーションからの指示がない限り,単一のプロセッサのみがデータ構造を更新する必要があるように,各カーネルのデータ構造を配置します.
Coreyは,アプリケーションがコア間共有を制御し,コアを特定のOS機能に割り当てることによって,豊富なコアを活用できるようにするOSの抽象化を実装しています.
【C++言語】ExOS
ExOSは,MITのエクソカーネル(Aegis/XoK)を拡張し,再リンクの必要性をなくしたC++言語で開発されたエクソカーネルのOSです.
この処理を取り除くことで,高度なコンピュータ知識を持たない消費者がOSにアクセスしやすくなります.
これを実現するために,実行ファイルをスキャンしてシステムコールを特定します.
システムコールが特定されると,ネイティブOSのシステムコールは,適切なExOSユーザランドのシステムコール(ライブラリOSからのシステムコール)に置き換えられます.
この置き換え処理は「live relinking」と呼ばれます.
【C言語】IX
IXは,既存のカーネルが提供する強力な保護機能という重要な利点を維持しながら,高いI/O性能を提供するC言語で開発されたOSです.
※IXはエクソカーネルに似ているので,こちらのカテゴリで紹介します.
IXはハードウェア仮想化により,カーネルの管理・スケジューリング機能(コントロールプレーン)とネットワーク処理(データプレーン)を分離しています.
データプレーンアーキテクチャは,ネイティブなゼロコピーAPIをベースに,ハードウェアスレッドとネットワーキングキューをデータプレーンインスタンスに専用化します.
また,パケットのバッチ処理を完了させ,コヒーレントトラフィックとマルチコアの同期を排除することによって帯域と遅延の両方を最適化します.
OSDI 2014の講演動画です.(ベストペーパー賞を受賞しました.)
【C言語】Arrakis
Arrakisは,プロセス分離を損なうことなく,I/Oデータパス(コントロールプレーン)からカーネルを取り除くように設計されたOSです.
※ArrakisもIXと同様にエクソカーネルに似ているので,こちらのカテゴリで紹介します.
Arrakisは,リソースの再割り当てや名前の衝突を解決する必要がある場合にのみ,実行環境を設定し,アプリケーションと対話します.
パケットの送受信等のデータプレーンはユーザ空間で直接やりとりします.
アプリケーションは,アプリケーションのアドレス空間にリンクされたアプリケーション固有のライブラリを通じて,仲介されないハードウェアの能力を最大限に活用することができます.
OSDI 2014の講演動画です.(ベストペーパー賞を受賞しました.)
ユニカーネル
ユニカーネルは,ライブラリOSを利用して構築された,特殊な単一アドレス空間のマシンイメージです.
ベアメタルで動作するライブラリOSのことをエクソカーネル,(主に)ハイパーバイザー上で動作するライブラリOSのことをユニカーネルと呼びます.
これらの違いはありますが,ユニカーネルとエクソカーネルはほぼ同等の概念です.
ユニカーネルの解説動画はこちらです.
【Ocaml言語】MirageOS
MirageOSは,Ocaml言語で開発された最初のユニカーネルのOSです.
様々なクラウドコンピューティングやモバイルプラットフォームにおいて,安全で高性能なネットワークアプリケーションのためのユニカーネルを構築するライブラリOSです.
※MirageOSはC/C++言語ではなくOCaml言語ですので注意して下さい.
【C言語】Rump Kernel
Rump Kernelは,ドライバをモノリシックカーネルにコンパイルし,軽量カーネルの上のユーザ空間で動作させることができる「Anykernel」というコンセプトを最初に実装したNetBSDをベースとしたC言語で開発されたユニカーネルのOSです.
Anykernelはマイクロカーネル,エクソカーネル,ハイブリッドカーネルとはコンセプトが異なり,モノリシックカーネルの利点を維持しながら,ユーザ空間でのより速いドライバ開発と追加のセキュリティを可能にするものです.
Anykernelのコンセプトは,ドライバがモノリシックカーネルにコンパイルされるか,またはユーザ空間のプロセスとして,コードの変更なしにマイクロカーネル方式で実行される,ドライバに対するアーキテクチャ非依存のアプローチを指します.
ドライバでは,デバイスドライバだけでなくファイルシステムとネットワークスタックを含む広い概念が考慮されています.
Rump KernelのGitHubはRumprunです.
【C++言語】IncludeOS
IncludeOSは,クラウドサービスやIoT向けにC++言語で開発されたユニカーネルのOSです.
IncludeOSは,ユーザがOSを利用せず,クラウド上でC++アプリケーションを実行できるようにするものです.
IncludeOSは,アプリケーションにOSの機能を追加し,アプリケーションのための「仮想マシン」を作成することができます.
IncludeOSのアプリケーションは数十msで起動し,数MBのストレージとメモリしか必要としません.
【C/C++言語】OSv
OSvは,クラウドコンピューティングに特化したC/C++言語で開発されたユニカーネルのOSです.
仮想マシン上でゲストとして実行するために構築された特別な目的のOSであり,ベアメタルハードウェア用のドライバは含まれていません.
OSvは単一カーネルであり,単一のLinux実行ファイルまたはサポートされている実行環境(Java等)で書かれたアプリケーションを実行するように設計されています.
このため,ユーザ(マルチユーザシステムではない)やプロセスという概念をサポートせず,すべてがカーネルのアドレス空間で実行されます.
【C言語】Shinjuku
Shinjukuは,シングルアドレス空間で,ハードウェアによる仮想化のサポートにより,μs単位でのプリエンプションを実現するC言語で開発されたユニカーネルのOSです.
※東京の新宿をリスペクトした名前だと思われます.
Shinjukuは5μsごとに要求をプリエンプションする中央集権型スケジューリングポリシーを実装し,ライトテール型とヘビーテール型の両方の要求サービスの時間分布に対してうまく機能するようになります.
マルチカーネル
マルチカーネルは,マルチコアマシンを独立したコアのネットワークとして,あたかも分散システムであるかのように扱うカーネルモデルです.
マルチカーネルでは,共有メモリを前提とせず,プロセス間通信をメッセージパッシングとして実装しています.
【C言語】Barrelfish
Barrelfishは,Microsoft Researchとチューリッヒ工科大学のTimothy Roscoe教授がC言語で共同開発したマルチカーネルの最初のOSです.
Barrelfishは,従来のOSのWindowsやLinuxのスケーラビリティの課題を(ある程度は)解決した評価結果を得られています.
Microsoft ResearchによるBarrelfishの動画です.
SOSP 2009で発表されたBarrelfishの動画です.
OSDI 2014で発表されたBarrelfishの改良版「Barrelfish/DC」の動画です.
【C言語】Popcorn Linux
Popcorn LinuxはLinuxカーネルをマルチカーネルとして再設計したOSです.
※Popcorn Linuxでは,このカーネルモデルを「レプリケートカーネルOS」と呼んでいます.
Popcorn Linuxでは,各CPUまたはCPUのグループ(例えばNUMAノード)が異なるLinuxカーネルインスタンスを実行します.
マルチカーネルOSと同様にインスタンスはメモリを共有せず,メッセージパッシングで通信します.
OSの各サービスは分散サービスとして書き直されます.
Popcorn Linuxの解説動画はこちらです.
【C言語】NrOS
NrOSは,多くのPOSIXプログラムが動作する,同期に対してより安全なアプローチを持つマルチカーネルのOSです.
※論文中ではNrOSはマルチカーネルでないような記述はありますが,実際にはマルチカーネルをベースとした進化系(ヘテロなマルチカーネル)だと思われます.
NrOSは主に,並行処理を行わない単純な逐次カーネルとして構築されており,開発やその正しさの推論が容易になっています.
NrOSは,分散システムにおけるステートマシンの複製にヒントを得たノードレプリケーションを使用して,NUMAノードにまたがって拡張されます.
また,NrOSは各NUMAノードでカーネル状態を複製し,操作ログを使用して複製間の強い一貫性を維持します.
コアはローカルのカーネルレプリカから安全かつ同時に読み出すことができ,NUMAへのリモートアクセスを排除しています.
これらのカーネルレプリカは,マルチカーネルのように振る舞います.
スプリットカーネル
スプリットカーネルは,従来のOSの機能を疎結合のモニターに分散させ,各モニターはハードウェアコンポーネント上で動作し,管理するカーネルモデルです.
スプリットカーネルにより,既存のOSやソフトウェアシステムでは困難であったハードウェア資源の分割を適切に管理することができます.
【C言語】LegoOS
LegoOSは,ハードウェア資源の細分化のために設計されたスプリットカーネルのOSです.
LegoOSは名前の通り,ハードウェア資源をレゴブロックのように管理することができます.
LegoOSは,ユーザからは分散サーバの集合として見えます.
内部的には,LegoOSはCPU,メモリ,ストレージデバイスをハードウェアレベルとOSレベルの両方できれいに分離します.
OSDI 2018でのLegoOSの講演動画です.(ベストペーパー賞を受賞しました.)
ATC 2019での招待講演の動画です.
ATC 2021/OSDI 2021の共同基調講演「It's Time for Operating Systems to Rediscover Hardware」
ATC 2021/OSDI 2021でのチューリッヒ工科大学のTimothy Roscoe教授による共同基調講演「It's Time for Operating Systems to Rediscover Hardware」の動画です.
※Timothy RoscoeはマルチカーネルのBarrelfishの開発者です.
OSの過去,現在,未来を考察しています.
参考:【x86アセンブラ】MS-DOS
MS-DOSは,Microsoftにより開発されたx86アセンブラで開発されたモノリシックカーネルのOSです.
2024年4月25日にGitHubにオープンソースとして公開されました.
MS-DOSはC/C++言語ではなくx86-アセンブラで開発されたOSですが,古いOSを学びたいあなたは是非読みましょう!
1 |
$ git clone https://github.com/microsoft/MS-DOS |
まとめ
OSアーキテクチャ(カーネルモデル)とC/C++言語で開発された代表的なOSを紹介しました.
多くの種類のカーネルモデルやOSがあることがわかりました.
C/C++言語で開発された代表的なリアルタイムOSを知りたいあなたはこちらからどうぞ.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!