// Cria uma situação de thrashing no Linux (fork + memory bombs)

// Carlos Maziero, DAINF UTFPR 2020

#include <unistd.h>
#include <malloc.h>

// bloco de 16 MB (2^24)
#define BLOCKSIZE 1<<24

int main ()
{
  char *c ;
  int i ;

  while (1)
  {
    // replica este processo indefinidamente
    fork () ;

    // aloca um bloco de memória
    c = (char*) malloc (BLOCKSIZE) ;

    // acessa o bloco recebido, para forçar sua alocação pelo núcleo
    // (que normalmente usa uma estratégia de "lazy allocation")
    if (c)
      for (i=0; i<BLOCKSIZE; i++)
        c[i] = i % 256 ;
    else
      sleep (1) ;
  }
}

