
この質問が他の場所でまったく同じものであった場合はご容赦ください。しかし、これまでのところ、SE や他のサイトで見つけた回答は、この質問に具体的に答えるものではありませんでした。私は大学でオペレーティング システムのコースを受講しているため、ファイル システム全般についてはまったくの初心者です。
ほとんどのファイル システムには、ファイル ディレクトリ エントリを含むルート ディレクトリがあることは理解しています。これらのエントリには、ファイル名から inode 番号へのマッピングが含まれており、長さは可変です。
によるとこの答えこれらのエントリは以下のように線形に格納されると思います。
私は、目次 (TOC) エントリを使用して、inode とは何か、また、inode が物理ディスク上のファイルのデータ ブロック番号にどのようにマップされるかを完全に理解できます。
しかし、私の質問は次のとおりです。サブディレクトリ ファイルのディレクトリ エントリはどのように、どこに保存されますか?
これらはルート ディレクトリと同じ場所のどこかのオフセットに保存されていると思います。ただし、このオフセットを inode から取得する方法がわかりません。
したがって、サブディレクトリのディレクトリ エントリは、ルート ディレクトリのエントリではなく、実際にはディスクのデータ領域に保存されているように感じます。
したがって、この場合は、あるディレクトリから別のディレクトリに移動するには、ディスクが一見任意の場所から読み取る必要があり、少し非効率的に思えます。
それでも、サブディレクトリのファイル ディレクトリ エントリの場所に関する誤解を解消したいと思います。
ご協力いただければ幸いです。
答え1
ディレクトリは通常ファイルとして実装されます。ディレクトリにはinodeとデータ領域がありますが、通常は特別なシステムコールによってアクセスされます(少なくとも書き込みは行われます)。一部のシステムでは、読む通常のread(2)
システム コールを使用してディレクトリを作成します (Linux では作成されませんが、私が最後に確認した FreeBSD では作成されます)。ディレクトリ ファイルのデータ領域には、ディレクトリ エントリが含まれます。 ではext4
、ルート ディレクトリにも inode があり、inode 番号 2 に固定されています ( を試してくださいls -lid /
)。
ディレクトリをファイルのように動作させることで、ファイルにブロックを割り当てる関数が常に存在するため、ディレクトリエントリなどにスペースを割り当てることが容易になります。また、必要に応じて同じデータブロックを使用するため、ファイルデータとディレクトリリストの間に事前にスペースを割り当てる必要がありません。
ディレクトリエントリの格納方法の内部はファイルシステムによって異なり、たとえばext2
と の間で進化していますext4
。最近のシステムでは、より高速な検索のために線形リストではなくツリーを使用しています。ここ尊敬すべきFAT ファイルシステムディレクトリをファイルとして保存しますが、少なくとも古い FAT では、ルート ディレクトリは特別です。(FAT のディレクトリ エントリの構造は、もちろん Unix ファイルシステムとは異なります。)
したがって、この場合は、あるディレクトリから別のディレクトリに移動するには、ディスクが一見任意の場所から読み取る必要があり、少し非効率的に思えます。
はい。ただし、頻繁にアクセスされるディレクトリ エントリ (またはその基礎となるデータ ブロック) は、最新のオペレーティング システムではキャッシュされる可能性があります。
すべてのディレクトリの内容を集中的に保存するには、大きな領域を事前に割り当てる必要があり、ディレクトリ データ領域内でのディスク シークも必要になります。
答え2
一般的な解決策は、ルート ディレクトリ内の一部の inode が、ディレクトリでもあるエントリを指すようにすることです。多くの点で、それらはファイルとまったく同じですが、ファイル タイプは、それらをディレクトリとして解釈するようにファイル システムに指示します。
(オリジナルの Unix のような非常に古いチュートリアルでは、cat
ディレクトリも作成できると説明されています。これは一般的にはもう当てはまりません。)
言い換えれば、すべてのディレクトリは、inode ポインタの単純な線形リストです。それらのいくつかはディレクトリ ツリーのリーフ ノード (ファイル) を指し、その他は内部ノード (別のディレクトリ) を指します。ルート ディレクトリの唯一の特別な点は、それが自身の親であり、ツリーの外部に、ここからツリーのトラバースを開始するようにシステムに指示する何かがあることです。