自己リンクと親リンク(。および..)をディレクトリエントリに保存する理由


11

階層型ディレクトリ構造にファイルを保存する以外の機能を持たない一部の組み込みデバイスを対象としたファイルシステムについて考えてみます。このファイルシステムには、UNIXやWindowsなどのシステムで使用できる多くの操作がありません(たとえば、アクセス許可は完全に異なり、ディレクトリに格納されているメタデータに関連付けられていません)。このファイルシステムでは、ハードリンクやソフトリンクの種類を許可しないため、すべてのファイルには厳密なツリー構造で一意の名前が付けられます。

ディレクトリ自体とその親へのリンクを、ディレクトリを表すディスク上のデータ構造に格納することにはメリットがありますか?

ほとんどのunixファイルシステムは...ディスク上にエントリを持っています。なぜVFS(汎用ファイルシステムドライバー)レイヤーでそれらを処理しないのでしょうか。これは歴史的な遺物ですか?正当な理由はありますか?そうであれば、正確に、それが私の組み込みシステムに関連しているかどうかを判断できますか?


プログラムが現在のディレクトリと親ディレクトリに簡単にアクセスできるように、それらは事実上のみ存在すると常に思っていました。興味深い質問ですが、ここにありますか?
ラファエル

@Raphael私の質問が広すぎる(→「本当の質問ではない」)か、多分「建設的ではない」と考えるかどうかは理解できました。しかし、私はそれが主題外であることに同意しません:それはファイルシステムの設計に関するものです、それはどのようにコンピューターサイエンスを適用しないのですか?トピックから外れていると思われる場合は、メタについての推論を説明してください。
Gilles「SO-邪悪なことをやめよう」

@Raphael質問を編集しました。うまくいけば、私の視点が組み込みOSデザイナーの視点であることが明確になるはずです。コメントしてくれてありがとう。
Gilles「SO-邪悪なことをやめなさい」

回答:


2

親ディレクトリへのリンクがあることは、私には理にかなっています。ディレクトリがない場合は、常にディレクトリのリスト全体を操作する必要があります。したがって、たとえば、/home/svick/Documents/として表現する必要があります{ /, /home/, /home/svick/, /home/svick/Documents }。そうしないと、親ディレクトリをまったく見つけることができません(または、非常に高価になります)。これは非効率的であるだけでなく、危険でもあります。重複するそのようなリストが2つある場合、ディレクトリを移動すると、簡単に同期が外れる可能性があります。

一方、親ディレクトリへの参照がある場合は、より効率的で安全です。

現在のディレクトリへのリンクを実際に設定する理由はありません。あるディレクトリを表す構造があり、そのディレクトリにアクセスしたい場合、使用.は常に完全に不要です。そのため、.リンクは実際にはファイルシステム構造に存在せず、仮想のみであると想定します。


2
同じ発言:なぜVFSレイヤーではなく各ファイルシステムでそれを行うのですか?ほとんどのLinuxファイルシステムには...エントリがあります。
Gilles「SO-邪悪なことをやめよう」

私が言ったように、私はそれがより効率的だと思います。現在のディレクトリだけを操作して、必要なときだけその親にアクセスできます。親リンクがない場合は、常にルートからのパス全体のすべてのディレクトリをメモリに保持する必要があります。また、使用するエントリごとに必要になります。
スビック

1
@svick:Gillesは、親リンクがあることと親リンクがないことを比較しませ。彼は、実際のファイルシステムにそれらを配置することと、実際のファイルシステムとユーザー空間との間のコードの中間層(vfs)によってそれらをシミュレートすることを比較しています。
rgrig

2

特別なケースが少なくなります。多くの状況で、VFSは他のディレクトリ名を処理するため、「..」を処理する場合があります。


3
ディレクトリが仮想の場合でも、プログラム(ユーザーモードと思います)は他のディレクトリと同様に処理できます。ストレージレベルで表示するリンクは実際には必要ありません。
Aryabhata

1
はい、でもVFSレイヤーで処理しないのはなぜですか?関連付けられたストレージがあるのはなぜですか?
Gilles「SO-邪悪なことをやめよう」

追加/削除関数で空のリストのケースを処理する代わりに、リンクリストをセンチネルで実装するのはなぜですか?
rgrig

@rgrig:考慮されるリンクリストの実装へのインターフェイスが、帰納的データ構造(C、Javaなど)の処理が非常に悪い言語で記述されている場合にのみ発生します。ここでは、ユーザーの観点からVFSレイヤーに直接アクセスできないため、この問題は関係ありません。
ステファン・ヒメネス

@StéphaneGimenez:この問題はある VFSがあるため、関連された C言語で書かれた
rgrig

2

私が想像できる唯一の理由は、次のシナリオです。

  1. ファイルシステムの元の実装は同じディレクトリ形式で存在していましたが、ファイルパスとサブディレクトリの概念は当時考慮されていませんでした(PDP-7 Unixファイルシステムを参照)。

  2. 次に、パスの解決とサブディレクトリが役立つと人々は考えました!

  3. 古い実装とのある程度の下位互換性を維持するために、.および..は、他のディレクトリと同じようにディスクに格納されることが決定されました。

では、40年前のソフトウェアとの下位互換性のためだけに、それらの役に立たないアーティファクトが残っているのではないでしょうか。信頼できるシナリオ?


注:また、本当の親ディレクトリのiノード番号をどこかに保存する必要があるため(これらのエントリはディレクトリへのハードリンクがこの時点で許可されていたことを思い出してください)、独自のiノード番号は、適切な健全性チェックになる場合があります。


1

私が実装する理由は見当たらない...のレベルではなく、他のいずれかにします。ただし、組み込みシステムを対象とする場合、節約できるレイヤーは何ドルにもなる可能性があるため、すべてを可能な限り低く実装することは理にかなっています。

.およびの一般的な必要性について、..それらなしで相対パスをどのように表現しますか?少なくとも..、現在のサブツリーを離れるパスには不可欠です。このようなパスが必要ない場合(おそらくツリーはアクセス権限をエンコードするための原始的な方法ですか?)は必要ありません..

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.