Details zu Linux-Dateideskriptoren, Dateizeigern und Inodes

Details zu Linux-Dateideskriptoren, Dateizeigern und Inodes

Linux - Dateideskriptor, Dateizeiger, Indexknoten

1. Linux - Dateideskriptoren

1. Dateideskriptor Fd

Wenn ein Prozess eine Datei öffnet oder eine neue Datei erstellt, gibt der Kernel einen Dateideskriptor (eine nicht negative Ganzzahl) zurück, der auf die geöffnete Datei verweist. Alle Systemaufrufe (Lesen, Schreiben), die E/A-Operationen ausführen, durchlaufen den Dateideskriptor.

Der Dateideskriptor kann als Index der Prozessdateibeschreibungstabelle verstanden werden, oder wenn die Dateibeschreibungstabelle als Array betrachtet wird, kann der Dateideskriptor als Index des Arrays betrachtet werden. Wenn eine E/A-Operation erforderlich ist, wird fd als Parameter übergeben. Der dem fd entsprechende Eintrag wird zuerst in der Prozessdateideskriptortabelle gesucht und der Handle der entsprechenden geöffneten Datei wird herausgenommen. Entsprechend dem Datei-Handle, auf das verwiesen wird, wird der Inode, auf den die Datei zeigt, in der System-fd-Tabelle gefunden, wodurch der tatsächliche Speicherort der Datei lokalisiert und die E/A-Operation ausgeführt wird.

Merkmale:

  • Jeder Dateideskriptor entspricht einer geöffneten Datei.
  • Verschiedene Dateideskriptoren können auf dieselbe Datei verweisen.
  • Dieselbe Datei kann von verschiedenen Prozessen oder mehrmals im selben Prozess geöffnet werden.

Die drei relevanten Tabellen sind:

Dateideskriptortabelle auf Prozessebene

Struktur task_struct {
  //...
  
    struct files_struct *files //Dateideskriptortabelle auf Prozessebene//...
    
};

2. Dateideskriptortabelle auf Systemebene

Der Kernel verwaltet eine打開文件表für alle geöffneten Dateien im System. Jedes Element in der Tabelle wird打開文件句柄bezeichnet. Ein Open File Handle beschreibt alle Informationen einer geöffneten Datei.

  • Der aktuelle Dateioffset (aktualisiert beim Aufruf von read() und write() oder direkt geändert mit lseek())
  • Die Statusflags, die beim Öffnen der Datei verwendet werden (d. h. der Flags-Parameter von open())
  • Dateizugriffsmodus (z. B. Nur-Lese-Modus, Nur-Schreib-Modus oder Lese-/Schreibmodus, der beim Aufruf von open() festgelegt wird)
  • Signaltreiberbezogene Einstellungen
  • Ein Verweis auf das I-Node-Objekt der Datei
  • Dateityp (z. B. reguläre Datei, Socket oder FIFO) und Zugriffsberechtigungen
  • Ein Zeiger auf eine Liste der von der Datei gehaltenen Sperren
  • Verschiedene Eigenschaften der Datei, einschließlich Dateigröße und Zeitstempel, die mit verschiedenen Arten von Vorgängen verknüpft sind

3. Inode-Tabelle des Dateisystems

Jedes Dateisystem verwaltet eine Inode-Tabelle für alle darauf gespeicherten Dateien.

Die Beziehung zwischen der Dateideskriptortabelle, der geöffneten Dateitabelle und der Inode-Tabelle:

Die Dateideskriptoren 1 und 20 von Prozess A verweisen auf denselben geöffneten Datei-Handle, da dieselbe Datei durch mehrfaches Aufrufen von open() und anderen Funktionen geöffnet wird.

Der Grund, warum Dateideskriptor 2 von Prozess A und Dateideskriptor 2 von Prozess B auf denselben geöffneten Datei-Handle zeigen, kann am Aufruf von fork() liegen. Der untergeordnete Prozess erbt die Tabelle der geöffneten Dateideskriptoren des übergeordneten Prozesses, d. h. der untergeordnete Prozess erbt die geöffnete Datei des übergeordneten Prozesses. ; oder ein Prozess übergibt einen geöffneten Dateideskriptor über einen Unix-Domain-Socket an einen anderen Prozess; oder verschiedene Prozesse rufen die Open-Funktion unabhängig voneinander auf, um dieselbe Datei zu öffnen, und dem Dateideskriptor wird derselbe zugewiesen wie dem von anderen Prozessen geöffneten Dateideskriptor.

Deskriptor 0 von Prozess A und Deskriptor 3 von Prozess B verweisen auf unterschiedliche offene Datei-Handles, aber diese Handles verweisen alle auf denselben Eintrag in der I-Node-Tabelle, also auf dieselbe Datei. Dies liegt daran, dass jeder Prozess einen open()-Aufruf für dieselbe Datei initiiert hat. Eine ähnliche Situation tritt auf, wenn derselbe Prozess dieselbe Datei zweimal öffnet.

