Linux - Dateideskriptor, Dateizeiger, Indexknoten1. Linux - Dateideskriptoren1. Dateideskriptor FdWenn 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:
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
3. Inode-Tabelle des DateisystemsJedes 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 *FILEDie 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*; 3. Indexknoten-InodeEin Indexknoten ist eine Datenstruktur, die Metadaten von Objekten im Dateisystem in Unix-ähnlichen Systemen speichert. Der Inode speichert hauptsächlich die folgenden Daten:
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 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
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. FestplattenstrukturDateien 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 ( 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:
|
<<: Zusammenfassung der verschiedenen Haltungen der MySQL-Berechtigungseskalation
>>: Beispiel für CSS3 zum Erzielen eines Div-Ein- und Ausschiebens von unten nach oben
Bei der Entwicklung begegnen wir häufig dieser Sit...
In einem Artikel vor langer Zeit habe ich über di...
Beispielvorgang für nicht festgeschriebenes Lesen...
Die Zeit der virtuellen VM Ware-Maschine CentOS s...
Inhaltsverzeichnis 1. Grundlegende Verwendung von...
border-radius:10px; /* Alle Ecken sind mit einem ...
Inhaltsverzeichnis Einführung Installieren 1. Ers...
Inhaltsverzeichnis 1. Was ist eine Fensterfunktio...
1. Frühere Versionen yum entfernen Docker Docker-...
In diesem Artikel wird der spezifische Code des j...
CocosCreator realisiert Skill-CD-Effekt In vielen...
Vorwort Dieser Artikel konzentriert sich auf die ...
Wenn Sie ein Vue-Projekt entwickeln, müssen Sie h...
Inhaltsverzeichnis 1 Element Offset-Serie 1.1 Off...
MySQL ist ein relationales Datenbankverwaltungssy...