web-dev-qa-db-ja.com

ファイルシステムの構築に使用されるデータ構造

ファイル編成にはどのデータ構造が最適ですか? Bツリーは最高ですか、それともファイルへのより高速なアクセスと適切な編成を実現する別のデータ構造がありますか?ありがとう

29
Bernice

すべてのファイルシステムは異なるため、実際にファイルシステムで使用されるデータ構造は非常に多数あります。

多くのファイルシステムは、ディスクの特定のブロックが使用されているかどうかを照会するための優れたパフォーマンスを備えているため、特定の空きブロックの場所を追跡するために、ある種の ビットベクトル (通常はビットマップと呼ばれます)を使用します。圧倒的にいっぱいではないディスクの場合)、空きブロックのかなり高速な検索をサポートします。

多くの古いファイルシステム(extおよびext2)は、単純なリンクリストを使用してディレクトリ構造を格納していました。明らかに、これはほとんどのアプリケーションにとって実際には十分高速でしたが、多くの大きなディレクトリを使用する一部のタイプのアプリケーションは、顕著なパフォーマンスヒットを被りました。

XFSファイルシステムは、ディレクトリ構造とそのジャーナリングシステムを含め、ほぼすべてに B + -trees を使用することで有名でした。私の学部のOSコースで覚えていることから、哲学は、B +ツリーの実装を記述、デバッグ、およびパフォーマンス調整するのに非常に時間がかかったので、それをできるだけ使用することが理にかなっているということでした。

他のファイルシステム(ext3およびext4)は HTree と呼ばれるBツリーのバリアントを使用しますが、これはあまり馴染みのないものです。どうやらそれは、ある種のハッシュ方式を使用して分岐係数を高く保ち、使用されるディスクアクセスがほとんどないようにしています。

一部のオペレーティングシステムでは、ディレクトリ構造を保存するために splay trees を使用しようとしたが、問題が発生したという事例を聞いたことがあります。具体的には、複数のリーダーから同じディレクトリへのマルチスレッドアクセスを防止し(スプレイツリーでは、各アクセスによってツリーが再形成されるため)、ツリーのすべての要素に順次アクセスすると、ツリーがリンクリストに退化するEdgeケースが発生しました。とは言っても、これが単なる都市の伝説なのかどうかはわかりません。これらの問題は、誰かがコードを作成する前に明らかになっていたからです。

MicrosoftのFAT32システムは、どのファイルがどこに保存され、どのディスクセクターがファイル内で互いに論理的に続くかを保存する巨大な配列(ファイルアロケーションテーブル)を使用していました。主な欠点は、テーブルを事前に設定する必要があるため、ディスクに格納できるファイルのサイズに上限が設定されることです。ただし、アレイベースのシステムの実装は非常に簡単でした。

これは完全なリストではありません-私は他のファイルシステムが他のデータ構造を使用していると確信しています。しかし、私はそれがあなたに正しい方向へのプッシュを与えるのを助けることを望みます。

お役に立てれば!

38
templatetypedef