Solución 1:
En resumen:
-
Tamaño virtual: es la cantidad de espacio de direcciones que administra un proceso. El espacio de direcciones virtuales contiene todo lo que el proceso puede acceder a través de punteros (referencias de direcciones de memoria). Por ejemplo, si su programa obtiene acceso al framebuffer de su tarjeta de video, esa memoria se asigna al espacio virtual del proceso y recibe una dirección que se almacena en un puntero. Los archivos mapeados en memoria y las asignaciones anónimas también se contabilizan en el tamaño del espacio de direcciones virtuales. Prácticamente todo está en el tamaño virtual. Si suma el tamaño de todos los intervalos de direcciones enumerados en
/proc/<pid>/maps
, debería devolverle aproximadamente el mismo valor del tamaño virtual. -
Tamaño del residente: es la cantidad de memoria que pertenece específicamente a ese proceso que reside actualmente en la memoria. Eso significa, la cantidad de memoria que no está en intercambio. Tenga en cuenta que partes del proceso pueden estar en la memoria de intercambio incluso cuando el proceso se está ejecutando. El sistema operativo extraerá estas regiones del intercambio cuando el proceso intente acceder a ellas. Esto debe incluir el montón, las pilas de todos los subprocesos y otras asignaciones privadas. Si miras en
/proc/<pid>/maps
, el[stack]
,[heap]
y otras asignaciones anónimas (aquellas sin rutas de archivo) se intercambian o se contabilizan en el tamaño residente. -
Tamaño compartido: es la cantidad de memoria que puede pertenecer a múltiples procesos. Por ejemplo, si tiene cuatro instancias de la misma aplicación cargadas en la memoria, tendrá cuatro instancias del montón y al menos cuatro pilas, una para cada proceso (esta es la memoria residente), pero solo tendrá una instancia de el código binario del programa y sus bibliotecas. Este es el espacio compartido. No solo incluye el código binario del programa y sus bibliotecas, sino también archivos de localización, datos del programa de solo lectura, segmentos de memoria compartida SysV y POSIX, semáforos, etc... Si miras en
/proc/<pid>/maps
, la mayoría de las asignaciones vinculadas a bibliotecas y archivos de programas se comparten.
Tenga en cuenta que VIRT contiene la unión de RSS y SHR, y siempre será mayor que cualquiera de ellos. Puede haber regiones contabilizadas como RSS y SHR.
Solución 2:
En Juliano responde:
Tenga en cuenta que RSS + SHR <=VIRT, siempre.
Esto es simplemente falso. SHR contiene toda la memoria virtual que podría compartirse con otros procesos, y RSS contiene toda la memoria físicamente en RAM que utiliza el proceso.
Por lo tanto, toda la memoria compartida actualmente en RAM se cuenta tanto en SHR como en RSS, por lo que SHR + RSS no tiene sentido, ya que puede contener recuentos duplicados.
Para construir un proceso con RSS + SHR> VIRT, simplemente mmap un archivo grande (1 GB), luego léalo completamente:el archivo mmaped se cargará en la RAM, y VIRT, SHR y RSS tendrán cada uno un poco más de 1 GB, por lo que SHR + RSS> VIRT.