[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: VSZ vs RSS



Denis escreveu:
Alguem pode me explicar a diferença real entre vsz e rss?
É o programa que está em execução que estima o valor de VSZ?
Quando um programa aloca uma qtd de memória, esta qtdd é VSZ ou RSS ?
qdo um programa desaloca a qtd de memória, ela deveria sersubtraida
imediatamente observando um ps aux?

Olá,

VSZ é virtual, ou seja, quando um programa requisita ao SO uma certa quantidade de memória, ele registra esse fato mas não a aloca na memória real. Quanto o programa fizer uma escrita, aí sim o SO vai alocar na memória real, mas por páginas, visando não alocar todo o requerido quando é escrito apenas um byte. Veja que quem faz todo o trabalho com a memória é o SO, que no caso o Linux, faz paginação de forma a aproveitar melhor a memória e já faz a tradução de endereço eficiente entre o programa e a memória real, assim, não se preocupe com a memória não usada em VSZ, mas cuide bem da RSS.

      Para que fique claro e exemplificado melhor, vai o resultado:

$ gcc -Wall memoria.c -o memoria && ./memoria

Requerido 10MB de memória!
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
500      10534  0.0  0.4  2908 1684 pts/7    S    12:52   0:00 /bin/bash
500      11454  1.0  0.3 12592 1360 pts/7    S    13:36   0:00 ./memoria
500      11455 13.0  0.2  2848  980 pts/7    R    13:36   0:00 ps u

Requerido 10MB de memória!
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
500      10534  0.0  0.4  2908 1684 pts/7    S    12:52   0:00 /bin/bash
500      11454  1.0  0.3 22836 1364 pts/7    S    13:36   0:00 ./memoria
500      11456  0.0  0.2  2848  980 pts/7    R    13:36   0:00 ps u

Requerido 10MB de memória!
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
500      10534  0.0  0.4  2908 1684 pts/7    S    12:52   0:00 /bin/bash
500      11454  1.0  0.3 33080 1368 pts/7    S    13:36   0:00 ./memoria
500      11457  0.0  0.2  2848  980 pts/7    R    13:36   0:00 ps u

Requerido 10MB de memória!
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
500      10534  0.0  0.4  2908 1684 pts/7    S    12:52   0:00 /bin/bash
500      11454  1.0  0.3 43324 1372 pts/7    S    13:36   0:00 ./memoria
500      11458  0.0  0.2  2848  980 pts/7    R    13:36   0:00 ps u

Escrito na posição de 1MB da última alocação!
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
500      10534  0.0  0.4  2908 1684 pts/7    S    12:52   0:00 /bin/bash
500      11454  1.0  0.3 43324 1376 pts/7    S    13:36   0:00 ./memoria
500      11459  0.0  0.2  2848  980 pts/7    R    13:36   0:00 ps u

Escrito na posição de 10MB da última alocação!
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
500      10534  0.0  0.4  2908 1684 pts/7    S    12:52   0:00 /bin/bash
500      11454  0.5  0.3 43324 1380 pts/7    S    13:36   0:00 ./memoria
500      11460 14.0  0.2  2848  980 pts/7    R    13:36   0:00 ps u

Zerando os primeiros 1MB da última alocação!
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
500      10534  0.0  0.4  2908 1684 pts/7    S    12:52   0:00 /bin/bash
500      11454  0.5  0.6 43324 2400 pts/7    S    13:36   0:00 ./memoria
500      11461  0.0  0.2  2848  980 pts/7    R    13:36   0:00 ps u

Zerando os últimos 1MB da última alocação!
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
500      10534  0.0  0.4  2908 1684 pts/7    S    12:52   0:00 /bin/bash
500      11454  0.5  0.8 43324 3424 pts/7    S    13:36   0:00 ./memoria
500      11462  0.0  0.2  2848  980 pts/7    R    13:36   0:00 ps u

Lendo 1MB no meio da última alocação!
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
500      10534  0.0  0.4  2908 1684 pts/7    S    12:52   0:00 /bin/bash
500      11454  0.5  0.8 43324 3424 pts/7    S    13:36   0:00 ./memoria
500      11463  0.0  0.2  2848  980 pts/7    R    13:36   0:00 ps u

Zerando a última alocação!
USER       PID %CPU %MEM   VSZ   RSS TTY     STAT START   TIME COMMAND
500      10534  0.0  0.4  2908  1684 pts/7   S    12:52   0:00 /bin/bash
500      11454  2.0  3.0 43324 11612 pts/7   S    13:36   0:00 ./memoria
500      11464  0.0  0.2  2848   980 pts/7   R    13:36   0:00 ps u

Liberando a última alocação!
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
500      10534  0.0  0.4  2908 1684 pts/7    S    12:52   0:00 /bin/bash
500      11454  2.5  0.3 33080 1368 pts/7    S    13:36   0:00 ./memoria
500      11465  0.0  0.2  2848  980 pts/7    R    13:36   0:00 ps u



O código é esse:


#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MB 1024*1024

int main(int argc, char* argv[]){
 char *teste;
 char temp[MB];
 bzero(temp, MB);

 printf("\nRequerido 10MB de memória!\n");
 teste = (char*)malloc(10*MB);
 system("ps u");

 printf("\nRequerido 10MB de memória!\n");
 teste = (char*)malloc(10*MB);
 system("ps u");

 printf("\nRequerido 10MB de memória!\n");
 teste = (char*)malloc(10*MB);
 system("ps u");

 printf("\nRequerido 10MB de memória!\n");
 teste = (char*)malloc(10*MB);
 system("ps u");

 printf("\nEscrito na posição de 1MB da última alocação!\n");
 teste[MB-1] = 'X';
 system("ps u");

 printf("\nEscrito na posição de 10MB da última alocação!\n");
 teste[10*MB-1] = 'Y';
 system("ps u");

 printf("\nZerando os primeiros 1MB da última alocação!\n");
 bzero(teste, MB);
 system("ps u");

 printf("\nZerando os últimos 1MB da última alocação!\n");
 bzero(teste+9*MB, MB);
 system("ps u");

 printf("\nLendo 1MB no meio da última alocação!\n");
 memcpy(temp, teste+4*MB, MB);
 system("ps u");

 printf("\nZerando a última alocação!\n");
 bzero(teste, 10*MB);
 system("ps u");

 printf("\nLiberando a última alocação!\n");
 free(teste);
 system("ps u");

 return 0;
}





--
Atenciosamente,

Junior Polegato

Um peregrino de problemas; Um pergaminho de soluções!
Página Profissional: http://www.juniorpolegato.com.br


Reply to: