Sie scheinen die Speicherzuordnung mit Dateien in speicherresidenten Dateisystemen zu verwechseln, zusammen mit anderen Konzepten wie der Art und Weise, wie Prozesse den Zugriff auf Dateien aufrechterhalten, selbst wenn diese verschoben werden.
Ich werde Frage für Frage gehen, um zu sehen, ob ich die Dinge klären kann.
- Angenommen, ich navigiere zu einem Verzeichnis in meinem Dateisystem und es befindet sich eine Datei in diesem Verzeichnis. Ist es möglich, dass diese Datei auf eine Region im Hauptspeicher verweist, anstatt auf eine Region auf der Festplatte?
Es verweist auf den Hauptspeicher, wenn es sich in einem speicherresidenten Dateisystem befindet, z. B. procfs, das normalerweise auf / proc gemountet ist, oder sysfs, das auf / sys ist, oder tmpfs, das manchmal auf / tmp ist.
- Wenn dies möglich ist, nennen wir dies "speicherabgebildete Datei"?
Nein. Wie stephen-kitt sagte, bezieht sich "Speicherzuordnung" auf eine Möglichkeit, auf eine Datei zuzugreifen, indem sie im Hauptspeicher "zugeordnet" und dort damit gearbeitet wird, anstatt Blöcke gleichzeitig über Funktionen wie read () und zu lesen und zu schreiben schreiben().
- Was bedeutet es, eine solche Datei im Dateisystem zu verschieben (dh eine solche Datei aus einem Verzeichnis in ein anderes zu verschieben)? Ich verstehe, dass, da die Datei speicherabgebildet ist, die mit der Datei interagierenden Prozesse immer in einen vordefinierten Bereich des Hauptspeichers schreiben. Wenn wir diese Datei öffnen (z. B. mit vim), lesen wir diesen Bereich von Hauptspeicher (es ist also keine Festplatte beteiligt). Unabhängig davon, wohin wir die Datei verschieben, funktioniert sie immer richtig, oder? Wenn ja, hat das Verschieben der Datei im Dateisystem eine Bedeutung?
Wenn Sie es innerhalb desselben Dateisystems verschieben, verschieben Sie wirklich nur eine Referenz, einen Inode von einem Verzeichnis in ein anderes. Wenn es Programme gibt, bei denen diese Datei bereits geöffnet wurde, greifen sie weiterhin auf dieselbe Datei zu, da sie den Inode bereits über einen Dateideskriptor zur Hand haben. Dies ist mit der Datei table_name.idb geschehen, die Sie in einem Kommentar erwähnt haben.
- Gibt es einen Befehl, der anzeigt, ob eine Datei dem Speicher zugeordnet ist?
Wossname hat dies bereits für Dateien mit Speicherzuordnung beantwortet. lsof
Hier erfahren Sie, welchen Prozessen die Datei im Speicher zugeordnet ist.
Um festzustellen, ob sich eine Datei in einem speicherresidenten Dateisystem befindet, können Sie die Dateisysteme und ihre Mountpunkte verwenden df
oder
mount
auflisten. Sie müssen nur wissen, welche Arten von Dateisystemen sich im Speicher befinden, indem Sie sie nachschlagen (z. B. in Wikipedia).
- Was passiert, wenn ich eine mit Speicher zugeordnete Datei mit vim öffne, einige Änderungen daran vornehme und vim speichere und schließe? Werden meine Änderungen einfach in den Hauptspeicher geschrieben? Wenn dies der Fall ist, werden andere Prozesse, die diese Datei verwenden, die Änderungen sehen, die ich gerade vorgenommen habe? Nach meiner Erfahrung haben die anderen Prozesse die Änderungen, die ich an der Datei vorgenommen habe, nicht gesehen, als ich mit vim einige Änderungen an der Datei vorgenommen habe. Was ist der Grund dafür?
Persönlich habe ich nicht die verwendete mmap
Funktion in einem C - Programm, aber wie ich es verstehe von Skimming man mmap
und info mmap
gibt es keine Magie bei der Aufrechterhaltung der In-Memory beteiligt Darstellung synchron. In seiner Grundform kopiert der Aufruf von mmap den Dateiinhalt in den Speicher und msync
wird verwendet, um ihn aus dem Speicher auf die Festplatte zurückzuschreiben. Wenn sich die Datei auf der Festplatte ändert, ist nichts vorhanden, um dies zu erkennen und die speicherinterne Darstellung in allen Prozessen, die sie zugeordnet haben, automatisch zu ändern.
BEARBEITEN: Es stellt sich heraus, dass mmap () tatsächlich versucht, die speicherinterne Darstellung unter bestimmten Bedingungen synchron zu halten. Wenn die Karte nur gelesen wird, bleibt sie auch dann synchron, wenn andere Prozesse in die Datei schreiben. Wenn es geschrieben wird (durch Zuweisen zum Speicherbereich), hängt es davon ab, welches der anscheinend obligatorischen MAP_SHARED- oder MAP_PRIVATE-Flags für mmap () bereitgestellt wird. Wenn MAP_PRIVATE angegeben ist, wird die Map von der Darstellung auf der Festplatte getrennt und ist nicht mehr synchron, bis Sie msync () verwenden. Wenn MAP_SHARED bereitgestellt wird, werden die Aktualisierungen für andere Prozesse sichtbar gemacht, denen die Datei zugeordnet ist, sowie für die Darstellung auf der Festplatte (obwohl dies nicht unbedingt unmittelbar erforderlich ist).
Ich habe gerade vim für eine vorhandene Datei geöffnet e
und den Befehl ausgeführt :w
, während ich inotifywait -m .
in einem anderen Terminal ausgeführt habe. Unter einigen seltsamen Dingen ist dies der wichtige Teil, von dem ich bekommen habe inotifywait
.
./ MOVED_FROM e
./ MOVED_TO e~
./ CREATE e
./ OPEN e
./ MODIFY e
./ CLOSE_WRITE,CLOSE e
./ ATTRIB e
./ ATTRIB e
./ DELETE e~
Vim erstellt eine neue Datei und entfernt die alte. Warum dies geschieht, anstatt die Datei zu ändern, geht über den Rahmen dieser Frage hinaus, aber der Punkt ist, dass dies eine neue Datei ist und daher einen neuen Inode hat.
Was meinen Sie nun mit anderen Prozessen, die diese Datei verwenden? Wenn Sie Prozesse meinen, bei denen die Datei währenddessen geöffnet wurde, werden die Änderungen nicht angezeigt. Dies liegt daran, dass sie zwar eine Datei mit demselben Pfad geöffnet haben, jedoch nicht dieselbe Datei. Wenn Sie Prozesse meinen, die die Datei danach möglicherweise öffnen, werden die Änderungen angezeigt. Sie öffnen die neue Datei, die Sie erstellt haben.
Es ist wichtig zu beachten, dass Programme zwar eine Datei auf der Benutzeroberfläche geöffnet zu haben scheinen, dies jedoch nicht unbedingt bedeutet, dass sie die Datei dabei offen halten. Vim ist ein Beispiel dafür, wie oben gezeigt.