2. Dateizeiger *FILE

Die Sprache C verwendet Dateizeiger anstelle von Dateideskriptoren als E/A-Handles. Der „Dateizeiger“ zeigt auf eine Datenstruktur namens FILE-Struktur im Prozessbenutzerbereich. Wenn Sie eine Datei über einen Dateizeiger bedienen, müssen Sie die Datei-API (fopen(), fread() usw.) aufrufen, die in der C-Sprache stdio.h bereitgestellt wird.

Dateideskriptoren sind in POSIX-Systemaufrufen direkt sichtbar und Dateizeiger sind darüber liegende C-Sprachwrapper.

int öffnen(const char *Pfad, int Zugriff, int Modus)  
DATEI *fopen(char *Dateiname, char *Modus)

Dateipfad zum Dateizeiger: filepath --fopen()-->FILE*;
Dateipfad zum Dateideskriptor: filepath--open()--fd;
Dateideskriptor zum Dateizeiger: fd--fdopen()-->FILE*;
Dateizeiger zum Dateideskriptor : FILE*--fileno()--->fd;

3. Indexknoten-Inode

Ein Indexknoten ist eine Datenstruktur, die Metadaten von Objekten im Dateisystem in Unix-ähnlichen Systemen speichert.

Der Inode speichert hauptsächlich die folgenden Daten:

  • Inode-Nummer
  • Dateigröße
  • Anzahl der belegten Blöcke und Blockgröße
  • Dateityp (normale Datei, Verzeichnis, Pipe usw.)
  • Die Gerätenummer, auf der die Datei gespeichert ist
  • Anzahl der Links
  • Lese-, Schreib- und Ausführungsberechtigungen
  • Die Benutzer-ID und Gruppen-ID des Eigentümers
  • Der Zeitpunkt des letzten Zugriffs auf die Datei und der letzten Änderung der Daten
  • Der Zeitpunkt der letzten Änderung des Inodes

stat können Metadaten angezeigt werden, und mit dem Befehl „df -i“ können die Gesamtzahl der Inodes und die Anzahl der für jede Festplattenpartition verwendeten Inodes angezeigt werden. Alle Informationen außer dem Dateinamen werden im Inode gespeichert.

Da Inodes auch Festplattenspeicher belegen, teilt das Betriebssystem die Festplatte beim Formatieren automatisch in zwei Bereiche auf. Einer ist der Datenbereich, in dem Dateidaten gespeichert werden, der andere ist der Inode-Bereich (Inode-Tabelle), in dem die im Inode enthaltenen Informationen gespeichert werden.

Die Größe jedes Inode-Knotens beträgt im Allgemeinen 128字節oder 256字節. Die Gesamtzahl der Inode-Knoten wird während der Formatierung angegeben, und im Allgemeinen wird für jeweils 1 KB oder 2 KB ein Inode festgelegt. Angenommen, auf einer 1-GB-Festplatte beträgt die Größe jedes Inode-Knotens 128 Byte und für jeweils 1 KB ist ein Inode festgelegt. Dann erreicht die Größe der Inode-Tabelle 128 MB, was 12,8 % der gesamten Festplatte entspricht.

Jede Datei hat einen Inode, daher ist es möglich, dass der Inode aufgebraucht ist, die Festplatte jedoch nicht voll ist. Das Linux-System verwendet keine Dateinamen, sondern Inodes, um Dateien zu identifizieren.

Oberflächlich betrachtet öffnen Benutzer Dateien anhand ihres Dateinamens. Tatsächlich ist dieser Prozess innerhalb des Systems in drei Schritte unterteilt: Zuerst findet das System die dem Dateinamen entsprechende Inode-Nummer, zweitens erhält es die Inode-Informationen über die Inode-Nummer und schließlich findet es basierend auf den Inode-Informationen den Block, in dem sich die Dateidaten befinden, und liest die Daten.

Eine Verzeichnisdatei ist eine Datenstruktur, die aus einer Reihe von Verzeichniseinträgen besteht, von denen jeder aus zwei Teilen besteht: dem Dateinamen und der Inode-Nummer.

1. Besondere Rolle des Inode

  • Manchmal enthalten Dateinamen Sonderzeichen, die nicht normal entfernt werden können. Zu diesem Zeitpunkt kann die Datei durch direktes Löschen des Inode-Knotens gelöscht werden.
  • Durch das Verschieben oder Umbenennen einer Datei wird nur der Dateiname geändert, die Inode-Nummer wird jedoch nicht beeinflusst.
  • Nach dem Öffnen einer Datei identifiziert das System die Datei anhand ihrer Inode-Nummer und berücksichtigt ihren Dateinamen nicht mehr. Daher kann das System den Dateinamen im Allgemeinen nicht anhand der Inode-Nummer erkennen.

