5

Inodesの概念に関するリンクを参照しています

私は部分的に混乱しています:

  1. 12 個のダイレクト ブロック ポインタ
  2. 1 つの間接ブロック ポインタ
  3. 1 つの double 間接ブロック ポインター
  4. 1 つのトリプル間接ブロック ポインター

この図では、各ポインターが 32/64 ビットであることが示されています。

  • [クエリ]: これらの値はなぜ、どのように推測されるのですか? つまり、具体的に 32 ビットまたは 64 ビットのポインターしかないのはなぜですか?

図には、各ポインター {4 バイト/8 バイト} に対して 1 つのデータ ブロック {8 KB} が示されています。

  • [クエリ]: これは実際にどのように機能しますか? つまり、8*1024 バイト / 8 バイト = 1024 バイトですか? 8KB ブロックの 8 バイト ポインターを持つ背後にあるロジックは何ですか?
4

3 に答える 3

14

最大ファイルサイズの計算例

* Assume that there are 10 direct pointers to data blocks, 1 indirect pointer, 1 double indirect pointer, and 1 triple indirect pointer
* Assume that the size of the data blocks is 1024 bytes = 1Kb, i.e., BlockSize = 1Kb
* Assume that the block numbers are represented as 4 byte unsigned integers, i.e., BlockNumberSize = 4b
* Some data blocks are used as index blocks. They store 1024 bytes / 4 bytes/entry = 256 entries
* Maximum number of bytes addressed by 10 direct pointers is

    = Number of direct pointers * Blocksize 
    = 10 * 1Kb
    = 10Kb


* Maximum number of bytes addressed by single indirect pointer is

    = NumberOfEntries * BlockSize
    = (Blocksize / BlockNumberSize) * BlockSize
    = (1Kb / 4b) * 1Kb
    = 256 * 1Kb
    = 256Kb


* Maximum number of bytes addressed by double indirect pointer is

    = NumberOfEntries^2 * BlockSize
    = (Blocksize / BlockNumberSize)^2 * BlockSize
    = (1Kb / 4b)^2 * 1Kb
    = (2^10 / 2^2)^2 * (2^10b)
    = (2^8)^2 * (2^10)b
    = (2^16) * (2^10)b
    = 2^6 * 2^20 b
    = 64 Mb


* Maximum number of bytes addressed by triple indirect pointer is

    = NumberOfEntries^3 * BlockSize
    = (Blocksize / BlockNumberSize)^3 * BlockSize
    = (1Kb / 4b)^3 * 1Kb
    = (2^10 / 2^2)^3 * (2^10b)
    = (2^8)^3 * (2^10)b
    = (2^24) * (2^10)b
    = 2^4 * 2^30 b
    = 16 Gb


* Maximum file size is 16Gb + 64Mb + 266Kb 
于 2012-01-21T13:31:52.170 に答える
10

参照されるポインタはディスクブロックアドレスです。各ポインタには、ディスク上のブロックを識別するために必要な情報が含まれています。各ディスクブロックは少なくとも512バイト(場合によっては4096または8192バイト)であるため、32ビットアドレスを使用すると、ディスクは最大512 * 4 * 1024 3 = 2 TiB(テビバイト-より一般的にはテラバイトと呼ばれます)を1/2KiBと仮定してアドレス指定できますブロック; ブロックサイズが大きくなるにつれて、それに応じてサイズが大きくなります(つまり、8KiBブロックサイズで32TiB)。より大きなディスクのアドレス指定スキームでは、より大きなブロックサイズまたはより大きなディスクアドレスに移動する必要があります。したがって、48ビットまたは64ビットのアドレスが妥当である可能性があります。

したがって、Q1に答えるために、32ビットは多くのものの一般的なサイズです。多くの場合、32ビットが十分に大きくない場合、次の適切なサイズは64ビットです。

Q2への回答:

  • 8 KiBデータブロックでは、ファイルが96 KiB以下の場合、ディスク上で12ブロック以下を使用し、それらのブロックアドレスはすべてiノード自体に直接格納されます。

  • ファイルが大きくなると、ディスクドライバーは単一の間接ブロックを割り当て、それをiノードに記録します。ドライバがブロックを取得する必要がある場合、ドライバは間接ブロックをメモリに読み込み、間接ブロックから必要なブロックのアドレスを見つけます。したがって、データに到達するには(名目上)2回の読み取りが必要ですが、もちろん間接はメモリにキャッシュされる傾向があります。

  • 8 KiBのブロックサイズと4バイトのディスクアドレスを使用すると、単一の間接ブロックに2048個のディスクアドレスを収めることができます。したがって、96 KiB +1バイトから16MiB程度のファイルの場合、間接ブロックは1つだけです。

  • ファイルがさらに大きくなると、ドライバーは二重の間接ブロックを割り当てます。二重間接ブロック内の各ポインターは、単一の間接ブロックを指します。したがって、2048個の間接ブロックを追加できます。各ブロックは実質的に16 MiBを指すことができ、最大32 GiB(約)のファイルを保存できます。

  • ファイルがさらに大きくなると、ドライバーはトリプル間接ブロックを割り当てます。トリプル間接ブロック内の2048個のポインターのそれぞれは、ダブルブロックを指しています。したがって、32ビットアドレスを使用する32ビットアドレス指定スキームでは、最大約64TiBのファイルをアドレス指定できます。その前にディスクアドレスが不足していることを除いて(32ビットアドレスから8 KiBブロックのため、最大32 TiB)。

したがって、iノード構造は32ビットディスクアドレスが処理できるよりも大きなファイルを処理できます。

読者が64ビットディスクアドレスでどのように変化するかを確認するための演習として残しておきます。

于 2010-05-02T22:08:49.317 に答える
3

答えを出す前に、ファイルシステムがどのように機能するかを理解する必要があります。

ユーザーまたはプログラムがファイルを名前で参照する場合は常に、オペレーティングシステムはその名前を使用して、対応するiノードを検索します。これにより、システムはファイルについて必要な情報を取得して、さらに操作を実行できます。つまり、Unixライクなオペレーティングシステムのファイル名は、(Microsoft Windowsシステムなどの他のオペレーティングシステムとは対照的に)ファイルに直接関連付けられるのではなく、iノード番号を持つテーブルの単なるエントリです。iノード番号とそれに対応するiノードはiノードテーブルに保持され、ファイルシステムの先頭付近を含む戦略的な場所に格納されます。

最初の質問に対する答えは、ビットスペースが合計32ビットまたは64ビットをカバーするということです。単純に2^32になり、これらすべての変数を定義するのに十分な大きさです。また、さらに使用するには、操作のビットのサイズを知る必要があります。この例では、これらはそのように定義されています。

次に、各ポインタ(サイズはディスク容量によって異なります)はデータブロック(ディスク上で8KB、ディスクにはブロックがあります)を参照しますが、UNIXファイルシステムは階層構造であることに注意してください。他の多くのテーブルを指すテーブル、そして最後に最後のテーブルがデータブロックを指します。

Unixファイルシステムを理解するのに非常に役立つこの本を読むことをお勧めします。

代替テキスト

于 2010-05-02T22:08:32.043 に答える