Linuxカーネルなんもわからんから、自分なりに理解した内容をまとめた学習メモです。
ふわっとしているのであとで振り返って穴埋めします。
LinuxとほかのUNIX系カーネル
Linuxが魅力的である理由の一つとして、商用ではない点が挙げられます。ソースコードはGNU一般公衆利用許諾契約書(GNU General Public License、以下GPL)というライセンスに基づいて公開されており、誰でも自由に調べることができます。
実際、リナックスカーネルのソースコードはGitHubにて公開されており、気軽にダウンロードすることができます。ソースコードはC言語(一部Rust)で書かれています。
GNUとは?
GNU(グヌー)とは、自由ソフトウェアに基づいたオペレーティングシステム(OS)のプロジェクト、およびそのOSを指します。GNUは「GNU's Not Unix」の頭文字をとったもので、Unix互換のシステムを目指しています。GNUとOSSの違い
GNUはOSS(オープンソースソフトウェア)を開発するプロジェクトの名称で、OSSはソースコードが公開されているソフトウェアを指します。GPLとは
GPL(General Public License)とは、フリーソフトウェアの開発や配布に用いられるライセンスです。コピーレフト(copyleft)とも呼ばれ、オープンソースソフトウェア(OSS)の代表的なライセンスのひとつとして知られています。Linuxと他の代表的な商用UNIXカーネルを比較、評価
モノリシックカーネル
モノリシックカーネル(Monolithic Kernel)は、オペレーティングシステム(OS)のカーネルアーキテクチャの一種です。モノリシックカーネルでは、カーネルがすべての基本的な機能を一つの大きなコードベースで提供します。
-
すべての機能がカーネル空間内に存在:モノシリックカーネルでは、プロセス管理、メモリ管理、ファイルシステム管理、デバイスドライバなど、システムのほぼすべての機能がカーネルの一部として動作します
-
カーネルとユーザースペースの違い:ユーザー空間(アプリケーションなど)とカーネル空間は明確に分かれており、ユーザーのプログラムがカーネルの機能を利用する際には、システムコールを通じてアクセスします
-
モノリシックカーネルは、すべての機能がカーネル空間内で直接動作するため、ユーザー空間との切り替えが少なく、高速な動作が可能ですが、コードが大きくなりがちで、複雑さが増すというデメリットもあります
伝統的なUNIXカーネルのコンパイルとリンクは静的
近代的なカーネルならば、たいていカーネルコードの一部を動的に組み込んだり、削除したりすることができます。典型的な例はデバイスドライバです。モジュールを必要に応じて自動的に組み込んだり削除したりできるのがLinuxの優れている点です。
カーネルスレッド
カーネルスレッドとは、独立してスケジューリングが可能な実行コンテキストです。
- カーネルスレッドは、プロセス内で実行されますが、システム内の他のスレッドからも参照できます
- カーネルスレッドはスケジュール可能なエンティティーで、システム・スケジューラーが管理します
- カーネルスレッドは、マルチプロセッサ構成のマシンでは、異なるスレッドに異なるプロセッサを割り当てて、スレッドを並列に実行できます
イメージがとっちらかっているのであとで図にまとめる
Linuxでは、カーネルスレッドを、定期的にいくつかのカーネル関数を実行するという限定された方法でしか使用していません。これらは実行コンテキストという基本的な抽象概念からは外れます。
マルチスレッドアプリケーション支援
ほとんどの近代的なOSでは、何らかの形でマルチスレッドアプリケーションを扱うことができます。マルチスレッドなユーザアプリケーションは、多くの軽量プロセス(LightWait Process、以下LWP)から構成される場合もあります。LWPとは、共通のアドレス空間、共通の物理メモリページ、共通のオープンされたファイルなどを操作できるプロセスです。商用のUNIX系OSのLWPはすべて、カーネルスレッドベースのものです。それに対し、LinuxのLWPは基本的な実行コンテキストとみなされ、標準的ではないclone()というシステムコールで処理されます。
ここの標準的ではないの意味が十分に理解できないのでわかったらまとめる
マルチスレッドアプリケーションとは
複数のスレッドを同時に実行することができるアプリケーションのことです。スレッドは、プロセス内で並行して実行される最小の実行単位であり、複数のスレッドが同じプロセス内で動作します。Linuxカーネルはプリエンプト可能
「Priemptible Kernel」オプション指定でコンパイルしたLinuxカーネル2.6は、特権モードにある処理の流れを任意の時点で切り替えることができます。
プリエンプトとは
実行中のプログラム(タスク)を強制的に中断し、他の実行に切り替えすることマルチプロセッサ支援
UNIX系カーネルの中には、マルチプロセッサシステムで利用できるものがあります。Limux 2.6は、SMP機能を提供しています。NUMAのような異なるメモリモデルのものも扱えます。
SMP(Symmetric Multiprocessing)機能とは
複数のプロセッサ(CPU)が対称的に動作し、同時に計算を行うことができるシステムのアーキテクチャです。SMPでは、複数のプロセッサが同じメモリ空間を共有し、独立して作業を行いながら、効率的に処理を分担することができます。NUMA(Non-Uniform Memory Access)とは
コンピュータのメモリアーキテクチャの一種で、複数のプロセッサ(またはコア)がそれぞれ専用のメモリを持ちながら、他のプロセッサのメモリにもアクセスできる仕組みです。ただし、アクセスするメモリの場所によって速度が異なり、自分専用のメモリ(ローカルメモリ)へのアクセスは高速ですが、他のプロセッサが管理するメモリ(リモートメモリ)へのアクセスは遅くなることがあります。ファイルシステム
SolarisとSVR4から着想を得た、強力なオブジェクト指向の仮想ファイルシステム手法によって、他のOSで利用されているファイルシステムをLinuxに移植する作業は、ほかのOSへの移植と比べて比較的容易に行うことができます。
他と比べてどう容易なのかいまいちわからないので未来の自分に任せる
STREAMS
SVR4で導入されているSTREAMS I/Oサブシステムは、最近ではほとんどのUNIXカーネルに用意されており、デバイスドライバや端末ドライバ、ネットワークプロトコルなどのインタフェースとして多用される傾向にあります。LinuxはSTREAMSの代わりに、Berkeley Sockets、VFS、Netlink、カーネル内ネットワークスタックなどの仕組みを利用しています。STREAMSの柔軟性よりも、パフォーマンスとシンプルな設計を重視しているため、LinuxにはSTREAMSが不要とされています。
全部ただのメモです。走り書きです。