白紙の状態から始めて、ファイルシステムにまったくアクセスしていないとしましょう。stat(“ / some / dir / file”)を実行するとします。まず、カーネルはファイルを見つける必要があります。技術的には、このファイルはiノードと呼ばれます。まず、ルートディレクトリのiノードを保存するファイルシステムスーパーブロックを調べます。次に、ルートディレクトリを開き、「some」を検索し、それを開き、「dir」を検索します。最終的にファイルのiノードを検索します。
次に、iノードデータを実際に読み取る必要があります。最初に読み取った後、これもRAMにキャッシュされます。したがって、読み取りは1回だけ行う必要があります。
HDを古いレコードプレーヤーのように考えてください。針を使って適切な場所に移動すると、回転しながらものをすばやく読み続けることができます。ただし、「シーク」と呼ばれる別の場所に移動する必要がある場合は、非常に異なることを行っています。腕を物理的に動かしてから、正しい場所が針の下になるまで大皿が回転するのを待ちます。この種の物理的な動きは本質的に遅いため、ディスクのシーク時間はかなり長くなります。
だから、私たちはいつを求めるのですか?もちろん、ファイルシステムのレイアウトに依存します。ファイルシステムは、読み取りパフォーマンスを向上させるためにファイルを連続して保存しようとします。また、一般に、互いに近い単一ディレクトリのiノードも保存しようとしますが、すべてはファイルの書き込み時、ファイルシステムの断片化などに依存します。ケースでは、ファイルの各ステータスがシークを引き起こし、ファイルを開くたびに2回目のシークを引き起こします。そのため、何もキャッシュされていない場合、物事に非常に長い時間がかかるのはそのためです。
一部のファイルシステムは他のファイルシステムよりも優れているため、最適化が役立つ場合があります。アプリでいくつかのことができます。たとえば、GIOはreaddir()から受け取ったiノードをソートしてから、iノード番号がディスク順序と何らかの関係があることを期待して(通常は持っている)、前後のランダムシークを最小限に抑えます。
1つの重要なことは、シークを最小限に抑えるようにデータストレージとアプリを設計することです。たとえば、Nautilusが/ usr / binを読み取るのが遅い理由は、そこにあるファイルには通常、それぞれに対してマジックスニッフィングを行う必要がある拡張子がないためです。そのため、各ファイルを開く必要があります=>ファイルごとに1シーク=> slooooow。もう1つの例は、gconfのように多くの小さなファイルに情報を保存するアプリですが、これも悪い考えです。とにかく、実際には、待ち時間を隠そうとする以外にできることはあまりないと思います。