ファイルシステム
第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章からは、再びソフトウェアの領域に戻り、プログラムで効率的な処理を行うための「アルゴリズムとデータ構造」の世界へと進んでいきましょう。