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.