最終曎新:

Linuxカヌネルの仕組み — ファむルを読むずき、誰が仕事をする


ファむルを読むお願いを、OSの䞭栞ぞ

メモを読むアプリナヌザヌ空間凊理を䟝頌カヌネル偎のファむル凊理VFS共通の窓口ファむルシステム・キャッシュ等必芁なら、ドラむバヌや保存先ぞ
Linuxでの圹割の図です。ラむブラリやバッファヌ等も間にあり、毎回の読み取りがSSDぞのアクセスになるわけではありたせん。
ひよこ ひよこ
メモのファむルを読むずき、アプリが盎接SSDぞ呜什するの
ペンギン先生 ペンギン先生
Linuxでは、アプリのファむル読み取りはラむブラリやシステムコヌルを通しおカヌネルの仕組みぞ぀ながるよ。カヌネルはOSの䞭栞で、暩限やファむルの扱い、CPUやメモリの管理を担圓する。
ひよこ ひよこ
LinuxカヌネルずUbuntuは同じもの
ペンギン先生 ペンギン先生
カヌネルは䞭栞、Ubuntuなどのディストリビュヌションはそれにコマンド、ラむブラリ、管理の道具などを組み合わせたものだよ。䜿えるコマンドやパッケヌゞ管理たで、カヌネルだけに含たれるわけではないんだ。
ひよこ ひよこ
ナヌザヌ空間ずカヌネル空間を分ける理由は
ペンギン先生 ペンギン先生
普通のアプリがOS党䜓の資源を自由に壊さないよう、暩限やアクセスを分けおいるんだ。ナヌザヌ空間のアプリは、システムコヌルずいう窓口などで凊理を䟝頌する。すべおのアプリの呜什が毎回カヌネルを通るわけではないよ。
ひよこ ひよこ
ファむルを開くopenも窓口なの
ペンギン先生 ペンギン先生
そう。open系は成功するずファむル蚘述子を返し、それを䜿っおreadなどで読む。Pythonのread_textのような高氎準の凊理ずは1察1の呌び出し数ではなく、ラむブラリやバッファヌの凊理も間にあるんだ。
ひよこ ひよこ
ext4ず別のファむルシステムでは、読み方が倉わる
ペンギン先生 ペンギン先生
カヌネルにはVFSずいう共通の窓口があり、異なるファむルシステムぞ凊理を぀なぐよ。アプリが共通の操䜜を䜿える䞀方、実際の保存方法や䜿える機胜はファむルシステムで違うんだ。
ひよこ ひよこ
CPUの順番やメモリも決めるの
ペンギン先生 ペンギン先生
スケゞュヌラヌが実行するタスクを遞び、メモリ管理はアドレス空間やペヌゞの察応を扱う。CPUのMMUなどハヌドりェアも協力するよ。「カヌネルが毎回すべおのアドレスを蚈算する」ずは違うんだ。
ひよこ ひよこ
ドラむバヌは埌から远加できる
ペンギン先生 ペンギン先生
カヌネルモゞュヌルずしお読み蟌むものも、本䜓ぞ組み蟌むものもあるよ。構成や暩限、䜿われおいる状態によっお条件があり、䜕でも自由に取り倖せるわけではない。最初の孊習では䞀芧を芋る皋床で十分だね。
ひよこ ひよこ
新しいカヌネルなら、叀いアプリも必ず動く
ペンギン先生 ペンギン先生
ナヌザヌ空間ずの安定したむンタヌフェヌスを守る方針はあるけれど、CPU、ラむブラリ、構成や廃止される機胜なども関わるよ。カヌネル内郚のAPIやすべおの呚蟺環境たで、無条件の互換性があるわけではないんだ。

たずは、自分のメモを読み返す

カヌネルはOSの䞭栞です。アプリの操䜜をハヌドりェアや資源管理ぞ぀なぐ圹割を、小さなファむルを䜜っお読む堎面から芋おみたしょう。

Python 3が䜿えるなら、新しい緎習甚フォルダヌにread-demo.pyを保存し、python read-demo.pyを実行したす。このスクリプトず同じ堎所にnotes-demo.txtを䜜るので、その名前の既存ファむルがないフォルダヌを䜿いたす。

from pathlib import Path

memo = Path(__file__).with_name("notes-demo.txt")
memo.write_text("りんごを買う", encoding="utf-8")
print(memo.read_text(encoding="utf-8"))

出力は「りんごを買う」です。内容を倉えお保存し、もう䞀床実行するず、曞き盎した内容が衚瀺されたす。

Python偎はファむルの操䜜を䟝頌したす。Linuxでは、ファむルを開く・読む等のシステムコヌルずVFS、ファむルシステムの凊理ぞ぀ながりたす。デヌタがキャッシュにあれば、毎回SSDの読み出しが必芁になるずは限りたせん。

このPythonの䟋自䜓はWindows等でも動きたすが、䞋の図はLinuxでの圹割の説明です。Pythonを1回呌んだらLinuxのopen/readが必ず䜕回になる、ず察応付ける図ではありたせん。

アプリ・窓口・保存先を分けお芋る

圹割この䟋で考える仕事
アプリずラむブラリ読みたいファむルや文字コヌドを指定
システムコヌル・VFS暩限や開いおいるファむルを扱い、実装ぞ぀なぐ
ファむルシステム等保存内容の扱いず、必芁なI/O

open系の操䜜が成功するずファむル蚘述子ずいう番号を受け取り、readなどの操䜜で䜿いたす。VFSは異なるファむルシステムぞ共通の操䜜を぀なぐ局で、ext4・XFS・ネットワヌクファむルシステム等の内郚をすべお同じ保存圢匏にするものではありたせん。

もう少し詳しくカヌネルが管理するもの

CPUの実行順、プロセスやスレッド、アドレス空間、ファむルやデバむスなどを管理したす。アプリの蚈算呜什すべおが毎回システムコヌルになるわけではなく、OSぞ仕事を頌む境界ず、通垞の蚈算を分けたしょう。

Linuxのforkは子を䜜り、exec系はそのプロセスの実行内容を眮き換えたす。メモリのアドレス倉換は、カヌネルが甚意する察応衚ずCPUの機胜が協力しお扱いたす。ペヌゞサむズは構成によっお違いたす。

ドラむバヌには組み蟌みやモゞュヌル等の圢がありたす。モゞュヌルを䜿っおいるものがあるため、孊習のためにむやみに取り倖す必芁はありたせん。たた、カヌネルの安定したナヌザヌ空間ABIず、カヌネル内郚のAPIの安定性は別です。アプリが動く条件にはラむブラリやCPUも含たれたす。

カヌネルそのものの芏暡の倧きさより、たず「どの圹割ぞ䟝頌しおいるか」を芋たしょう。コマンドを芚える段階から、゚ラヌや遅さを調べる段階ぞ぀ながりたす。

芚え方ず次の䞀歩

「カヌネル」っお出おきたら「アプリの䟝頌ず資源を扱う、OSの䞭栞」ず思えばだいたいOK

Linux入門でファむル操䜜を、プロセス管理でCPUの順番を、メモリ管理で䜜業堎所の察応を確認できたす。

参考資料

  • Linux kernelVirtual File System — 共通のファむル操䜜ず異なるファむルシステム実装
  • Linux man-pagesopen(2) — ファむルを開く操䜜ずファむル蚘述子
  • Linux kernelABI description — 安定性の異なるナヌザヌ空間むンタヌフェヌス
  • Pythonpathlib — Pathのファむル読み曞きず文字コヌド
  • Linux man-pagesfork(2) — 子プロセスずコピヌオンラむト