Wie wird das also gemacht?

Wie wird das also gemacht?

Die Ausgabe lsofauf meinem RHEL7 zeigt, dass eine Datei mit Dateideskriptor memvon 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.

verwandte Informationen