Linuxでのファイルとディレクトリに対応するハードリンクとソフトリンク方式のまとめ
まず1つ目は,ディレクトリへのハード接続を導入するとディレクトリにループを導入する可能性があり,ディレクトリが遍歴するとシステムは無限ループに陥る.シンボル接続にループを導入してもいいのではないでしょうか。では、なぜディレクトリのシンボル接続を制限しないのでしょうか。なぜならlinuxシステムでは、各ファイル(ディレクトリもファイル)がinode構造に対応しており、inodeデータ構造にはファイルタイプ(ディレクトリ、通常ファイル、シンボル接続ファイルなど)の情報が含まれているため、オペレーティングシステムはディレクトリを巡る際にシンボル接続を判断することができる。シンボル接続を判断できる以上、もちろん大きなループに入るのを防ぐための措置をとることができ、システムは8つのシンボル接続に連続して遭遇した後、遍歴を停止する。これは、ディレクトリシンボル接続がデッドループに入らない理由である。しかし,ハードコネクションでは,オペレーティングシステムで採用されるデータ構造やアルゴリズムの制限により,このようなデッドサイクルを防ぐことはできない.
2つ目の理由を説明する前に、ファイルのdentry構造がシステム空間にどのように長く保存されているか、システム空間にどのように保存されているかを見てみましょう。dentry構造には主にファイル名、ファイルのinode番号、親ディレクトリdentry構造を指すポインタ、および今回の議論に関係のない他のポインタが含まれています。ここで重要なのは、親ディレクトリを指すポインタです。システム内のすべてのdentry構造は、ファイル名とファイルの親ディレクトリdentry構造のアドレスとを組み合わせてコンパクト値を演算するコンパクト値でコンパクトテーブルに格納されます。次に、ln−dコマンドによって確立された/aに対するハード接続である2つのディレクトリ/aおよび/bがあると仮定する。このときカーネル空間には1つの/aのdentry構造と1つの/bのdentry構造が存在し,上記の知識から分かるように,/aおよび/bディレクトリの下の各ファイルまたはディレクトリにはそれぞれ対応するdentry構造がある(なぜなら/aディレクトリの下のファイル名は変更されていないが、dentry構造には親ディレクトリdentryへのポインタとコンパクト値の計算時に親ディレクトリdentry構造を考慮したアドレスがあるため、このときdentry構造は分身が乏しい)、また、この継承はすべてのサブディレクトリの下にあるファイルにも影響し、特にハード接続されたディレクトリに大量のファイルとサブディレクトリが存在する場合、多くのシステム空間を浪費します。これは2つ目の原因かもしれません。