Erstens "essen" Programme / Prozesse keinen Speicher. Sie verwenden oder werden Speicher zugewiesen.
VSZ (Größe des virtuellen Speichers in Kilobyte) ist die Summe des gesamten für den Prozess erforderlichen virtuellen Speichers. Diese Größe ist in erster Linie ein Attribut des Prozesses / Programms und nicht unter der Kontrolle des Betriebssystems.
RSS ist die Größe der residenten Gruppe, dh der dem Prozess zugewiesene physische Speicher. Dies ist der physische Speicher, der verwendet wird, um Seiten des virtuellen Speichers zu speichern, die sich während der Ausführung des Prozesses befinden (und nicht im Sicherungsspeicher liegen, dh ausgelagert werden). RSS ist kleiner oder gleich der Größe des virtuellen Speichers des Prozesses.
Beachten Sie, dass RSS manchmal als Anzahl der Seiten (die normalerweise eine Größe von 4096 Bytes haben) und nicht in Kilobytes angegeben wird. In solchen Situationen ist der Vergleich von VSZ mit RSS nicht angebracht.
Beachten Sie, dass diese beiden Größen für den Prozess gemeinsam genutzte Bibliotheken sowie Speicher für Code / Text, Daten, Heap und Stack umfassen können. Es ist Aufgabe des Betriebssystems, Prozesse zu planen und zu bestimmen, welche Seiten des Prozesses im (physischen) Speicher verbleiben und welche ausgelagert werden. Es ist wahrscheinlicher, dass die gemeinsam genutzten Bibliotheken resident bleiben als Seiten, die ausschließlich vom Prozess verwendet werden. Bei einem Prozess im Ruhezustand (z. B. STAT == D1 oder STAT == S1) können die meisten Seiten ausgetauscht und ein kleines RSS angezeigt werden. Alles unter der Kontrolle des Betriebssystems und der Dynamik der Prozessausführung.
Beachten Sie auch , dass Linux ist im Gegensatz zu den meisten anderen * nixes in diesem Linux (sofern nicht anders konfiguriert) wird overcommit Anfragen für (virtuellen) Speicher. Obwohl für den Prozess keine Seitenrahmen oder Auslagerungsspeicher zugewiesen sind (bis der Prozess versucht, auf diesen "zugewiesenen" Speicher zuzugreifen), kann sich seine VSS erhöhen.
Nachtrag : Antwort auf Kommentar
Warum ist ein Unterschied so groß? Manchmal ist VSZ 20-mal größer als RSS, auch auf Systemen ohne Swap.
Sie führen ein bestimmtes Beispiel an, ohne Angaben zu machen.
Die Overcommit-Funktion von Linux könnte ein Faktor für eine große Diskrepanz zwischen VSZ und RSS sein, wenn es keinen Swap gibt. Verfügt dieses Programm malloc()
über große, aber nicht verwendete Puffer?
Möglicherweise müssen Sie die Speichernutzung dieses Vorgangs mithilfe von Speichertools wie pmap
und selbst auswerten top
, um weitere Details zu erhalten.
Weitere Informationen finden Sie unter "Runtime_Memory_Measurement" . top
Dokumentation erklärt, dass
SWAP -- Swapped size (kb)
The swapped out portion of a task's total virtual memory image.
RES -- Resident size (kb)
The non-swapped physical memory a task has used.
RES = CODE + DATA.
VIRT -- Virtual Image (kb)
The total amount of virtual memory used by the task. It includes all code, data and shared libraries plus pages that have been swapped out.
VIRT = SWAP + RES
Ich weiß nicht, ob diese top
Definitionen den virtuellen Speicher berücksichtigen sollen, der festgeschrieben, aber noch keine physischen Ressourcen zugewiesen wurden. Ich denke, das ist der Fall, aber die VIRT-Gleichung wurde vereinfacht, indem die (ungewöhnliche) Situation weggelassen wurde, virtuellen Speicher festgeschrieben, aber noch nicht zugewiesen zu haben.
Anhang 2 : Antwort auf Kommentar
Versuchen Sie vielleicht, top oder htop auf Ihrem eigenen Computer auszuführen. Sie werden feststellen, dass es eine Reihe von Prozessen gibt, die eine erhebliche Menge an VSZ und fast kein RSS verwenden
Ich habe auf meinem Ubuntu-System nichts Interessantes gesehen:
PID PR NI VIRT RES SHR S %CPU %MEM SWAP CODE DATA nDRT COMMAND
26379 20 0 20812 7996 3496 S 4 0.4 12m 4 2828 0 gs
1082 20 0 85292 46m 15m S 2 2.5 36m 1660 30m 0 Xorg
2036 20 0 22948 8756 7148 S 1 0.4 13m 40 788 0 multiload-apple
2411 20 0 47984 19m 10m S 1 1.0 27m 1924 7584 0 python
62 20 0 0 0 0 S 0 0.0 0 0 0 0 kondemand/0
930 20 0 3236 1528 792 S 0 0.1 1708 284 820 0 dbus-daemon
1618 20 0 6964 3084 2244 S 0 0.2 3880 420 836 0 cupsd
1971 20 0 15708 3100 2484 S 0 0.2 12m 216 10m 0 udisks-daemon
2037 20 0 39316 11m 9676 S 0 0.6 26m 76 1404 0 sensors-applet
25733 20 0 2568 1280 956 R 0 0.1 1288 64 480 0 top
2473 20 0 6712 4060 1564 S 0 0.2 2652 780 2492 0 bash
Für alle Benutzerprozesse VIRT == SWAP + RES
stimmte das aber RES == CODE + DATA
nicht.
Ich habe einige SBCs, auf denen Embedded Linux ausgeführt wird, habe sie jedoch nicht top
crosskompiliert. Auf der Suche /proc/<pid>/stat
nach einem Shell-Prozess gibt es VSZ = 580 KB und RSS = 200 KB (tatsächlich 50 Seiten), aber es werden natürlich /proc/meminfo
keine Bytes für den Austausch gemeldet . Vielleicht ist es top
interessant , mit diesem SBC in Fahrt zu kommen (da ich nicht weiß, woher top
die Nummern für den Tausch stammen).
strace
Befehl zur Bestätigung). Dies würde den virtuellen Speicher auf die gleiche Weise wie eine Paging- / Swap-Operation verwenden, mit der Ausnahme, dass anstelle des Sicherungsspeichers (z. B. Swap-Partition auf der Festplatte) normale Dateien betroffen wären. Die mmap-Region würde für den verwendeten virtuellen Speicher angerechnet und nicht als Teil des RSS gezählt.