Wenn es ein Prozess ist, der eine große Datei liest und speichert sie in seinem Speicher (oder nur ein malloced char *), und das Hauptverfahren gegabelt ist, wenn das Kind Prozess nur aus diesem Speicher liest (oder char *), Gemäß Copy-on-Write wird der Speicher, in dem der Zeiger gespeichert ist, nicht kopiert, und Eltern und Kind teilen den gleichen Speicher, bis einer von ihnen versucht, in diesen Speicher zu schreiben. In diesem Fall erstellt der Prozess eine Kopie des Speichers und ändert das.Wie findet man heraus, wie viel Speicher zwischen gegabelten Prozessen mit Copy-on-Write unter Linux geteilt wird?
So ist meine Frage, ob es eine Copy-on-Schreib implementiert ist, ist es eine Möglichkeit, die Größe des Speichers zu wissen, dass das Kind das verwendet wird, nicht mit dem Hauptprozess geteilt? Mit anderen Worten, wie viel Speicher verwendet ein Child-Prozess tatsächlich, wenn er Elternspeicher von einigen Leseaufrufen verwendet?
oben oder ps-Befehle werden nur die Gesamtspeichermenge geben, die das Kind haben soll. (d. h. Annahme, dass Daten im Speicher oder Zeiger vom Kind kopiert werden.)
Gibt es eine Möglichkeit, die Datenmenge zu ermitteln, die tatsächlich von CoW-Semantik verwendet wird?
Ich ging durch /proc/[pid]/smaps
wie aix und Mat vorgeschlagen, aber alles, was ich war viele leere smaps Dateien gefunden. Ich habe versucht, diesen Befehl zu finden, welche Dateien Daten in ihnen hat: tail -n 5 */smaps | less
Und das o/p, die ich erhielt, war
==> 1012/smaps <==
==> 1074/smaps <==
==> 10/smaps <==
==> 1148/smaps <==
==> 11862/smaps <==
==> 11/smaps <==
==> 1355/smaps <==
==> 1356/smaps <==
==> 1357/smaps <==
==> 1358/smaps <==
==> 1361/smaps <==
==> 13/smaps <==
==> 14900/smaps <==
==> 14/smaps <==
==> 1501/smaps <==
==> 15/smaps <==
==> 1684/smaps <==
==> 1685/smaps <==
==> 16/smaps <==
==> 17772/smaps <==
==> 17827/smaps <==
==> 17/smaps <==
==> 18490/smaps <==
==> 18/smaps <==
==> 1932/smaps <==
==> 1934/smaps <==
==> 19863/smaps <==
==> 19/smaps <==
==> 1/smaps <==
==> 20125/smaps <==
==> 20126/smaps <==
==> 20127/smaps <==
==> 20128/smaps <==
==> 20129/smaps <==
==> 20134/smaps <==
==> 20135/smaps <==
==> 20811/smaps <==
==> 20868/smaps <==
==> 20/smaps <==
==> 21116/smaps <==
==> 21774/smaps <==
==> 21/smaps <==
==> 22393/smaps <==
==> 22394/smaps <==
==> 22395/smaps <==
==> 22398/smaps <==
==> 22639/smaps <==
==> 22824/smaps <==
==> 22/smaps <==
==> 23009/smaps <==
==> 23058/smaps <==
==> 23059/smaps <==
Private_Dirty: 0 kB
Referenced: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
==> 23835/smaps <==
==> 23961/smaps <==
==> 23962/smaps <==
==> 23963/smaps <==
==> 23964/smaps <==
==> 23/smaps <==
==> 24180/smaps <==
==> 24268/smaps <==
==> 24467/smaps <==
==> 24/smaps <==
==> 252/smaps <==
==> 25352/smaps <==
==> 25435/smaps <==
==> 25/smaps <==
==> 26465/smaps <==
==> 26/smaps <==
==> 27884/smaps <==
==> 27/smaps <==
==> 28/smaps <==
==> 29/smaps <==
==> 2/smaps <==
==> 303/smaps <==
==> 30/smaps <==
==> 316/smaps <==
==> 31/smaps <==
==> 32074/smaps <==
==> 32076/smaps <==
==> 32112/smaps <==
Private_Dirty: 0 kB
Referenced: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
==> 32116/smaps <==
Private_Dirty: 0 kB
Referenced: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
==> 322/smaps <==
==> 32466/smaps <==
==> 32467/smaps <==
==> 32/smaps <==
==> 33/smaps <==
==> 34/smaps <==
==> 37/smaps <==
==> 38/smaps <==
==> 3991/smaps <==
==> 3992/smaps <==
==> 39/smaps <==
==> 3/smaps <==
==> 4005/smaps <==
==> 4006/smaps <==
==> 4007/smaps <==
==> 4008/smaps <==
==> 4009/smaps <==
==> 4010/smaps <==
==> 4018/smaps <==
==> 4029/smaps <==
==> 4038/smaps <==
==> 4044/smaps <==
==> 4045/smaps <==
==> 4046/smaps <==
==> 4053/smaps <==
==> 4054/smaps <==
==> 4055/smaps <==
==> 40/smaps <==
==> 41/smaps <==
==> 42/smaps <==
==> 4339/smaps <==
==> 435/smaps <==
==> 436/smaps <==
==> 43/smaps <==
==> 44/smaps <==
==> 45/smaps <==
==> 46/smaps <==
==> 47/smaps <==
==> 48/smaps <==
==> 49/smaps <==
==> 4/smaps <==
==> 50/smaps <==
==> 51/smaps <==
==> 52/smaps <==
==> 53/smaps <==
==> 54/smaps <==
==> 55/smaps <==
==> 56/smaps <==
==> 57/smaps <==
==> 58/smaps <==
==> 5988/smaps <==
==> 59/smaps <==
==> 5/smaps <==
==> 6058/smaps <==
==> 6059/smaps <==
Private_Dirty: 0 kB
Referenced: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
==> 60/smaps <==
==> 61/smaps <==
==> 62/smaps <==
==> 63/smaps <==
==> 64/smaps <==
==> 65/smaps <==
==> 66/smaps <==
==> 67/smaps <==
==> 68/smaps <==
==> 69/smaps <==
==> 6/smaps <==
==> 70/smaps <==
==> 71/smaps <==
==> 72/smaps <==
==> 73/smaps <==
==> 74/smaps <==
==> 771/smaps <==
==> 77/smaps <==
==> 782/smaps <==
==> 78/smaps <==
==> 79/smaps <==
==> 7/smaps <==
==> 80/smaps <==
==> 814/smaps <==
==> 819/smaps <==
==> 81/smaps <==
==> 82/smaps <==
==> 83/smaps <==
==> 84/smaps <==
==> 8654/smaps <==
==> 8655/smaps <==
==> 8656/smaps <==
==> 892/smaps <==
==> 8/smaps <==
==> 949/smaps <==
==> 950/smaps <==
==> 9/smaps <==
==> self/smaps <==
Private_Dirty: 0 kB
Referenced: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Also, was soll ich jetzt tun? Ich habe Prozesse mit leeren Smaps, die ausgeführt werden. Wie bekomme ich die Smaps dieser Pid's?
Hängt vom Betriebssystem ab. Linux? – Mat
ja das os ist linux. –
http://unix.stackexchange.com/questions/33381/getting-information-about-a-process-memory-usage-from-proc-pid-smaps könnte Sie interessieren – Mat