ファイルシステム
第3章で学んだメインメモリ(RAM)は、電源を切るとデータが完全に消えてしまう「揮発性」のメモリです。そのため、作成したドキュメントや写真などのデータを保存しておくためには、電源を切っても消えないSSDやHDDなどのストレージ(不揮発性)に書き込む必要があります。ストレージの物理的な記録領域を、人間が扱いやすい「ファイル」として管理するOSの仕組み「ファイルシステム」について学びます。
1. 物理的な記憶域から「論理的なファイル」へ
SSDやHDDといったストレージの内部は、セクター(またはブロック)と呼ばれる「数百バイト〜数キロバイトの領域」が、多数一列に並んでいる物理的な構成です。
この物理的な構成に対して、人間が直接「1億2345万番目のセクターから3つのセクター分にデータを書く」といった命令を送るのは不可能です。
そこでOSは、このセクターの並びを抽象化し、人間が理解しやすい「ファイル(データの塊)」や「ディレクトリ(フォルダ)」という論理的なツリー構造の概念を提供します。この管理を行うOSの機能をファイルシステム(File System)と呼びます。
2. ファイルシステムの階層木(ツリー)構造
現代のほぼすべてのOSは、ルートディレクトリ(UNIX系なら /、Windowsなら C:\)を頂点として、枝分かれしていく階層木(ツリー)構造でファイルとフォルダを管理しています。
3. ファイル管理の実体:iノード(inode)モデル
ファイルシステム(特にLinuxなどのUNIX系)の内部では、ファイルはどのように管理されているのでしょうか。 実は、「ファイル名」と「データ本体の情報」は別の場所で管理されています。
ファイルシステム内には、個々のファイルに対して1枚ずつ割り当てられるiノード(inode:Index Node)と呼ばれる管理カードのような構造が存在します。
ディレクトリ(フォルダ)とは、中身が特別な構造をしたファイルに過ぎず、その実態は「ファイル名と、それに対応するiノード番号の対応表」です。
CPUがファイルにアクセスする際、以下のステップを踏みます。
- ディレクトリテーブルからファイル名(例:
"memo.txt")を検索し、対応するiノード番号(102)を特定します。 - iノードテーブルから 102番の管理カード(メタデータ)を読み出します。ここには、ファイルのサイズ、作成日時、アクセス権限、および「データ本体がディスク上のどの物理ブロックに記録されているか」が書かれています。
- その場所の情報を元に、ストレージの物理セクター(ブロック#500)からデータ本体を取り出します。
この仕組みにより、ファイル名を変更しても、データ本体を移動・コピーする必要はなく、ディレクトリテーブル上の「ファイル名」の文字列を書き換えるだけでリネームが完了します。
4. アクセス権限(パーミッション)による保護
ファイルシステムは、各iノードにアクセス権限(Permission)を設定することで、システムを保護しています。 主に以下の3つの権限が、ファイルの「所有者(ユーザー)」「グループ」「その他全員」に対して個別に設定されます。
- 読み取り(Read - r):ファイルの内容を表示する、コピーする権限。
- 書き込み(Write - w):ファイルの内容を編集する、削除する権限。
- 実行(Execute - x):ファイルをプログラムとして起動する権限。
OSのカーネルは、アプリがシステムコールを通じてファイルアクセスを要求するたびに、この権限設定をチェックします。これにより、一般ユーザーの権限で動作するプログラムのバグなどによって、OSの動作に必要なシステムファイルが削除されたり書き換えられたりするのを防いでいます。
第4章では、オペレーティングシステム(OS)がカーネルとユーザー空間の分離によって安全性を確保し、プロセスとスレッドによって並行処理を可能にし、排他制御でデータ競合を防ぎ、ファイルシステムによってデータを永続的に管理する仕組みを学びました。
次の第5章からは、再びソフトウェアの領域に戻り、プログラムで効率的な処理を行うための「アルゴリズムとデータ構造」の世界へと進んでいきましょう。