Lösung 1:
Kurz:
-
Virtuelle Größe: ist die Menge an Adressraum, die ein Prozess verwaltet. Der virtuelle Adressraum enthält alles, worauf der Prozess über Pointer (Speicheradressreferenzen) zugreifen kann. Wenn Ihr Programm beispielsweise Zugriff auf den Framebuffer Ihrer Grafikkarte erhält, wird dieser Speicher dem virtuellen Raum des Prozesses zugeordnet und erhält eine Adresse, die in einem Zeiger gespeichert wird. Speicherabgebildete Dateien und anonyme Zuordnungen werden ebenfalls in die Größe des virtuellen Adressraums eingerechnet. So ziemlich alles ist in der virtuellen Größe. Wenn Sie die Größe aller in
/proc/<pid>/maps
aufgeführten Adressbereiche zusammenfassen , es sollte Ihnen ungefähr den gleichen Wert der virtuellen Größe zurückgeben. -
Einwohnergröße: ist die Speichermenge, die speziell zu dem Prozess gehört, der sich derzeit im Speicher befindet. Das heißt, die Menge an Speicher, die nicht im Swap ist. Beachten Sie, dass sich Teile des Prozesses im Auslagerungsspeicher befinden können, selbst wenn der Prozess ausgeführt wird. Das Betriebssystem zieht diese Regionen aus dem Swap, wenn der Prozess versucht, darauf zuzugreifen. Dies sollte den Heap, die Stapel aller Threads und andere private Zuordnungen enthalten. Wenn Sie in
/proc/<pid>/maps
schauen , die[stack]
,[heap]
und andere anonyme Zuordnungen (solche ohne Dateipfade) werden entweder ausgetauscht oder in der residenten Größe berücksichtigt. -
Geteilte Größe: ist die Speichermenge, die zu mehreren Prozessen gehören kann. Wenn Sie beispielsweise vier Instanzen derselben Anwendung im Speicher geladen haben, haben Sie vier Instanzen des Heaps und mindestens vier Stacks, eine für jeden Prozess (dies ist der residente Speicher), aber Sie haben nur eine Instanz von der Binärcode des Programms und seiner Bibliotheken. Dies ist der gemeinsame Raum. Es enthält nicht nur den Binärcode des Programms und seine Bibliotheken, sondern auch Lokalisierungsdateien, schreibgeschützte Programmdaten, SysV- und POSIX-Shared-Memory-Segmente, Semaphore usw. Wenn Sie in
/proc/<pid>/maps
nachsehen , die meisten Mappings, die an Bibliotheks- und Programmdateien gebunden sind, werden gemeinsam genutzt.
Beachten Sie, dass VIRT die Vereinigung von RSS und SHR enthält und immer größer sein wird als jeder von ihnen. Es kann Regionen geben, die sowohl als RSS als auch als SHR gezählt werden.
Lösung 2:
In Juliano Antwort:
Beachten Sie, dass RSS + SHR <=VIRT, immer.
Das ist einfach falsch. SHR enthält den gesamten virtuellen Speicher, der mit anderen Prozessen geteilt werden könnte, und RSS enthält den gesamten physischen Speicher im RAM, der vom Prozess verwendet wird.
Somit wird der gesamte gemeinsam genutzte Speicher, der sich derzeit im RAM befindet, sowohl in SHR als auch in RSS gezählt, sodass SHR + RSS keine Bedeutung hat, da es Duplikatzählungen enthalten kann.
Um einen Prozess mit RSS + SHR> VIRT zu erstellen, einfach eine große Datei (1 GB) mmapen und dann vollständig lesen:Die mmaped-Datei wird in den RAM geladen, und VIRT, SHR und RSS sind jeweils etwas größer als 1 GB, also SHR + RSS> VIRT.