ファイルシステムの実装
序文
ファイルシステムは、データやプログラムを含むファイルコンテンツへのオンラインストレージとアクセスのためのメカニズムを提供します。ファイルシステムは、大量のデータを永続的に保存できる外部ストレージに永続的に存在します。
この章では、主に、最も一般的に使用される外部ストレージ、つまりディスクにファイルを保存してアクセスする方法について説明します。さまざまな方法を使用してファイルを整理し、ディスクスペースを割り当て、空きスペースを復元し、データの場所を追跡し、その他のオペレーティングシステムのパーツを使用して、外部メモリインターフェイスとパフォーマンスの問題を提供する方法について説明します。
1.ファイルシステムの構造
システムを維持するために外部ストレージスペースとしてディスクを選択する理由:
- インプレースで書き換えることができます
- ディスク上の任意の情報に直接アクセスできます。
- 経済的。
- ディスク構造については、次の章で詳しく説明します。
メモリとディスク: I / O効率を向上させるために、直接メモリとディスクI / Oは、実行されるバイトではなくブロック単位で転送されます。各ブロックは1つ以上のセクターです。ディスクドライブに応じて、セクターの範囲は32〜4096B、通常は512Bです。
ファイルシステムは通常、階層設計になっています。
- 機器:プリンター、キーボードなどを含むI / O機器。
- I / O制御:メモリとディスク間の情報伝達を実現するためのデバイスドライバと割り込みハンドラで構成されています。
- 基本的なファイルシステム:ディスク上の物理ブロックの読み取りと書き込みを行うには、適切なデバイスドライバーに一般的なコマンドを送信するだけで済みます。各ブロックは、その数値ディスクアドレスによって識別されます。
- ファイル編成モジュール:ファイルとその物理的および論理的ブロックを理解します。使用されるファイル割り当てタイプとファイルの場所を知っているファイル編成モジュールは、論理ブロックアドレスを基本ファイルシステムで使用される物理ブロックアドレスに変換できます。
- 論理ファイルシステム:論理ファイルシステムはメタデータを管理します。メタデータには、ファイルシステムのすべてのデータ構造が含まれますが、実際のデータは含まれません。論理ファイルシステムは、指定されたシンボルファイル名に従ってディレクトリ構造を管理し、ファイル編成モジュールに必要な情報を提供します。論理ファイルシステムは、ファイル制御ブロックを介してファイル構造を維持します。
- ファイル制御ブロック(FCB):所有者、アクセス許可、ファイルコンテンツの場所などのファイル情報が含まれます。
- ユーザープログラム
2.ファイルシステムの実装
1。概要
オペレーティングシステムが異なればファイルシステムも異なりますが、それでもいくつかの一般的なルールがあります
一般的なルールパート1:
- ブート制御ブロック(ボリュームごと):**システムがそのボリュームからオペレーティングシステムをブートする必要があるという確信が含まれています。ディスクにオペレーティングシステムがない場合、このブロックの内容は空です。これは通常、ボリュームの最初の部分です。UFSファイルシステムはブートブロック**と呼ばれ、NTFSファイルシステムはパーティションブートセクターと呼ばれます。
- ボリューム制御ブロック(ボリュームごと):**パーティションの数、ブロックのサイズ、空きブロックの数とポインター、空きFCBの数とポインターなど、ボリュームに関する詳細情報が含まれます。UFSファイルシステムはスーパーブロックと呼ばれ、NTFSファイルシステムはマスターファイルテーブル**と呼ばれます。
- ディレクトリ構造:各ファイルシステムのディレクトリ構造は、ファイルを整理するために使用されます。UFSでは、ファイル名と関連するインデックスノード番号が含まれます。NTFSのマスターファイルテーブルに保存されます。
インメモリ情報はファイルシステム管理に使用され、パフォーマンスを向上させるためにキャッシュされます。これらのデータは、ファイルシステムのインストール時にロードされ、アンロード時に破棄されます。
一般的なルールパート2:
- インストールされているすべてのボリュームに関する情報を含む、メモリ内のインストールテーブル。
- 最近アクセスしたディレクトリ情報を格納するために使用される、メモリ内のディレクトリ構造キャッシュ。
- システム全体のオープンファイルテーブルには、開いている各ファイルのFCBコピーおよびその他の情報が含まれています。
- 単一プロセスのオープンファイルテーブルには、システム全体のオープンファイルテーブルおよびその他の情報の適切なエントリへのポインタが含まれています。
典型的なFCB構成:
FCBの使用:新しいファイルを作成するために、アプリケーションは論理ファイルシステムを呼び出します。論理ファイルシステムは、ディレクトリ構造の形式を認識しています。新しいファイルを作成するために、新しいFCBが割り当てられます(ファイルシステムの作成時にファイルシステムの実装ですべてのFCBが作成されている場合、空きFCBセットから1つだけが割り当てられます)。次に、システムはカタログ情報をメモリに読み込み、カタログとPCBを新しいファイル名で更新し、結果をディスクに書き戻します。
メモリ内のファイルシステム構造:左側でファイルを開き、右側でファイルを読み取ります
2.パーティショニングとインストール
**ディスクは未加工(調理済み)として分類されます:**
- Rawディスクとは、特定のデータを格納するのに適したファイルシステムがなく、一部のデータベースがRawディスクを使用するため、ファイルシステムのないディスクを指します。
- クックドディスクは、ファイルシステムを含むディスクです。
ブート情報:ブート情報は各パーティションに保存できます。システムには起動時にファイルシステムデバイスドライバがないため、独自の形式があります。
ルートパーティション:起動時にメモリにロードされるオペレーティングシステムカーネルおよびその他のシステムファイルを含みます。
3.仮想ファイルシステム(仮想ファイルシステム、VFS)
仮想ファイルシステムは、物理ファイルシステムとファイルシステムサービスの間のインターフェイスレイヤー(VFSインターフェイス)であり、各物理ファイルシステムの必要な詳細を抽象化し、これらの異なるファイルシステムに統合システム呼び出しを提供します。インターフェース。
- VFSレイヤーは、ファイルシステムの一般的な操作を特定の実装から分離するための明確なVFSインターフェイスを定義します。
- VFSは、ネットワーク上のファイルを一意に識別するメカニズムを提供します。
- VFSは、ローカルファイルとリモートファイルを区別でき、ファイルタイプに応じてさまざまなローカルファイルをさらに区別できます。
3、ディレクトリの実現
1.線形リスト
ディレクトリを実装する最も簡単な方法は、ストレージファイル名とデータブロックポインタの線形リストを使用することです。この方法はプログラミングが簡単ですが、実行に時間がかかります。
2.ハッシュテーブル
ハッシュ関数は簡単に見つかりますが、競合が発生し、効率が低下します。しかし、それでも線形リストよりも優れています。
四、配布方法
ここでは、ファイルがディスクにどのように保存されるかについて説明します。
1.継続的な配布
連続割り当て方式では、各ファイルがディスク上の独立したブロックのセットを占有する必要があります。割り当て戦略は、第8章のメモリ割り当て戦略(最初、最適、最大)と組み合わせることができます。
利点:実装が簡単で、順次アクセスと直接アクセスをサポートし、高速アクセス速度、高効率、ファイルの内容が変更されない状況に適しています。
短所:ファイルは連続したスペースに割り当てられるため、ファイルサイズを拡張するのが難しく、外部の断片化が発生します。
- 外部フラグメンテーションの問題を解決します。別のディスクに転送し、空き領域をマージしてから、元に戻します。ただし、ダウンタイムが発生します。
- 拡張できない問題を解決します。ポインタを介して、スペースが十分でない場合、別のスペースが拡張されます。元のスペースは、ポインターを介して拡張スペースを検索します。
ディスクスペースの継続的な割り当て:
2.リンクの割り当て
リンク割り当ては、継続的な割り当てのすべての問題を解決します。リンク割り当てを使用すると、各ファイルはディスクブロックのリンクリストになり、ディスクブロックはディスク上の任意の場所に分散されます。
利点:実装が簡単で、最初のアドレスのみが必要です。外部の断片化の問題がなく、ファイルを拡張でき、事前にファイルサイズを宣言する必要がありません。
短所:
- 各ファイルブロックにはポインタがあり、スペースを占有します。
- 直接読み取ることはできません。
- 信頼性が低く、中間データブロックが失われると、チェーンが切断されます。
解決:
- ポインタスペースの占有を減らす:複数のブロックをクラスタにグループ化し、ブロックではなくクラスタごとに割り当てます(ただし、これにより内部の断片化が増加します)。
- 信頼性の向上: ファイル割り当てテーブル(FAT)を使用します。各ボリュームの先頭は、FATを格納するために使用されます。各ブロックにはFATテーブルにエントリがあり、ブロック番号でインデックスを付けることができます。FATの使用は、リンクされたリストに似ています。ディレクトリエントリには、ファイルの最初のブロックのブロック番号が含まれています。ブロック番号でインデックス付けされたFATエントリには、ファイルの次のブロックのブロック番号が含まれています。このチェーンは最後のブロックまで続き、このブロックに対応するFATエントリの値はファイルの終わりの値です。
ディスクスペースの接続割り当て:
FAT :FATの
利点: I / Oを介してFATテーブルを一度にメモリに読み込むと、ファイルの任意の位置へのランダムアクセスを実現できます。高い安定性。
FATの欠点:キャッシュを使用せずにFATテーブルがメモリに読み込まれると、アクセスごとに最初にFATにアクセスするため、アクセス時間が長くなります。
3.インデックスの割り当て
リンクされた割り当ては、外部の断片化と継続的な割り当てのサイズ宣言の問題を解決します。ただし、FATを使用しない場合、リンク割り当ては直接アクセスを効果的にサポートできません。これは、ポインタとブロックがディスク全体に分散されているため、順番に読み取る必要があるためです。
インデックスの割り当て:この問題は、すべてのポインタをまとめることによって、つまりインデックスブロックを介して解決されます。
利点:シーケンシャルアクセス、ランダムアクセスをサポート、ファイルを拡張できる、ファイルサイズを事前に宣言する必要がない、高い安定性、外部の断片化がない。
短所:スペースの浪費。たとえば、各ファイルの長さは1ブロックまたは2ブロックだけです。リンク割り当てでは、ブロックごとに1つのポインターのみが無駄になります。インデックス割り当てでは、1つまたは2つのポインタのみが空ではありませんが、完全なインデックスブロックを割り当てる必要があります。
問題が解決しました:
- 大きなファイルを処理するために、複数のインデックスブロックをリンクしたり、マルチレベルのインデックスを使用したりできます。
- 小さなファイルがスペースを浪費するのを防ぐために、組み合わせスキームを使用できます。たとえば、UNXファイルシステムのinode。
UNXのInode:
5、空きスペース管理
1.ビットベクトル
ビットベクトル:空き領域をビットマップとして表現します。各空き領域は1ビットで表され、空きがある場合は1であり、0として割り当てられています。たとえば、10101101010100110110101010110です。
利点:実装が比較的簡単で、継続的なスペース割り当てでファイルを簡単に生成できます。
短所:ディスクブロックが多すぎると、対応するビットマップが非常に大きくなります。
2.リンクリスト
リンクリスト:すべての空きディスクブロックをリンクリストに接続し、最初の空きブロックへのポインタをディスクの特別な場所に保存し、それをキャッシュにキャッシュします。
利点:クエリ時に占有されるメモリスペースが小さい(ほとんどを読み取るだけで十分です)
短所:信頼性が低く、空きブロックをたくさん見つけるのが難しい。また、検索には時間がかかります。
3.グループ
フリーリンクリストの場合、n個のフリーブロックのアドレスを最初のフリーブロックに格納でき、次のn-1ブロックは実際には空であり、最後のブロックには他のn個のフリーブロックのアドレスが含まれます。
利点:多数の空きブロックのアドレスをすばやく見つけることができます。
4.カウント
通常、特に連続した割り当てとクラスターが使用されている場合は、同時に割り当てまたは解放する必要がある複数の連続したブロックがあります。したがって、最初のブロックのアドレスと、最初のブロックに続く連続する空きブロックの数nを記録できます。
このように、空き領域テーブルの各エントリには、ディスクアドレスと番号が含まれます。各エントリは元のエントリよりも多くのスペースを必要としますが、連続するブロックの数が1より大きいことが多いため、テーブルの全長は短くなります。