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