Punkt 3 vereinfacht die Softwareaktualisierung und kann ohne Herunterfahren der Software und ohne Neustart aktualisiert werden. Weil das System laufende Dateien anhand der Inode-Nummer und nicht anhand des Dateinamens identifiziert. Beim Aktualisieren generiert die neue Version der Datei einen neuen Inode mit demselben Dateinamen, was keine Auswirkungen auf die laufenden Dateien hat. Wenn Sie die Software das nächste Mal ausführen, verweist der Dateiname automatisch auf die neue Version der Datei und der Inode der alten Version der Datei wird wiederverwendet.

4. Erweiterung

1. Festplattenstruktur

Dateien werden auf der Festplatte gespeichert und die kleinste Speichereinheit der Festplatte wird als „Sektor“ bezeichnet. Jeder Sektor speichert 512 Bytes (entspricht 0,5 KB).

Wenn das Betriebssystem die Festplatte liest, liest es sie nicht Sektor für Sektor, was zu ineffizient ist. Stattdessen liest es mehrere Sektoren gleichzeitig, d. h. es liest jeweils einen "Block". Dieser aus mehreren Sektoren bestehende „Block“ ist die kleinste Einheit des Dateizugriffs. Die gebräuchlichste „Blockgröße“ ist 4 KB, das heißt, acht aufeinanderfolgende Sektoren bilden einen Block.

Anhand der obigen Angaben können wir (柱面號,盤面號,扇區號) jeden „Plattenblock“ lokalisieren. Wir erwähnen häufig die Blocknummer (logische Adresse), unter der Dateidaten im externen Speicher gespeichert sind. Diese Blocknummer kann in das Adressformat (Zylindernummer, Plattenoberflächennummer, Sektornummer) konvertiert werden.

Ein „Block“ kann von dieser Adresse wie folgt gelesen werden:

① Bewegen Sie den Magnetarm entsprechend der „Zylindernummer“, um den Magnetkopf auf den angegebenen Zylinder (auch Spur genannt) zu richten.

② Aktivieren Sie den Kopf, der der angegebenen Plattenoberfläche entspricht.

③ Während sich die Platte dreht, läuft der angegebene Sektor unter dem Kopf hindurch, wodurch das Lesen/Schreiben des angegebenen Sektors abgeschlossen wird.

Dies ist das Ende dieses Artikels über die Details zu Linux-Dateideskriptoren, Dateizeigern und Indexknoten. Weitere relevante Linux-Dateideskriptoren, Dateizeiger und Indexknoten finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die verwandten Artikel weiter unten. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung des Linux-Indexknoten-Inode
  • Linux: Kein Speicherplatz mehr auf Gerät 500 – Fehler aufgrund voller Inodes
  • Details zur Linux-Netzwerkeinrichtung
  • So implementieren Sie mit MyCat die Lese-/Schreibtrennung von MySQL-Master und -Slave unter Linux
  • Versteckter Overhead von Unix/Linux-Forks
  • Informationen zu UDP in Linux
  • Linux-Swap-Partition (ausführliche Erklärung)
  • C++-Netzwerkprogrammierung unter Linux, Epoll-Technologie und IOCP-Modell unter Windows
  • Wie viele Ports kann ein Linux-Server maximal öffnen?

<<:  Zusammenfassung der verschiedenen Haltungen der MySQL-Berechtigungseskalation

>>:  Beispiel für CSS3 zum Erzielen eines Div-Ein- und Ausschiebens von unten nach oben

Artikel empfehlen

Analyse und Behandlung von Bildlaufleisten in HTML und eingebettetem Flash

Bei der Entwicklung begegnen wir häufig dieser Sit...

Detaillierte Erläuterung des MySQL-Isolationsebenen-Operationsprozesses (cmd)

Beispielvorgang für nicht festgeschriebenes Lesen...

Eine vollständige Anleitung zu CSS-Stilattributen css() und width() in jQuery

Inhaltsverzeichnis 1. Grundlegende Verwendung von...

border-radius-Methode zum Hinzufügen abgerundeter Ränder zu Elementen

border-radius:10px; /* Alle Ecken sind mit einem ...

Spezifische Verwendung von MySQL-Fensterfunktionen

Inhaltsverzeichnis 1. Was ist eine Fensterfunktio...

Detailliertes Tutorial zur Installation von Docker auf CentOS 8

1. Frühere Versionen yum entfernen Docker Docker-...

jQuery-Plugin zum Erzielen eines Code-Rain-Effekts

In diesem Artikel wird der spezifische Code des j...

CocosCreator implementiert Skill-Kühleffekt

CocosCreator realisiert Skill-CD-Effekt In vielen...

Zusammenfassung der Verwendung von TypeScript in React-Projekten

Vorwort Dieser Artikel konzentriert sich auf die ...

Detaillierte Erklärung zur Verwendung von Router-View-Komponenten in Vue

Wenn Sie ein Vue-Projekt entwickeln, müssen Sie h...

Detaillierte Erklärung dreier häufig verwendeter Webeffekte in JavaScript

Inhaltsverzeichnis 1 Element Offset-Serie 1.1 Off...