
Die Ausgabe lsof
auf meinem RHEL7 zeigt, dass eine Datei mit Dateideskriptor mem
von 40 Prozessen verwendet wird. Bedeutet das, dass diese Datei 40 Mal im Speicher abgebildet ist oder was? Kann mir bitte jemand erklären, was „im Speicher abgebildete Dateien“ bedeutet? Bedeutet das, dass sie 40 Mal in meinem Speicher ist?
# lsof /usr/lib/locale/locale-archive BEFEHL PID BENUTZER FD TYP GERÄTEGRÖSSE/AUS KNOTENNAME vmtoolsd 605 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive agetty 656 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive optimiert 963 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive iostat 1199 adm mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive chkMtaMem 1205 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive snmpd 4704 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive Schlaf 5461 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive cmsubagt 6487 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive Schlaf 6649 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc1 6803 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc2 6835 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc3 6836 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc4 6856 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc5 6884 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc6 6889 usr mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc7 6893 usr1 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive cmfpagt 7704 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc8 7943 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive crond 8001 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive sh 8005 adm mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive iostat 8014 adm mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive crond 20427 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc9 20648 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc10 20649 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc10 20760 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc9 20777 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc11 21353 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc12 21354 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc13 21355 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc14 21356 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc15 21357 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc16 21358 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc17 21554 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc18 21569 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc19 21590 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc20 21647 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc21 22016 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc22 22017 Root-Speicher REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc23 22104 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive proc24 22122 usr2 mem REG 8,5 106070960 50808629 /usr/lib/locale/locale-archive
Antwort1
Sehen Sie sich den Unterschied zwischen virtuellem und physischem Speicher an.
Mehrere Prozesse können denselben physischen Speicher abbilden. Wenn 10 Prozesse dieselbe Datei abbilden, wird höchstens eine Kopie im RAM zwischengespeichert.
Wenn der Speicher nicht gemeinsam genutzt wird und ein Prozess ihn ändert, wird diese eine Seite (mit der Änderung) vor dem Schreibvorgang dupliziert. (Es wird also nicht der gesamte Speicher kopiert. Dies wird als Copy-on-Write oder COW bezeichnet.)
Eine speicherabgebildete Datei entsteht, wenn Sie das Betriebssystem auffordern, eine Datei in den Speicher abzubilden. Die Datei wird erst geladen, wenn Sie mit dem Lesen/Schreiben beginnen, und dann nur das, was benötigt wird. Die Speicherabbildung ist nur eine andere Schnittstelle als Lesen/Schreiben/Suchen/usw. Sie können auch über Lesen/Schreiben/Suchen auf den Speicher zugreifen.
Wie wird das also gemacht?
Dies geschieht, indem man erkennt, dass einige Dinge gleich sind: Das heißt, Swap und Dateien sind gleich; und RAM und Dateicache sind gleich. Wenn Sie also eine Datei öffnen, wird sie als Swap zugeordnet (keine Sorge, sie wird nicht zum Auslagern anderer Sachen verwendet). Wenn Sie mit dem Lesen beginnen, wird ein Segmentierungsfehler generiert und das Betriebssystem lagert ihn aus der Datei ein (die Ausnahme (Segmentierungsfehler) wird vom Betriebssystem behandelt und nicht an einen Prozess weitergegeben) (eigentlich ist es kein Segmentierungsfehler, sondern ein Seitenfehler). Es spielt keine Rolle, welche Schnittstelle Sie verwenden, Speicher oder Datei. Es sind nur Schnittstellen mit derselben Funktionalität.
Antwort2
Ja, laut Handbuch von lsof
:
FD is the File Descriptor number of the file or:
cwd current working directory;
Lnn library references (AIX);
err FD information error (see NAME column);
jld jail directory (FreeBSD);
ltx shared library text (code and data);
Mxx hex memory-mapped type number xx.
m86 DOS Merge mapped file;
mem memory-mapped file;
mmap memory-mapped device;
pd parent directory;
rtd root directory;
tr kernel trace file (OpenBSD);
txt program text (code and data);
v86 VP/ix mapped file;
Nur wenn die Zuordnung im nicht gemeinsam genutzten Modus erfolgt und ein beliebiger Prozess in den virtuellen Speicher schreibt, ist mehr als eine Kopie der Datei im physischen Speicher erforderlich. Andernfalls, wenn kein Schreibvorgang erfolgt (was ich nicht glaube), müssen die Daten nicht einmal physischen Speicher belegen, bevor ein beliebiger Prozess den Speicher liest.