ディスクに何回アクセスしましたか?

ディスクに何回アクセスしましたか?

これはおおよそユニバーサルUFS

私が理解したのは、絶対パス(たとえば)が与えられると、/home/userU/file.txtすべてのディレクトリとファイルがディスクにアクセスすることです。したがって、この場合、ディスクは4回アクセスされます。

1、1、1、1/home//userUfile.txt

私の質問は

  1. 上記のファイルのinodeを指すハードリンクが与えられたら/hL、ディスクアクセス順序は何ですか?
  2. 上記のファイルを指すソフトリンクが与えられた場合/sL、ディスクアクセス順序は何か?

3つの場合すべて、inodeまたは他のデータが最初にキャッシュされていないと仮定します。

ベストアンサー1

背景

次のディレクトリ設定があるとします。

$ ll
total 0
-rw-r--r-- 2 root root 0 Jul 29 23:36 afile.txt
-rw-r--r-- 2 root root 0 Jul 29 23:36 hL
lrwxrwxrwx 1 root root 9 Jul 30 01:22 sL -> afile.txt

それでは、2つの質問を見てみましょう。


質問

  1. 上記のファイルのinodeを指すハードリンク/ hLが与えられた場合、ディスクアクセス順序は何ですか?

ハードリンクを使用すると、指す元のファイル/ディレクトリと同じinode参照があります。したがって、これを読み取るための追加のHDDアクセスはありません。

たとえば、

$ stat hL | head -3
  File: ‘hL’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 667668      Links: 2

そして

$ stat afile.txt | head -3
  File: ‘afile.txt’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 667668      Links: 2

この2つの唯一の違いは名前です。したがって、両方のパスはHDDアクセス回数が等しくなります。

  1. 上記のファイルを指すソフトリンク/ sLが与えられた場合、ディスクアクセス順序は何ですか?

しかし、ソフトリンクを介して追加のHDDアクセスが可能です。これらの追加アクセスは、ファイルがあるディレクトリのメタデータへのアクセスですsL。これにより、ファイルが実際にシンボリックリンクであり、他のファイル/ディレクトリを指すという詳細が返されます。

たとえば、

$ stat sL | head -3
  File: ‘sL’ -> ‘afile.txt’
  Size: 9           Blocks: 0          IO Block: 4096   symbolic link
Device: fd00h/64768d    Inode: 681295      Links: 1

ここでは、そのタイプが "Symbolic Link"であり、afile.txt

では、読む順序はどうなりますか?

Bashシェル自体を使用して、これらのファイル/ディレクトリに対してコマンドを実行すると、どのように機能するかをstrace確認できます。

[pid 18098] stat("/tmp/adir/hL", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
[pid 18098] open("/tmp/adir/hL", O_RDONLY) = 3
[pid 18098] fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0

これはコマンドの出力ですmore /tmp/adir/hL

のため/tmp/adir/hL

  • 統計/オープン(/) → 統計/オープン(tmp) → 統計/オープン(adir) → 統計/オープン(hL)

のため/tmp/adir/sL

  • 統計/オープン(/)→統計/オープン(tmp)→統計/オープン(adir)→統計/オープン(sL)→統計/オープン(afile.txt)

詳しくは

これシンボリックリンクのウィキペディアページまた、これらすべてを避けてください。

inode内にリンク値を保存すると、ディスクブロックとディスク読み取りが保存されますが、オペレーティングシステムはまだリンクのパス名を解決する必要があります。これを行うには、常に追加のinodeを読み、通常は他の(おそらく多くの)ディレクトリを読み、リストを処理する必要があります。リンクのパスコンポーネントに一致するものが見つかるまで、ファイルと各ファイルのinodeを検索します。クイックシンボリックリンクは、リンクが同じディレクトリにあるファイルを指している場合にのみ、他のシンボリックリンクよりもはるかに優れたパフォーマンスを提供します。

引用する

おすすめ記事