Si hay un proceso que lee un archivo grande y lo guarda en su memoria (o simplemente un char * malloced), y ese proceso principal se bifurca, si el proceso secundario solo lee desde esa memoria (o el char *), según copy-on-write, la memoria donde se guarda el puntero no se copia, y tanto el padre como el hijo comparten la misma memoria hasta que cualquiera de ellos intente escribir en esa memoria, en cuyo caso el proceso hace una copia de la memoria y cambia eso.¿Cómo encontrar cuánta memoria se comparte entre el proceso bifurcado con copy-on-write en Linux?
Así que mi pregunta es si hay una escritura de copiar implementada, ¿hay alguna manera de saber la cantidad de memoria que usa el niño que no se comparte con el proceso principal? En otras palabras, ¿cuánta memoria usa realmente un proceso secundario si usa la memoria de algunos padres de algunas llamadas leídas?
superior, o los comandos ps solo darán la cantidad total de memoria que el niño debe tener. (es decir, suponiendo que el niño copia los datos en la memoria o el puntero).
¿Hay alguna manera de obtener la cantidad de datos que realmente usa la semántica de CoW?
Pasé por /proc/[pid]/smaps
según lo sugerido por aix y Mat, pero todo lo que encontré fue un montón de archivos de smaps vacíos. Probé este comando para encontrar los archivos que tiene datos en ellos: tail -n 5 */smaps | less
Y la O/P que me dieron fue
==> 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
Entonces, ¿qué se supone que debo hacer ahora? Tengo procesos que tienen smaps en blanco que se están ejecutando. ¿Cómo puedo obtener el toque de esos pid?
Depende del sistema operativo. Linux? – Mat
sí, el os es linux. –
http://unix.stackexchange.com/questions/33381/getting-information-about-a-process-memory-usage-from-proc-pid-smaps te puede interesar – Mat