Obtento a memória usada pelo programa em C, no linux

Agora tenho um desktop de ultima geração, um AMD FX 8320 (8×3.5Ghz) com 16 GB de memória, è estou pensando em uma maneira de justificar todo esse exagero (essa vai ser difícil); pois bem fui fazer um teste para ver quanto tempo demorava para somar um array de 10.000.000 de double’s, fiquei um tanto impressionado pois meu processador achou essa somatória no mínimo ridícula eis, a prova.

 

tempoExecucao

0.308 ms, ao menos pra mim isto é bem rápido, depois disso fiquei curioso para saber o quanto de memória estava sendo utilizada pelo programa, depois de algumas pesquisas na internet, descobri que o jeito mais confiável de fazer é através do /proc/[pid]/status, ele de ta diversas informações sobre o processo.

por exemplo, meu firefox bolinador de memória com uma aba aberta (a que estou escrevendo este post) está levando 1 GB de memória virtual, VmRSS em 260Mb (266300 Kb)

Firefox bulinador de memória

Firefox bolinador de memória

Como podem ver pelo VmSize (Memória Virtual), o FF está com 1GB (1066440 Kb).

VmSize:
Virtual memory size
This is the virtual memory usage of the entire process. It is the sum of VmLib, VmExe, VmData, and VmStk.

Googlando sobre o assunto, vi uma forma de fazer o parse deste arquivo e obter a memória utilizada pelo programa, o autor usou a função para gerar um gráfico da memória utilizada pelo programa durante sua execução, eu como simples mortal só queria exibir a memória utilizada pelo mesmo, então simplifiquei muito o que ele fez.

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


#define M_ARRAY_SIZE 10000000

double a[M_ARRAY_SIZE];
double b[M_ARRAY_SIZE];
double c[M_ARRAY_SIZE];

void print_vm_size()
{
	int len = 128;
	char *line;
	char pid_status[256];
	char *vmsize;
	FILE *f;
	vmsize = NULL;
 	line = malloc(128);
	pid_t myId = getpid();

	sprintf(pid_status,"/proc/%d/status",myId);
	printf("%s\n",pid_status);

	f = fopen(pid_status, "r");
	if (!f) return 1;

	while (!vmsize)
	{
		if (getline(&amp;line, &amp;len, f) == -1)
		{
			/* Some of the information isn't there, die */
			printf("xiii\n");
			return 1;
		}

		/* Find VmSize */
		if (!strncmp(line, "VmSize:", 7))
		{
			vmsize = strdup(&amp;line[7]);
		}
	}
	free(line);
	fclose(f);

	/* Get rid of " kB\n"*/
	len = strlen(vmsize);
	vmsize[len - 4] = 0;

	/* Output results to stderr */
	printf("VmSize: %s Kb\n",vmsize);

	free(vmsize);

	/* Success */
	return 0;

}

int main(int argc,char **argv)
{

int i = 0;
print_vm_size();
for(i = 0; i &lt; M_ARRAY_SIZE;i++)
	a[i] = 0;

for (i = 0;i &lt; M_ARRAY_SIZE;i++)
	b[i] = rand() % M_ARRAY_SIZE;

for (i = 0;i &lt; M_ARRAY_SIZE;i++)
	c[i] = a[i] + b[i];

//sleep(120);

return 0;
}

como podem ver na primeira imagem o programa utilizou 233Mb de memória (238708Kb).

Somando-se os 3 arrays de double temos:

 3*8*10000000 = 240000000
240000000 / (1024*1024) = 228Mb.

Espero que esse código lhe seja útil.

baseado no artigo: http://locklessinc.com/articles/memory_usage/

Posted in Uncategorized Tagged with:

Leave a Reply