A. Ejercitador de memoria

El siguiente programa permite ejercitar la memoria f�sica (y el swap con los valores adecuados) con el fin de aprender a observar la paginaci�n (con vmstat):

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

int main(int argc,char **argv)
{
char *ptr;
unsigned long z,k,r;
unsigned long pag,off;
unsigned char x;
unsigned long r1,r2,r3,r4;
if(argc!=3)
	{
	fprintf(stderr,"Use ram_stress <#KB> <#repeticiones>\n");
	return 2;
	}
k=atoi(argv[1]);
r=atol(argv[2]);
if(k<1 || r<1)
	{
	fprintf(stderr,"Se requiere valor positivo de KB y repeticiones\n");
	return 1;
	}
ptr=malloc(1024L*k);
if(ptr==NULL)
	{
	fprintf(stderr,"malloc error: falta memoria?\n");
	return 1;
	}
for(z=0;z<r;z++)
	{
	r1=rand(); r2=rand(); r3=rand(); r4=rand();
	pag=labs(r1*r2)%k;
	off=r3%1024;
	x=r4%256;
	ptr[1024*pag+off]=x;
	}
free(ptr);
return 0;
}
Por ejemplo, para un sistema de 512Mb, el siguiente comando obliga a utilizar aproximadamente 50Mb para pruebas (el segundo argumento es el n�mero de "pruebas" y debe ajustarse gradualmente dependiendo de la duraci�n deseada del test.)
$ time ./ram_stress 50000 1200000

real    0m0.842s
user    0m0.670s
sys     0m0.151s
En mi sistema (Athlon XP-2000) este comando tarda menos de un segundo en completarse. En cambio, si se reserva m�s memoria (a�n manteniendo el n�mero de pruebas, es decir, haciendo el mismo trabajo) el tiempo se eleva a m�s de 1 minuto debido a que se ingresa al r�gimen de carencia de memoria:
$ time ./ram_stress 500000 1200000

real    1m9.893s
user    0m1.027s
sys     0m1.896s
Ud. deber�a hacer estas pruebas con diferentes valores para el bloque de memoria. Observar� c�mo la paginaci�n se hace cada vez m�s pronunciada conforme solicitamos un bloque que se acerca cada vez m�s a la memoria f�sica instalada.