voy a explicar esto con la ayuda de un ejemplo de lo que sucede cuando un programa asigna y utiliza la memoria. En concreto, este programa:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
int main(){
int *data, size, count, i;
printf("fyi: your ints are %d bytes large\n", sizeof(int));
printf("Enter number of ints to malloc: ");
scanf("%d", &size);
data = malloc(sizeof(int) * size);
if(!data){
perror("failed to malloc");
exit(EXIT_FAILURE);
}
printf("Enter number of ints to initialize: ");
scanf("%d", &count);
for(i = 0; i < count; i++){
data[i] = 1337;
}
printf("I'm going to hang out here until you hit <enter>");
while(getchar() != '\n');
while(getchar() != '\n');
exit(EXIT_SUCCESS);
}
Este es un sencillo programa que te pregunta cuántos números enteros de asignar, los asigna, se pregunta cuántos de esos números enteros para inicializar, y luego los inicializa. Para una carrera donde se asigno 1250000 enteros e inicializar 500.000 de ellos:
$ ./a.out
fyi: your ints are 4 bytes large
Enter number of ints to malloc: 1250000
Enter number of ints to initialize: 500000
Top reporta la siguiente información:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ SWAP CODE DATA COMMAND
<program start>
11129 xxxxxxx 16 0 3628 408 336 S 0 0.0 0:00.00 3220 4 124 a.out
<allocate 1250000 ints>
11129 xxxxxxx 16 0 8512 476 392 S 0 0.0 0:00.00 8036 4 5008 a.out
<initialize 500000 ints>
11129 xxxxxxx 15 0 8512 2432 396 S 0 0.0 0:00.00 6080 4 5008 a.out
La información relevante es:
DATA CODE RES VIRT
before allocation: 124 4 408 3628
after 5MB allocation: 5008 4 476 8512
after 2MB initialization: 5008 4 2432 8512
Después de que malloc' d 5MB de datos, tanto VIRT como DATA aumentaron en ~ 5MB, pero RES no lo hizo. RES aumentó cuando toqué 2MB de los enteros que asigné, pero DATA y VIRT se mantuvieron igual.
VIRT es la cantidad total de memoria virtual utilizada por el proceso, incluyendo lo que se comparte y what is over-committed. DATA es la cantidad de memoria virtual utilizada que no se comparte y que no es código-texto. Es decir, es la pila virtual y el montón del proceso. RES no es virtual: es una medida de cuánta memoria está usando el proceso en ese momento específico.
Por lo tanto, en su caso, la gran desigualdad CODE + DATA < RES es probable que las bibliotecas compartidas incluidas en el proceso. En mi ejemplo (y el suyo), SHR + CODE + DATA es una aproximación más cercana a RES.
Espero que esto ayude. Hay una gran cantidad de agitar las manos y el vudú asociado con la parte superior y ps. Hay muchos artículos (¿rants?) En línea sobre las discrepancias. Por ejemplo, this y this.
gracias por su explicación! Llegué a la conclusión de que el manual de usuario de ps es inexacto. Pero aquí surgen otras preguntas. Mencionó que DATA es virtual y que RES no lo es. Mi pregunta es si SHR es virtual o no. ¿Por qué SHR aumentó en su programa? ¿por SHR + CODE es una camada más grande que RES si SHR no es virtual? – redhatlinux10
SHR es virtual e incluido en VIRT. RES es solo un recuento de qué parte de la asignación virtual realmente utiliza el proceso en la memoria, excluyendo lo que se intercambia. –
Tu explicación aclara mis dudas, gracias de nuevo. – redhatlinux10