Gerar falhas de página principais

1

É possível gerar falhas de página principais no kernel do Linux à vontade? Um programa pode ser escrito de forma que seja garantido que ele cause uma falha de página principal na sua execução.

    
por deborah-digges 04.03.2015 / 17:51

2 respostas

1

Para produzir falhas de página principais, você precisa forçar leituras do disco. O código a seguir mapeia o arquivo dado na linha de comando, informando ao kernel que ele não precisa dele; se o arquivo for grande o suficiente (escolha um arquivo grande em /usr/bin ), você sempre obterá falhas importantes na página:

#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>

int main(int argc, char ** argv) {
  int fd = open(argv[1], O_RDONLY);
  struct stat stats;
  fstat(fd, &stats);
  posix_fadvise(fd, 0, stats.st_size, POSIX_FADV_DONTNEED);
  char * map = (char *) mmap(NULL, stats.st_size, PROT_READ, MAP_SHARED, fd, 0);
  if (map == MAP_FAILED) {
    perror("Failed to mmap");
    return 1;
  }
  int result = 0;
  int i;
  for (i = 0; i < stats.st_size; i++) {
    result += map[i];
  }
  munmap(map, stats.st_size);
  return result;
}

Não há muito em termos de tratamento de erros, isso é apenas para demonstrar a ideia. No meu sistema,

gcc majorfault.c -o majorfault && /usr/bin/time -v ./majorfault /usr/bin/git-annex

sempre produz 154 falhas de página principais.

    
por 04.03.2015 / 21:01
1

Este programa C faz com que o gráfico de pressão de memória no meu Mac aumente o PDQ:

#include <stdlib.h>

int main(void)
{
    while (1) {
        char* p = malloc(1 * 1024 * 1024 * 1024);
        for (int i = 0; i < 1024; ++i) {
            p[i * 1024 * 1024] = 0;     /* touch the pages */
        }
    }
    return 0;
}

O loop interno é importante. Se você não tocar em pelo menos algumas das páginas de memória alocadas, o subsistema de gerenciamento de memória é inteligente o suficiente para perceber que você está apenas pedindo por uma memória que você nunca usa. Isso pode muito bem ser um detalhe específico de implementação do OS X.

    
por 04.03.2015 / 17:59