7 Stimmen

Verstehen des Konzepts der Inodes

Ich beziehe mich auf die Verbindung über Konzepte von Inodes

Ich bin verwirrt über Teile:

  1. 12 direkte Blockzeiger
  2. 1 einzelner indirekter Blockzeiger
  3. 1 doppelter indirekter Blockzeiger
  4. 1 dreifacher indirekter Blockzeiger

Das Diagramm besagt, dass jeder Zeiger 32/64 Bits hat.

  • [Abfrage]: Warum und wie werden diese Werte abgeleitet? Ich meine, warum speziell nur 32 oder 64 Bit-Zeiger haben?

Das Diagramm sagt: Ein Datenblock {8 KB} für jeden Zeiger {4 Bytes/8 Bytes}

  • [Abfrage]: Wie funktioniert das eigentlich? d.h. 8*1024 Bytes / 8 Bytes = 1024 Bytes? Welche Logik steckt dahinter, einen 8-Byte-Zeiger für einen 8-KB-Block zu haben?

15voto

swapnil akolkar Punkte 141

Beispiel für die Berechnung der maximalen Dateigröße

* 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

10voto

Jonathan Leffler Punkte 694013

Die Zeiger, auf die Bezug genommen wird, sind Plattenblockadressen - jeder Zeiger enthält die notwendigen Informationen, um einen Block auf der Platte zu identifizieren. Da jeder Festplattenblock mindestens 512 Byte (manchmal 4096 oder 8192 Byte) groß ist, kann die Festplatte mit 32-Bit-Adressen bis zu 512 * 4 * 1024 3 \= 2 TiB (Tebibytes - üblicherweise Terabytes genannt) unter der Annahme von 1/2-KiB-Blöcken; entsprechend größere Größen bei zunehmender Blockgröße (also 32 TiB bei 8 KiB Blockgröße). Für ein Adressierungsschema für größere Festplatten müssten Sie zu größeren Blockgrößen oder größeren Festplattenadressen übergehen - daher könnten 48-Bit- oder 64-Bit-Adressen plausibel sein.

Um Q1 zu beantworten: 32 Bits sind eine gängige Größe für viele Dinge. Wenn 32 Bit nicht mehr ausreichen, ist die nächste sinnvolle Größe oft 64 Bit.

Antwort auf Q2:

  • Bei 8-KiB-Datenblöcken benötigt die Datei, wenn sie 96 KiB oder kleiner ist, 12 Blöcke oder weniger auf der Festplatte, und alle diese Blockadressen werden direkt im Inode selbst gespeichert.

  • Wenn die Datei größer wird, weist der Festplattentreiber einen einzelnen indirekten Block zu und trägt diesen in den Inode ein. Wenn der Treiber einen Block benötigt, liest er den indirekten Block in den Speicher und findet dann die Adresse des benötigten Blocks im indirekten Block. Somit benötigt er (nominell) zwei Lesevorgänge, um an die Daten zu gelangen, obwohl der indirekte Block natürlich im Speicher zwischengespeichert wird.

  • Mit einer Blockgröße von 8 KiB und 4-Byte-Plattenadressen können Sie 2048 Plattenadressen in einem einzigen indirekten Block unterbringen. Für Dateien von 96 KiB + 1 Byte bis 16 MiB oder so gibt es also nur einen einzigen indirekten Block.

  • Wenn eine Datei noch größer wird, dann weist der Treiber einen doppelten indirekten Block zu. Jeder Zeiger im doppelten indirekten Block zeigt auf einen einzelnen indirekten Block. Sie können also 2048 weitere indirekte Blöcke haben, von denen jeder effektiv auf 16 MiB zeigen kann, was dazu führt, dass Dateien von bis zu 32 GiB (ungefähr) gespeichert werden können.

  • Wenn eine Datei noch größer wird, dann weist der Treiber einen dreifachen indirekten Block zu. Jeder der 2048 Zeiger in einem dreifachen indirekten Block verweist auf einen Doppelblock. Unter dem 32-Bit-Adressierungsschema mit 32-Bit-Adressen könnten also Dateien bis zu etwa 64 TiB adressiert werden. Allerdings sind die Festplattenadressen schon vorher erschöpft (maximal 32 TiB aufgrund der 32-Bit-Adressen in 8-KiB-Blöcken).

Die Inode-Struktur kann also Dateien handhaben, die größer sind als 32-Bit-Plattenadressen.

Ich überlasse es dem Leser als Übung, zu sehen, wie sich die Dinge mit 64-Bit-Festplattenadressen ändern.

3voto

berkay Punkte 3839

Bevor Sie die Antworten geben, sollten Sie verstehen, wie das Dateisystem funktioniert:

Wenn ein Benutzer oder ein Programm auf eine Datei mit einem Namen verweist, verwendet das Betriebssystem diesen Namen, um den entsprechenden Inode nachzuschlagen, der es dem System ermöglicht, die Informationen zu erhalten, die es für die Durchführung weiterer Operationen über die Datei benötigt. Das bedeutet, dass ein Dateiname in einem Unix-ähnlichen Betriebssystem lediglich ein Eintrag in einer Tabelle mit Inode-Nummern ist und nicht direkt mit einer Datei verknüpft ist (im Gegensatz zu anderen Betriebssystemen, wie z. B. den Microsoft Windows-Systemen). Die Inode-Nummern und die zugehörigen Inodes werden in Inode-Tabellen gespeichert, die sich an strategischen Stellen im Dateisystem befinden, unter anderem in der Nähe seines Anfangs.

Die Antwort auf die erste Frage ist, dass der Bitspeicher die gesamten 32 oder 64 Bit abdeckt. 2^32 macht einfach 2^32 und ist groß genug, um all diese Variablen zu definieren, und für weitere Anwendungen muss man die Größe der Bits für Operationen kennen.

Zweitens verweist jeder Zeiger (die Größe hängt von der Festplattenkapazität ab) auf einen Datenblock (8 KB auf der Festplatte, die Festplatte hat Blöcke), aber bedenken Sie, dass das Unix-Dateisystem eine hierarchische Struktur hat. Eine Tabelle, die auf viele andere Tabellen verweist und schließlich die letzte Tabelle, die auf den Datenblock verweist.

Ich empfehle Ihnen, dieses Buch zu lesen, es ist sehr nützlich, um die Unix-Dateisystem .

alt text

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X