domingo, 21 de fevereiro de 2010

Alocação de memória em C - pura falta do que fazer

Falta do que fazer é fogo né? O que leva um cabra desmantelado a digitar trechos de código em C ao invés de aproveitar melhor o dia? Melhor não tentar entender...

Bom o que quis abaixo é ver o que acontece quando você usa uma função malloc do C. A princípio pensei que o simples fato de chamar ela com a quantidade de bytes a alocar já era sufiente para efetivamente ocupá-la (em memória física). Em outras palavras, se eu pedir para alocar 256MB e der um comando "free" no Linux para verificar quanto foi alocado, deveria ter 256MB a mais em "Used" - Mas não é bem isso que acontece....

Vi que o simples fato de chamar ela resulta em alocação de memória virtual (campo VIRT no top). Mas o que efetivamente está alocado em memória física (campo RES no top) ainda é apenas o que seu programa originalmente utilizava antes da malloc.

A utilização efetiva só acontece mesmo a medida que você vai atribuindo valor aos endereços de memória concedidos pelo SO. Para testar, utilizei a função memset após a malloc, inicializando todo o range que foi concedido. Após isso, o comando free relatava a quantia que eu havia pedido para alocar.

Se eu estiver errado quanto ao que conclui, favor comentar o post. Fico agradecido

Abaixo o trecho de código que escrevi para testar o que descrevi:


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

int main(int argc, char *argv[])
{
char *ponteiro_dummy;

// Alocando memoria pra cacete - que tal uns 2GB?!?!? :P
ponteiro_dummy = (char *)malloc(2000000000);

if ( ponteiro_dummy == NULL )
{
printf("Nao foi possivel alocar essa quantidade de memoria - saindo...\n");
exit(1);
}

printf("Nesse ponto a memoria foi apenas reservada (VIRTUAL). De um top/free e comprove\n");
printf("Apos ter feito isso, pressione alguma tecla. Os enderecos serao inicializados com a memset\n");
getchar();

printf("Inicializando os enderecos... Aguarde\n");

memset(ponteiro_dummy, 0, 1999999999);

printf("Aqui a memoria foi efetivamente alocada. Veja pelo top que o RSS esta com quase 2GB \n");
printf("Ao pressionar qualquer tecla, a memoria sera liberada com um free\n");
getchar();

free(ponteiro_dummy);

printf("Pronto. Muito obrigado por alocar memoria SO\n");

exit(0);

}


Nenhum comentário:

Postar um comentário