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

void mi_pause(const char *str);

int main(int arg, char **argv)
{
  int pagesize=sysconf(_SC_PAGE_SIZE);
  int num_pag=10000,i;
  char *buffer;
  time_t t0;
  short d_t=30;
  float d_p=0.1;

  /*Sin reservar memoria*/
  mi_pause("El RSS deberia ser minimo");

  /*Tras reservar memoria*/
  buffer=(char *)malloc(num_pag*pagesize);
  if(!buffer) {
    perror("Error en malloc()");
    exit(EXIT_FAILURE);
  }
  mi_pause("El RSS deberia seguir siendo minimo");

  /*Tras acceder a la memoria*/
  for(i=0;i<num_pag;i++){
    buffer[i*pagesize]=0;
  }
  mi_pause("Ahora deberia ser maximo");

  /*Tras acceder sólo a 10 páginas de memoria durante 30s. mientras otra aplicación accede a mucha memoria*/
  printf("Ahora se esta accediendo al %f%% de las paginas reservadas\n",d_p);
  printf("-- Comprueba el RSS mientras se accede (%hds.) --\n",d_t);
  printf("-- Correr paralelamente un devorador de memoria ayudara --\n");
  t0=time(NULL);
  while(time(NULL)<t0+d_t){
    for(i=0;i<num_pag*d_p;i++){
      buffer[i*pagesize]=0;
    }
  }

  /*Tras liberar memoria*/
  free(buffer);
  mi_pause("Ahora deberia volver a ser minimo");

  exit(EXIT_SUCCESS);
}

void mi_pause(const char *str)
{
  if(str)
    printf("%s\n",str);

  printf("-- Comprueba el RSS y dale a intro --\n");
  getchar();
}

